Unbescholtener Bürger 又回来问 FFmpeg 问题了。我的目标是运行一个 FFmpeg 实例,通过 RTP 接收 mpeg 传输流,对接收到的流执行任意操作,如转码或过滤,然后通过 RTP 传递更改后的传输流。
但是,我甚至无法在最基本的配置下使用它:我有一个 .ts 文件,其中包含一个由一个视频和一个音频流组成的程序。我使用 FFmpeg 的一个实例将此文件流式传输到本地主机:
ffmpeg -re -i 1.ts -c copy -f rtp_mpegts rtp://127.0.0.1:5003
使用 ffplay,我验证了它是否可以正常工作:
ffplay -i rtp://127.0.0.1:5003
结果看起来不错,听起来不错,不会在控制台上引起错误消息。
现在我尝试在中间放入另一个 FFmpeg 实例,但情况却变糟了。我只想让 FFmpeg 将流从端口 5003 复制到端口 5005,而无需进行任何进一步的处理或转码:
ffmpeg -re -probesize 50M -analyzeduration 50M -i rtp://127.0.0.1:5003?fifo_size=10000 -c copy -f rtp_mpegts rtp://127.0.0.1:5005
我在该控制台上收到很多重复出现的错误消息,当我使用 ffplay 监控端口 5005 上的流时,会出现很多伪影、故障和丢失。控制台输出大部分如下所示:
...
Input #0, rtp, from 'rtp://127.0.0.1:5003?fifo_size=10000':
Duration: N/A, start: 1.400022, bitrate: N/A
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Output #0, rtp_mpegts, to 'rtp://127.0.0.1:5005':
Metadata:
encoder : Lavf58.2.102
Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc
Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.48 bitrate= 0.0kbits/s speed=0.957x
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:01.01 bitrate= 0.0kbits/s speed=0.991x
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:01.53 bitrate= 0.0kbits/s speed=1.01x
frame= 1 fps=0.5 q=-1.0 size= 57kB time=00:00:02.05 bitrate= 227.6kbits/s speed=1.01x
frame= 17 fps=6.7 q=-1.0 size= 83kB time=00:00:02.54 bitrate= 267.6kbits/s speed= 1x
frame= 32 fps= 11 q=-1.0 size= 121kB time=00:00:03.04 bitrate= 324.9kbits/s speed= 1x
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 50 packets
[rtp @ 0x3db64c0] PES packet size mismatch
frame= 37 fps= 10 q=-1.0 size= 132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.15x frame= 37 fps=9.1 q=-1.0 size= 132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.01x
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
[rtp @ 0x3db64c0] PES packet size mismatch
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
frame= 47 fps= 10 q=-1.0 size= 150kB time=00:00:04.57 bitrate= 269.3kbits/s speed=1.01x
...
那么... 知道哪里出了问题以及如何修复吗?查看资源监视器并没有显示任何高 CPU、内存或网络负载。
答案1
所以显然我的问题是-re
启动直通 FFmpeg 实例的命令中的标志。
如果我事先查看过官方文档,我就不会问这个问题了:
-re
(输入)以原始帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如从文件读取时)。不应与实际抓取设备或实时输入流一起使用(这可能会导致数据包丢失)。
http://ffmpeg.org/ffmpeg.html#Advanced-options
这正是发生在我身上的事情。