使用node.js使用fluent ffmpeg库从VP8到H264的代码转换不起作用

使用node.js使用fluent ffmpeg库从VP8到H264的代码转换不起作用,node.js,ffmpeg,h.264,vp8,transcode,Node.js,Ffmpeg,H.264,Vp8,Transcode,我曾尝试使用命令行将流从VP8转码到H264,效果很好,但当我使用fluent ffmpeg尝试同样的方法时,效果并不理想 版本信息 fluent ffmpeg版本:“2.1.2” ffmpeg版本:“3.4.4-1~16.04.0” 操作系统:“Ubuntu” 从VP8到H264的传输编码正在使用命令工作 ffmpeg -analyzeduration 300M -probesize 300M -protocol_whitelist file,udp,rtp -i portal-vp8.sdp

我曾尝试使用命令行将流从VP8转码到H264,效果很好,但当我使用fluent ffmpeg尝试同样的方法时,效果并不理想

版本信息

fluent ffmpeg版本:“2.1.2”

ffmpeg版本:“3.4.4-1~16.04.0”

操作系统:“Ubuntu”

从VP8到H264的传输编码正在使用命令工作

ffmpeg -analyzeduration 300M -probesize 300M -protocol_whitelist file,udp,rtp -i portal-vp8.sdp -c:v libx264 -profile:v high -level:v 3.2 -pix_fmt yuv420p -x264-params keyint=25:scenecut=0 -r 25 -c:a aac -ar 16k -ac 1 -preset ultrafast -tune zerolatency -f flv rtmp://my-server-ip/myapp/testvp8
我的sdp是

v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 55.2.100
m=audio 5396 TCP 111
a=rtpmap:111 opus/48000
m=video 5398 RTP/AVP 100
a=rtpmap:100 VP8/90000
a=fmtp:100 packetization-mode=1
FFMPEG Stderr output: ffmpeg version 3.4.4-1~16.04.york0 Copyright (c) 2000-2018 the FFmpeg developers
FFMPEG Stderr output:   built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
FFMPEG Stderr output:   configuration: --prefix=/usr --extra-version='1~16.04.york0' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
FFMPEG Stderr output:   libavutil      55. 78.100 / 55. 78.100
FFMPEG Stderr output:   libavcodec     57.107.100 / 57.107.100
FFMPEG Stderr output:   libavformat    57. 83.100 / 57. 83.100
FFMPEG Stderr output:   libavdevice    57. 10.100 / 57. 10.100
FFMPEG Stderr output:   libavfilter     6.107.100 /  6.107.100
FFMPEG Stderr output:   libavresample   3.  7.  0 /  3.  7.  0
FFMPEG Stderr output:   libswscale      4.  8.100 /  4.  8.100
FFMPEG Stderr output:   libswresample   2.  9.100 /  2.  9.100
FFMPEG Stderr output:   libpostproc    54.  7.100 / 54.  7.100
FFMPEG Stderr output: [sdp @ 0x55c28151c180] max delay reached. need to consume packet
FFMPEG Stderr output: [sdp @ 0x55c28151c180] RTP: missed 1 packets
使用库从VP8到H264的传输编码不起作用

var sdpString = "v=0\r\no=- 0 0 IN IP4 127.0.0.1\r\ns=No Name\r\nc=IN IP4 127.0.0.1\r\nt=0 0\r\na=tool:libavformat 55.2.100\r\nm=audio 5120 TCP 111\r\na=rtpmap:111 opus/48000\r\nm=video 5122 RTP/AVP 100\r\na=rtpmap:100 VP8/90000";

let sdp = stringToStream(sdpString);
var inputOptions = [];
    inputOptions.push('-analyzeduration');
    inputOptions.push('300M');
    inputOptions.push('-probesize');
    inputOptions.push('300M');
    inputOptions.push('-protocol_whitelist');
    inputOptions.push('file,udp,rtp,pipe');

var outputOptions = [];
    outputOptions.push('-c:v');
    outputOptions.push('libx264');

    outputOptions.push('-profile:v');
    outputOptions.push('high');

    outputOptions.push('-level:v');
    outputOptions.push('3.2');

    outputOptions.push('-pix_fmt');
    outputOptions.push('yuv420p');

    outputOptions.push('-x264-params');
    outputOptions.push('keyint=25:scenecut=0');

    outputOptions.push('-r');
    outputOptions.push('25');

    outputOptions.push('-c:a');
    outputOptions.push('aac');

    outputOptions.push('-ar');
    outputOptions.push('16k');

    outputOptions.push('-ac');
    outputOptions.push('1');

    outputOptions.push('-preset');
    outputOptions.push('ultrafast');

    outputOptions.push('-tune');
    outputOptions.push('zerolatency');

    outputOptions.push('-f');
    outputOptions.push('flv');

