ffmpeg始终是音视频领域绕不过去的一个坎,也是一个特别好的工具。虽然再node库里面有根据ffmpeg编译的库,比如 和fluent-ffmpeg之类,但是调用原生的ffmpeg应用也是一种方法。
这边先上代码再详解(H264转FLV)
function DecodeH264ByteToFlv(){
//ffmpeg -r 30 -i .\android.264 -c:v libx264 -vcodec copy ''
ffmpeg = spawn('ffmpeg', [
'-r', '30',
'-i', '-',
'-c:v',
'libx264',
'-vcodec', 'copy',
'-f', 'flv',
// ''
'pipe:1'
])
('error', (e) => {
('FFmpeg STDIN Error', e);
});
// FFmpeg outputs all of its messages to STDERR. Let's log them to the console.
('data', (data) => {
('FFmpeg STDERR:', ());
});
('data', (data)=>{
//output flv stream
(data)
});
}
代码对应的原始命令行应该是
ffmpeg -r 30 -i - -c:v libx264 -vcodec copy -f flv pipe:1
其中,输入内容为-i所对应的参数,如果是文件,可以用 “-i test.h264”这样的方法。此处我需要输入实时H264数据流,因此通过 "-i -",将数据流通过:
(chunk)
将每一个chunk输入到ffmpeg中。
同样的,输出文件可以是 "-o "或者直接写在参数最后。此处我需要实时获取实时转换的FLV流,因此通过 'pipe:1'将参数通过pipe传出。这样当生成了FLV数据流时,就能够通过stdout传出来,即代码中的最后一段。
不过具体再应用时,最好需要先将这个函数执行起来,否则实时性挺差的。