Nodejs + FFmpeg 直播推流小改三版

历史纪录

更新内容

  • 使用 concat 资源列表替代普通文件输入流,将多个视频合并到同个流中推送,防止断流。

注意事项

  • 要求同一个 concat 列表中的视频文件格式、编码、尺寸相同,否则视频间切换时虽然不断流但会出现奇怪的现象。
  • 本文代码继承上个版本特点,自动读取目标文件夹中的视频文件,然后顺序随机生成一个 concat.txt 列表文件,不需要手动编写列表。
  • 同样建议配合 pm2 进程守护使用。

Nodejs 代码

var fs = require('fs');
var sd = require('silly-datetime');
var ffmpeg = require('fluent-ffmpeg');
var D = './video2/';
var L = './pic/tips2.png';
var R = 'rtmp://txy.live-send.acg.tv/live-txy/';
var C = '?streamname=live_0000000_1111111&key=1f8a9f1h8j8q4h5x6i5s6f8n1z2i3dq7';
var O = '';

function showTime() {
    return sd.format(new Date(), 'YYYY-MM-DD HH:mm');
}

function randomV() { 
    return 0.5 - Math.random(); 
}

function liveON(inputPath) {
    var outputPath = (O == '' ? (R + C) : O);
    ffmpeg(inputPath)
        .inputOptions('-re')
        .inputOptions('-ac 2')
        .inputOptions('-f concat')
        .inputOptions('-safe 0')
        .addInput(L)
        .complexFilter([{
            filter: 'scale',
            options: [1280, -1],
            inputs: '[0:v]',
            outputs: 'video'
        }, {
            filter: 'scale',
            options: [220, -1],
            inputs: '[1:v]',
            outputs: 'logo'
        }, {
            filter: 'overlay',
            options: {
                x: 'main_w-overlay_w-15',
                y: 15
            },
            inputs: ['video', 'logo']
        }])
        .on('start', function(commandLine) {
            console.log('[' + showTime() + '] Vedio is Pushing !');
            console.log('[' + showTime() + '] Spawned Ffmpeg with command !');
            console.log('[' + showTime() + '] Command: ' + commandLine);
        })
        .on('error', function(err, stdout, stderr) {
            console.log('error: ' + err.message);
            console.log('stdout: ' + stdout);
            console.log('stderr: ' + stderr);
        })
        .on('end', function() {
            console.log('[' + showTime() + '] Vedio Pushing is Finished !');
        })
        .addOptions([
            '-vcodec libx264',
            '-preset veryfast',
            '-crf 22',
            '-maxrate 1000k',//1000k
            '-bufsize 3000k',
            '-acodec libmp3lame',
            '-ac 2',
            '-ar 44100',
            '-b:a 96k'
        ])
        .format('flv')
        .output(outputPath, {
            end: true
        })
        .run();
}

function start() {
    var V = fs.readdirSync(D).sort(randomV);
    var N = V.length;
    var concat = '';
    console.log('[' + showTime() + '] Find ' + N + ' Video Files !');
    for(var i = 0; i < N; i++) {
        concat += "file '" + D + V[i] + "'" + (i == N-1 ? "" : "\r\n");
    }
    fs.writeFile('concat.txt', concat, (err) => {
      if (err) throw err;
      liveON("concat.txt");
    });
}

start();

截至发文,该代码已在腾讯云不间断运行超过一个月 ---> http://live.bilibili.com/64285

标签: none