var outputUrl = "rtmp://my-server-ip/myapp/testvp8";

var command = FfmpegCommand(sdp).inputOptions(inputOptions).outputOptions(outputOptions).output(outputUrl)
        .on('start', function (commandLine) {
            console.log('Spawned Ffmpeg with command: ' + commandLine);
        })
        .on('stderr', function(stderrLine) {
            console.log('FFMPEG Stderr output: ' + stderrLine);
        });

    command.run();
});
ffmpeg -analyzeduration 300M -probesize 300M -protocol_whitelist file,udp,rtp,pipe -i pipe:0 -c:v libx264 -profile:v high -level:v 3.2 -pix_fmt yuv420p -x264-params keyint=25:scenecut=0 -r 25 -c:a aac -ar 16k -ac 1 -preset ultrafast -tune zerolatency -f flv rtmp://my-server-ip/myapp/testvp8
使用库生成的命令

var sdpString = "v=0\r\no=- 0 0 IN IP4 127.0.0.1\r\ns=No Name\r\nc=IN IP4 127.0.0.1\r\nt=0 0\r\na=tool:libavformat 55.2.100\r\nm=audio 5120 TCP 111\r\na=rtpmap:111 opus/48000\r\nm=video 5122 RTP/AVP 100\r\na=rtpmap:100 VP8/90000";

let sdp = stringToStream(sdpString);
var inputOptions = [];
    inputOptions.push('-analyzeduration');
    inputOptions.push('300M');
    inputOptions.push('-probesize');
    inputOptions.push('300M');
    inputOptions.push('-protocol_whitelist');
    inputOptions.push('file,udp,rtp,pipe');

var outputOptions = [];
    outputOptions.push('-c:v');
    outputOptions.push('libx264');

    outputOptions.push('-profile:v');
    outputOptions.push('high');

    outputOptions.push('-level:v');
    outputOptions.push('3.2');

    outputOptions.push('-pix_fmt');
    outputOptions.push('yuv420p');

    outputOptions.push('-x264-params');
    outputOptions.push('keyint=25:scenecut=0');

    outputOptions.push('-r');
    outputOptions.push('25');

    outputOptions.push('-c:a');
    outputOptions.push('aac');

    outputOptions.push('-ar');
    outputOptions.push('16k');

    outputOptions.push('-ac');
    outputOptions.push('1');

    outputOptions.push('-preset');
    outputOptions.push('ultrafast');

    outputOptions.push('-tune');
    outputOptions.push('zerolatency');

    outputOptions.push('-f');
    outputOptions.push('flv');

var outputUrl = "rtmp://my-server-ip/myapp/testvp8";

var command = FfmpegCommand(sdp).inputOptions(inputOptions).outputOptions(outputOptions).output(outputUrl)
        .on('start', function (commandLine) {
            console.log('Spawned Ffmpeg with command: ' + commandLine);
        })
        .on('stderr', function(stderrLine) {
            console.log('FFMPEG Stderr output: ' + stderrLine);
        });

    command.run();
});
ffmpeg -analyzeduration 300M -probesize 300M -protocol_whitelist file,udp,rtp,pipe -i pipe:0 -c:v libx264 -profile:v high -level:v 3.2 -pix_fmt yuv420p -x264-params keyint=25:scenecut=0 -r 25 -c:a aac -ar 16k -ac 1 -preset ultrafast -tune zerolatency -f flv rtmp://my-server-ip/myapp/testvp8
FFmpeg日志

