ffmpeg直播加水印、拉流等任务

2024-02-09 01:32

本文主要是介绍ffmpeg直播加水印、拉流等任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 直播流加水印

ffmpeg -i  https://outbound-production.explore.org/stream-production-319/.m3u8  -vf "movie=black_water.png[watermark]; [in][watermark] overlay=main_w-overlay_w-20:main_h-overlay_h-10 [out]" -c:v libx264 -c:a copy -f flv "rtmp://livepush.gonature.cn/live/qwee?txSecret=39a51cfacc1d5d93216add5b5e0a017e&txTime=60DD7A3B"

 定时任务拉流并保存MP4文件

const ffmpeg = require('fluent-ffmpeg')
const config = require('./live_catch_tasks.json')
const fs = require('fs')
ffmpeg.setFfmpegPath('/usr/local/ffmpeg/bin/ffmpeg')  // /Users/bin/Downloads/ffmpeg 本机
const oneDay = 86400000
const tasks = {}  // 正在执行的任务
const checkAndRun = async function(){console.log('check and run task...', new Date())// 遍历任务列表for(let i in config.tasks){const task = config.tasks[i]const now = new Date()// 取当前时间,格式如 00:00 const time = ('0'+now.getHours()).slice(-2) + ':' + ('0'+now.getMinutes()).slice(-2)const exists = fs.existsSync(config.storeDir + task.saveAs)let overwrite = falseif(exists){const filestat = fs.statSync(config.storeDir + task.saveAs) // console.log('now:',now.getDay(),time,filestat.mtimeMs)if((now.getTime() - filestat.mtimeMs) > oneDay){overwrite = true}}// console.log(now.getDay() === task.weekDay,time >= task.startTime,(!exists || (exists && overwrite)))if(!tasks[task.name] && now.getDay() === task.weekDay  // 判断是否为当天任务&& time >= task.startTime                          // 判断是否已到任务开始时间&& (!exists || (exists && overwrite))){            // 判断文件是否已存在 或 上一次更新时间距现在是否大于24小时((t)=> {tasks[t.name] = {id: t.id,name: t.name,saveAs: t.saveAs,status: null}// 创建 ffmpeg 任务tasks[t.name].process = ffmpeg(task.source)// .videoBitrate(1000).addOptions(t.ffmpegOptions).on('error', function(err, stdout, stderr) {console.error('record live error: ' + err.message)tasks[t.name].status = 'Error'}).on("start", function (commandLine) {console.log(commandLine) tasks[t.name].status = 'Going'}).on("end", function () {// console.log('push over.') delete tasks[t.name]}).save(config.storeDir + t.saveAs)})(task)}}
}
// 格式化输出到控制台
function log(){const list = Object.values(tasks).map(i=>{return { id: i.id, name: i.name, status: i.status || '', saveAs: i.saveAs}})list.sort((a,b)=> a.id - b.id )console.table(list)
}
function run(){checkAndRun()                    // 首次立即执行setInterval(checkAndRun, 30000)  // 每 30 秒检查一次setInterval(log, 5000)           // 日志每 5 秒输出一次
}
run()/*
const cmd = ffmpeg('/Users/bin/Downloads/movies/心火/Firelight.1997.1080p.WEBRip.x264-RARBG.mp4')
// .duration(60)
// .loop(10)
// .seekInput(834.5) // set start time
.videoBitrate(1000)
// .noAudio()
.addOptions(['-vcodec copy','-acodec copy','-bsf:a aac_adtstoasc']
)
// .output('/Users/bin/Downloads/outputfile.mp4')
// .output('rtmp://livepush.gonature.cn/live/live1?txSecret=d6f5ab25a7f845391b7b58dd274ef19e&txTime=858C3C88')
.on('error', function(err, stdout, stderr) {console.log('Cannot process video: ' + err.message);
})
.on('end', function() {console.log('Processing finished !');
})
.format("flv")
.output('rtmp://livepush.gonature.cn/live/live1?txSecret=d6f5ab25a7f845391b7b58dd274ef19e&txTime=858C3C88', {end: true
})
.on("start", function (commandLine) {console.log("pushing......") //开始推流
})
.on("error", function (err, stdout, stderr) {console.log('push error:', err) //推流失败
})
.on("end", function () {console.log('push over.') //推流结束
});cmd.run();
//.save('/Users/bin/Downloads/outputfile.mp4');
*/

