FFmpeg 包含启动时不存在的流的选项

FFmpeg 包含启动时不存在的流的选项

我想设置 FFmpeg 来接收 RTMP 流。最终我将使用 mpegts 格式类型对音频和视频进行转码,并将输出设为 UDP 多播。

但就目前而言,我一直在做以下工作:

.\ffmpeg.exe -listen 1 -i rtmp://0.0.0.0:9090/stream -c copy -f flv C:\temp\output.flv

这几乎成功了。它创建了文件,并且它有音频轨道,但没有视频轨道。

ffmpeg 的输出显示视频出现在音频和视频后面几千个字节,因此 ffmpeg 似乎忽略了它:

[rtmp @ 000002ad65cca540] Erroneous C2 Message epoch does not match up with C1 epoch
[rtmp @ 000002ad65cca540] Erroneous C2 Message random does not match up
[rtmp @ 000002ad65cca540] App field don't match up:  <-> muskiefootball
Input #0, flv, from 'rtmp://0.0.0.0:9095/test':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    title           : Wildlife Sample Video - https://archive.org/details/WildlifeSampleVideo
    encoder         : Lavf58.29.100
  Duration: 00:00:00.00, start: 5.677000, bitrate: N/A
    Stream #0:0: Data: none
    Stream #0:1: Subtitle: text
    Stream #0:2: Audio: aac (LC), 44100 Hz, stereo, fltp, 130 kb/s
File 'C:\temp\testingoutput5.flv' already exists. Overwrite ? [y/N] y
Stream mapping:
  Stream #0:2 -> #0:0 (aac (native) -> mp2 (native))
Press [q] to stop, [?] for help
Output #0, mpegts, to 'C:\temp\testingoutput5.flv':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    title           : Wildlife Sample Video - https://archive.org/details/WildlifeSampleVideo
    encoder         : Lavf58.29.100
    Stream #0:0: Audio: mp2, 44100 Hz, stereo, s16, 192 kb/s
    Metadata:
      encoder         : Lavc58.54.100 mp2
[flv @ 000002ad65cc9400] New video stream 0:3 at pos:26340 and DTS:7.163s
size=    1411kB time=00:00:54.29 bitrate= 212.9kbits/s speed=1.05x

因此视频不包含在输出中。

我有哪些选项可以让 ffmpeg 在流开始后将视频包含在输出中?唯一的限制是我必须监听 RTMP 连接,而且由于它来自外部服务,我无法修改它们发送数据的方式。

答案1

我无法找到让 ffmpeg 原生执行此操作的方法。相反,我使用 nginx 作为 ffmpeg 前面的代理。

首先,我使用 nginx-rtmp-module 构建 nginx:

https://github.com/arut/nginx-rtmp-module/wiki/Getting-started-with-nginx-rtmp

然后我习惯按照 nginx 配置监听 RTMP 流,缓冲和交错子流,然后将其推送到 ffmpeg。以下配置对我有用,但不够完善:

rtmp {
    server {
        listen 9095;
        ping 30s;
        notify_method get;
        buflen 5s;

        application live {
            live on;
            interleave on;
            exec_push ffmpeg -i rtmp://127.0.0.1:9095/live/mykey -c copy -f flv /tmp/test.flv
        }
    }
}

相关内容