我想设置 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
}
}
}