node方式拉流推流并加水印

 var ffmpeg = require('fluent-ffmpeg');const command = ffmpeg('https://outbound-production.explore.org/stream-production-319/.m3u8').videoFilters("movie=black_water.png[watermark]; [in][watermark] overlay=main_w-overlay_w-20:main_h-overlay_h-10 [out]").addOptions(["-vcodec libx264","-preset ultrafast","-acodec aac"]).format("flv").output('rtmp://livepush.gonature.cn/live/qwee?txSecret=39a51cfacc1d5d93216add5b5e0a017e&txTime=60DD7A3B', {end: true}).on("start", function (commandLine) {console.log("commandLine: " + commandLine);}).on("error", function (err, stdout, stderr) {console.log("commandLine: " + '失败');}).on("end", function () {});command.run()

使用process_argv传递参数,执行固定的ID之间的任务

启动方式:

node manage.js 1 3
任务id 1-3,包含1和3

const ffmpeg = require('fluent-ffmpeg')
const config = require('./live_push_tasks.json')
const fs = require('fs')
// ffmpeg.setFfmpegPath('/usr/local/ffmpeg/bin/ffmpeg')  // /Users/bin/Downloads/ffmpeg 本机
const oneDay = 86400000
const tasks = {}  // 正在执行的任务
let begin = 1 // 开始初始值
let end = 100 // 结束初始值
process.argv.forEach(function(val, index, array) {console.log(index + ': ' + val);if (index === 2) {begin = val}if (index === 3) {end = val}
});
const checkAndRun = async function(){console.log('check and run task...', new Date())// 遍历任务列表for(let i in config.tasks){const task = config.tasks[i]const now = new Date()// console.log(now.getDay() === task.weekDay,time >= task.startTime,(!exists || (exists && overwrite)))if(!tasks[task.name] && begin <=task.id && end>=task.id){            // 判断文件是否已存在 或 上一次更新时间距现在是否大于24小时((t)=> {tasks[t.name] = {id: t.id,name: t.name,saveAs: t.saveAs,status: null}// 创建 ffmpeg 任务tasks[t.name].process = ffmpeg('https://outbound-production.explore.org/stream-production-'+task.source+'/.m3u8').videoFilters("movie=black_water.png[watermark]; [in][watermark] overlay=main_w-overlay_w-20:main_h-overlay_h-10 [out]").addOptions(["-vcodec libx264","-preset ultrafast","-acodec aac"]).format("flv").output(task.output, {end: true}).on("start", function (commandLine) {console.log(commandLine)tasks[t.name].status = 'Going'}).on("error", function (err, stdout, stderr) {console.error('record live error: ' + err.message)tasks[t.name].status = 'Error'}).on("end", function () {delete tasks[t.name]}).run();})(task)}}
}
// 格式化输出到控制台
function log(){const list = Object.values(tasks).map(i=>{return { id: i.id, name: i.name, status: i.status || ''}})list.sort((a,b)=> a.id - b.id )console.table(list)
}
function run(){checkAndRun()                    // 首次立即执行setInterval(checkAndRun, 30000)  // 每 30 秒检查一次setInterval(log, 5000)           // 日志每 5 秒输出一次
}
run()

添加码率

const ffmpeg = require('fluent-ffmpeg')
const config = require('./live_push_tasks.json')
const fs = require('fs')
// ffmpeg.setFfmpegPath('/usr/local/ffmpeg/bin/ffmpeg')  // /Users/bin/Downloads/ffmpeg 本机
const oneDay = 86400000
const tasks = {}  // 正在执行的任务
let begin = 1 // 开始初始值
let end = 100 // 结束初始值
process.argv.forEach(function(val, index, array) {console.log(index + ': ' + val);if (index === 2) {begin = val}if (index === 3) {end = val}
});
const checkAndRun = async function(){console.log('check and run task...', new Date())// 遍历任务列表for(let i in config.tasks){const task = config.tasks[i]const now = new Date()// console.log(now.getDay() === task.weekDay,time >= task.startTime,(!exists || (exists && overwrite)))if(!tasks[task.name] && begin <=task.id && end>=task.id){            // 判断文件是否已存在 或 上一次更新时间距现在是否大于24小时((t)=> {tasks[t.name] = {id: t.id,name: t.name,saveAs: t.saveAs,status: null}// 创建 ffmpeg 任务tasks[t.name].process = ffmpeg('https://outbound-production.explore.org/stream-production-'+task.source+'/.m3u8').videoFilters("movie=black_water.png[watermark]; [in][watermark] overlay=main_w-overlay_w-20:main_h-overlay_h-10 [out]").addOptions(["-vcodec libx264","-preset ultrafast","-acodec aac","-video_size 1920x1080"]).videoBitrate('3072k').format("flv").output(task.output, {end: true}).on("start", function (commandLine) {console.log(commandLine)tasks[t.name].status = 'Going'}).on("error", function (err, stdout, stderr) {console.error('record live error: ' + err.message)tasks[t.name].status = 'Error'}).on("end", function () {delete tasks[t.name]}).run();})(task)}}
}
// 格式化输出到控制台
function log(){const list = Object.values(tasks).map(i=>{return { id: i.id, name: i.name, status: i.status || ''}})list.sort((a,b)=> a.id - b.id )console.table(list)
}
function run(){checkAndRun()                    // 首次立即执行setInterval(checkAndRun, 30000)  // 每 30 秒检查一次setInterval(log, 5000)           // 日志每 5 秒输出一次
}
run()