v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 55.2.100
m=audio 5396 TCP 111
a=rtpmap:111 opus/48000
m=video 5398 RTP/AVP 100
a=rtpmap:100 VP8/90000
a=fmtp:100 packetization-mode=1
FFMPEG Stderr output: ffmpeg version 3.4.4-1~16.04.york0 Copyright (c) 2000-2018 the FFmpeg developers
FFMPEG Stderr output:   built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
FFMPEG Stderr output:   configuration: --prefix=/usr --extra-version='1~16.04.york0' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
FFMPEG Stderr output:   libavutil      55. 78.100 / 55. 78.100
FFMPEG Stderr output:   libavcodec     57.107.100 / 57.107.100
FFMPEG Stderr output:   libavformat    57. 83.100 / 57. 83.100
FFMPEG Stderr output:   libavdevice    57. 10.100 / 57. 10.100
FFMPEG Stderr output:   libavfilter     6.107.100 /  6.107.100
FFMPEG Stderr output:   libavresample   3.  7.  0 /  3.  7.  0
FFMPEG Stderr output:   libswscale      4.  8.100 /  4.  8.100
FFMPEG Stderr output:   libswresample   2.  9.100 /  2.  9.100
FFMPEG Stderr output:   libpostproc    54.  7.100 / 54.  7.100
FFMPEG Stderr output: [sdp @ 0x55c28151c180] max delay reached. need to consume packet
FFMPEG Stderr output: [sdp @ 0x55c28151c180] RTP: missed 1 packets
观察结果

v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 55.2.100
m=audio 5396 TCP 111
a=rtpmap:111 opus/48000
m=video 5398 RTP/AVP 100
a=rtpmap:100 VP8/90000
a=fmtp:100 packetization-mode=1
FFMPEG Stderr output: ffmpeg version 3.4.4-1~16.04.york0 Copyright (c) 2000-2018 the FFmpeg developers
FFMPEG Stderr output:   built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
FFMPEG Stderr output:   configuration: --prefix=/usr --extra-version='1~16.04.york0' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
FFMPEG Stderr output:   libavutil      55. 78.100 / 55. 78.100
FFMPEG Stderr output:   libavcodec     57.107.100 / 57.107.100
FFMPEG Stderr output:   libavformat    57. 83.100 / 57. 83.100
FFMPEG Stderr output:   libavdevice    57. 10.100 / 57. 10.100
FFMPEG Stderr output:   libavfilter     6.107.100 /  6.107.100
FFMPEG Stderr output:   libavresample   3.  7.  0 /  3.  7.  0
FFMPEG Stderr output:   libswscale      4.  8.100 /  4.  8.100
FFMPEG Stderr output:   libswresample   2.  9.100 /  2.  9.100
FFMPEG Stderr output:   libpostproc    54.  7.100 / 54.  7.100
FFMPEG Stderr output: [sdp @ 0x55c28151c180] max delay reached. need to consume packet
FFMPEG Stderr output: [sdp @ 0x55c28151c180] RTP: missed 1 packets
我观察到输入的VP8流没有使用FFmpeg库转码到H264

预期结果

v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 55.2.100
m=audio 5396 TCP 111
a=rtpmap:111 opus/48000
m=video 5398 RTP/AVP 100
a=rtpmap:100 VP8/90000
a=fmtp:100 packetization-mode=1
FFMPEG Stderr output: ffmpeg version 3.4.4-1~16.04.york0 Copyright (c) 2000-2018 the FFmpeg developers
FFMPEG Stderr output:   built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
FFMPEG Stderr output:   configuration: --prefix=/usr --extra-version='1~16.04.york0' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
FFMPEG Stderr output:   libavutil      55. 78.100 / 55. 78.100
FFMPEG Stderr output:   libavcodec     57.107.100 / 57.107.100
FFMPEG Stderr output:   libavformat    57. 83.100 / 57. 83.100
FFMPEG Stderr output:   libavdevice    57. 10.100 / 57. 10.100
FFMPEG Stderr output:   libavfilter     6.107.100 /  6.107.100
FFMPEG Stderr output:   libavresample   3.  7.  0 /  3.  7.  0
FFMPEG Stderr output:   libswscale      4.  8.100 /  4.  8.100
FFMPEG Stderr output:   libswresample   2.  9.100 /  2.  9.100
FFMPEG Stderr output:   libpostproc    54.  7.100 / 54.  7.100
FFMPEG Stderr output: [sdp @ 0x55c28151c180] max delay reached. need to consume packet
FFMPEG Stderr output: [sdp @ 0x55c28151c180] RTP: missed 1 packets
应使用库将输入的VP8流转码到H264


请提供帮助,以便解决问题。

“未按预期工作”信息不足,无法诊断问题。请包括ffmpeg的错误输出。我添加了日志。这些日志似乎不完整。它们只提供ffmpeg的标准启动信息。其他日志显示,向fluent ffmpeg提供数据似乎有问题(请参见
达到的最大延迟
)。换句话说,问题可能不是ffmpeg,而是SDP端。