node调用ffmpeg转流

ffmpeg始终是音视频领域绕不过去的一个坎,也是一个特别好的工具。虽然再node库里面有根据ffmpeg编译的库,比如 libav.js和fluent-ffmpeg之类,但是调用原生的ffmpeg应用也是一种方法。

这边先上代码再详解(H264转FLV)

 function DecodeH264ByteToFlv(){
        //ffmpeg -r 30 -i .\android.264 -c:v libx264 -vcodec copy 'C.flv'
        ffmpeg = spawn('ffmpeg', [
            '-r', '30',
            '-i', '-',
            '-c:v',
            'libx264',
            '-vcodec', 'copy',
            '-f', 'flv',
            // 'abc.flv'
            'pipe:1'
        ])
        ffmpeg.stdin.on('error', (e) => {
            console.log('FFmpeg STDIN Error', e);
          });
          
        // FFmpeg outputs all of its messages to STDERR.  Let's log them to the console.
        ffmpeg.stderr.on('data', (data) => {
            console.log('FFmpeg STDERR:', data.toString());
        });

        ffmpeg.stdout.on('data', (data)=>{
        //output flv stream
            console.log(data)                         
        });
    }

代码对应的原始命令行应该是

ffmpeg -r 30 -i - -c:v libx264 -vcodec copy -f flv pipe:1

其中,输入内容为-i所对应的参数,如果是文件,可以用 “-i test.h264”这样的方法。此处我需要输入实时H264数据流,因此通过 "-i -",将数据流通过:

ffmpeg.stdin.write(chunk)

将每一个chunk输入到ffmpeg中。

同样的,输出文件可以是 "-o output.flv"或者直接写在参数最后。此处我需要实时获取实时转换的FLV流,因此通过 'pipe:1'将参数通过pipe传出。这样当生成了FLV数据流时,就能够通过stdout传出来,即代码中的最后一段。

不过具体再应用时,最好需要先将这个函数执行起来,否则实时性挺差的。

猜你喜欢

转载自blog.csdn.net/u013379032/article/details/124809353