这篇关于ffmpeg直播加水印、拉流等任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692773

相关文章

如何设置windows计划任务

如何设置windows计划任务 前言:在工作过程中写了一个python脚本,用于调用jira接口查询bug单数量,想要在本地定时任务执行,每天发送到钉钉群提醒,写下操作步骤用于记录。 1. 准备 Python 脚本 确保你的 Python 脚本已经保存到一个文件,比如 jira_reminder.py。 2. 创建批处理文件 为了方便任务计划程序运行 Python 脚本,创建一个批处理文

基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结

最近刚刚接触XILINX的ZYNQ板,刚接触没有十天。XILINX定位它为SOC,我也很认同,起码比TI定位MPU为SOC强很多。据说今年TI的最新产品也加入了ZYNQ板。 之前的MIPS处理器设计与实现的项目就算做告一段落,搞了将近7个月,成果显著,收获颇多,最近打算搞搞ZYNQ。 之前MIPS也有一套交叉编译工具,不过是老师提供的,自己也尝试搞了搞,太辛苦了,而且也没什么成果,因为我

linux cron /etc/crontab 及 /var/spool/cron/$USER 中定义定时任务

简介 定时任务在linux上主要体现在两个地方,一个是/etc/crontab ,另一个就是定义了任务计划的用户/var/spool/cron/$USER 1、crontab -e 或者直接编辑/etc/crontab文件,这种方式用的人比较多,/etc/crontab是系统调度的配置文件,只有root用户可以使用,使用时需root权限,而且必须指定运行用户,才会执行 * * * * * *

FFmpeg源码:ff_ctz / ff_ctz_c函数分析

一、ff_ctz函数的作用 ff_ctz定义在FFmpeg源码目录的libavutil/intmath.h 下: #ifndef ff_ctz#define ff_ctz ff_ctz_c/*** Trailing zero bit count.** @param v input value. If v is 0, the result is undefined.* @return

任务5.1 初识Spark Streaming

实战概述:使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架,用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统,能够处理流式数据并统计文本中的单词出现频率。 2. 技术要点 Spark Streaming集成: 与Spark生态的其他组件如Spark SQL、ML

【FreeRTOS】任务管理与调度

文章目录 调度:总结 调度: 相同优先级的任务轮流运行最高优先级的任务先运行 可以得出结论如下: a 高优先级的任务在运行,未执行完,更低优先级的任务无法运行b 一旦高优先级任务就绪,它会马上运行(假设厨房着火了,会马上去灭火)c 如果最高优先级的任务有多个,他们轮流运行 他们都是使用链表进行管理 打开CubeMX,最高优先级56 56个List, Rad

biostar handbook: 第五周笔记汇总+第六周任务布置

简单总结下第五周的笔记: biostarhandbook(五)|序列从何而来和质量控制YXF-测序仪和质量控制Biostar学习笔记(5)测序平台、测序原理及质量控制Biostar第六课 测序仪和QC 顺便发布第六周的任务: 第六周的任务是第十章和第十一章。其中第十一章介绍的是序列模式,是对正则表达式的温故知新。第十一章则是开始序列分析的重要一步:序列联配。任务如下: 什么是正则表达式什么

biostar handbook: 第四周笔记汇总+第五周任务布置

不知不觉已经过去了四周,这个系列的开篇语写于2017年10月14日,距离今天差不多是一个月的时间了。这个月的时间学的内容并不算多,大致也就是如下几个内容: *nux基础: 这个尤为重要,学会了*nix(Linux或unix)之后,如果能够在日常科研生活中进行使用,那么你的效率将会大大提高。数据格式: 数据的保存具有一定的格式,处理数据的前提在于知己知彼,这样才能选择合适的工具。这个部分内容包括知

biostar handbook: 第三周笔记汇总+第四周任务布置

就目前来看,这一周主要以补交上次作业为主,所以上一周的总结增加了很多新内容。但是关于本体论和富集分析,大家还是有点小困难。当然我自己交东西也慢了很多,因为时间也总是不太够,完全靠周末挤出来。 第三周笔记汇总如下 Biostar学习笔记(3)Gene set analysis related topics.本体论biostarhandboo(四)|本体论和功能分析基因本体论 第四周作业发布