已有 33 条评论

  1. 股票下单软件排名 股票下单软件排名

    我很怀念朝气蓬勃的青春时代,它让我能尽情地在蓝天上描绘云朵的精彩。但光阴似箭,流年似水,生命终会有垂暮之时。我真的好想在不多的时间里,努力在蓝色的天空上描绘出晚霞的壮美!

    1. 请开始你的表演~~

  2. 自动交易软件 自动交易软件

    蓝色,是伴随着腥咸的海风,伴随着起伏的波涛、孤寂的帆影,伴随着一轮喷薄而出的红日走进了我童年憧憬的眼眸,从此,就牢牢地驻扎在了心底。

    1. 忧郁的蓝吗,真是个有故事的人呢。

  3. 量化交易平台 量化交易平台

    七月会有很多很多新鲜的人与事,但它总有一些特定的环境才促使发生,开心或者悲伤,有时我们都会因环境所影响!而不管怎么样,慢慢去习惯,当下次所遇到时,你所面对的心态会不一样,既然不能马上适应,但至少你可以保持笑容,就像n女孩那样!(

    1. 现在是八月,而且马上就九月了,朋友!

  4. 股票自动交易软件加盟 股票自动交易软件加盟

    生活难免会遇到不愉快的事情,请相信这个世界上总有一些人会笑口常开的面对所发生的事情,比如n女孩就是这样的一位!无论工作琐事也好生活琐事也罢,她总能坦然面对,笑口常开!那对于你来说你又会是怎样的面对着呢!

  5. 程序化交易系统 程序化交易系统

    七月的艳阳天总是那么火辣,唯独早上那几个小时与晚饭后那段时间会舒爽些!工作中跑里跑外,满头大汗,累的不想动,面无表情!有时笑不起来,有时勉强的微微一笑,但却是值得!曾有人说过:努力了不一定会有收获,但是不努力就一定不会有收获!

    1. 那干嘛不舒舒服服睡一觉再说呢

  6. hook hook

    博主你好我有一台阿里云服务器centos7.3能不搭建一个这样的环境,我已经试了三天了,都能不了nodejs和npm和ffmpeg和模块等。求给出详细的教程!

    1. 其实很简单啊,nodejs、npm、ffmpeg等甚至都不用安装的,下载二进制文件后用ln链接到环境变量中就好了,至于详细教程,我抽空做吧つ﹏⊂

      1. hook hook

        ffmpeg的安装需要安装x264等解码吗?直接安装目录有要求吗?

        1. 这个看您的需求了,我这里纯折腾,ffmpeg没有编译,直接用的二进制文件,至于安装目录,只要配到环境变量中,能任意目录执行即可。

          1. hook hook

            我还没有找到解决的问题,crf的问题还是没找到,我哪个发错了,我写的是小写。依然说找不到crf参数,至此我又不会改代码,所以不敢轻易改动,还有就是我也换过其他版本的ffmpeg3.2.7依旧是同样的问题!会不会是服务器端口被占用或者没打开?

            1. 注释掉代码中crf那一行

          2. [root@admin node_modules]# node my.js
            [2017-08-24 15:08] Find 2 Video Files !
            [2017-08-24 15:08] Vedio is Pushing !
            [2017-08-24 15:08] Spawned Ffmpeg with command !
            [2017-08-24 15:08] Command: ffmpeg -re -ac 2 -f concat -safe 0 -i concat.txt -i /pic/tips2.png -y -filter_complex [0:v]scale=1280:-1[video];[1:v]scale=220:-1[logo];[video][logo]overlay=x=main_w-overlay_w-15:y=15 -vcodec libx264 -preset veryfast -CRF 22 -maxrate 1000k -bufsize 3000k -acodec libmp3lame -ac 2 -ar 44100 -b:a 96k -f flv mv1.mp4
            error: ffmpeg exited with code 1: Unrecognized option 'CRF'.
            Error splitting the argument list: Option not found
            这一步。卡主了。还有修改了你的代码,./video2我改成不带点

            1. 视频文件能读出来,命令行也可以打印,到这一步表明nodejs已经没问题了,这里是ffmpeg参数报错,我的代码中“crf”是小写,您的这个报错是大写“CRF”,请检查一下代码有咩问题,或者查一下ffmpeg文档看是否是新版本取消或变更了参数。

          3. 运行node.js出现这个了
            Unrecognized option 'crf'.
            Error splitting the argument list: Option not found

          4. 正常js[root@admin ~]# node
            > console.log("Hello World");
            Hello World
            undefined
            >

            运行出现问题,

            fs.js:856
            return binding.readdir(pathModule._makeLong(path));
            ^

            Error: ENOENT: no such file or directory, scandir './video2/'
            at Error (native)
            at Object.fs.readdirSync (fs.js:856:18)
            at liveON (/usr/local/lib/my.js:14:16)
            at Object. (/usr/local/lib/my.js:74:1)
            at Module._compile (module.js:425:26)
            at Object.Module._extensions..js (module.js:432:10)
            at Module.load (module.js:356:32)
            at Function.Module._load (module.js:311:12)
            at Function.Module.runMain (module.js:457:10)
            at startup (node.js:136:18)

  7. 居然看到了更新

  8. 待我等会试试

    1. 你这是发生了什么,突然变成默认主题了

      1. 默认主题~ 好看啊~

        1. 试试Quark,那主题挺小的(我才不会说不到15KB呢,滑稽)

          1. 本地测试过那个~ 确实也很棒~

  9. 懒die的站长更新啦~

  10. 香菇终于更新辣~

  11. 香菇终于更新辣~

  12. N年前 还捣鼓过FFmpeg 不过CSDN上一个捣鼓FFmpeg 博主已经挂了~~

    1. 喔 第一篇里提到过

  13. Kay Kay

    沙发!

添加新评论