为什么我在 ffmpeg 进行本地 RTP 流式传输时会丢失数据包?

为什么我在 ffmpeg 进行本地 RTP 流式传输时会丢失数据包?

我正在尝试通过本地 SDP 文件测试 ffmpeg 流式传输RTP。因此,为了启动流式传输,我运行

ffmpeg -re -thread_queue_size 4 -i .\bbb_streamable.flv -strict -2 -vcodec copy -an -f rtp rtp://127.0.0.1:6005 -acodec copy -vn -f rtp rtp://127.0.0.1:7005

这给了我以下 SDP

v=0
o=- 0 0 IN IP4 127.0.0.1
s=Big Buck Bunny, Sunflower version
t=0 0
a=tool:libavformat 58.10.100
m=video 6005 RTP/AVP 96
c=IN IP4 127.0.0.1
b=AS:3500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKKzZQHgCJ+XARAAAAwAEAAADAPA8YMZY,aOrssiw=; profile-level-id=640028
m=audio 7005 RTP/AVP 97
c=IN IP4 127.0.0.1
b=AS:96
a=rtpmap:97 MPEG4-GENERIC/44100/2
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=121056E500

因此,为了在另一个窗口中记录 RTP 流,我执行:

ffmpeg -protocol_whitelist "file,rtp,udp" -i .\test.sdp -strict -2 test.flv

当这种情况发生时,我不断在 ffmpeg 中收到有关丢失数据包的消息

[sdp @ 0000020b70f2aa80] max delay reached. need to consume packete=2149.1kbits/s dup=0 drop=1 speed= 1.2x
[sdp @ 0000020b70f2aa80] RTP: missed 230 packets
[h264 @ 0000020b71456ec0] error while decoding MB 20 11, bytestream -45
[h264 @ 0000020b71456ec0] concealing 6869 DC, 6869 AC, 6869 MV errors in I frame
[sdp @ 0000020b70f2aa80] max delay reached. need to consume packete=2119.4kbits/s dup=0 drop=1 speed=1.17x
[sdp @ 0000020b70f2aa80] RTP: missed 208 packets
[h264 @ 0000020b70ff5f80] error while decoding MB 116 12, bytestream -13
[h264 @ 0000020b70ff5f80] concealing 6653 DC, 6653 AC, 6653 MV errors in I frame
[sdp @ 0000020b70f2aa80] max delay reached. need to consume packete=2107.8kbits/s dup=0 drop=1 speed=1.15x
[sdp @ 0000020b70f2aa80] RTP: missed 17 packets
[h264 @ 0000020b70ff5f80] error while decoding MB 22 48, bytestream -7
[h264 @ 0000020b70ff5f80] concealing 2427 DC, 2427 AC, 2427 MV errors in P frames dup=0 drop=1 speed=1.14x
[sdp @ 0000020b70f2aa80] max delay reached. need to consume packet
[sdp @ 0000020b70f2aa80] RTP: missed 210 packets

查看生成的 flv 文件时,发现有大量瑕疵和问题。源文件 100% 干净。

为什么这个表现如此糟糕,甚至超过127.0.0.1

答案1

尝试删除标志‘-re’!

-re(输入)

以原始帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如从文件读取时)。不应与实际抓取设备或实时输入流一起使用(这可能会导致数据包丢失)。

http://ffmpeg.org/ffmpeg.html#Advanced-options

答案2

我知道这已经过时了,但请尝试以 root 身份或使用 sudo 运行捕获。不知出于什么原因,我在一台全新的 Ubuntu 19.10 盒子上看到大量这种“数据包丢失”,该盒子通过 FFmpeg 从我的 IP 摄像头捕获视频,但当我以 sudo/root 身份运行 FFmpeg 捕获时,它就消失了。

我确信这与某些 CPU 工作优先于其他工作有关,希望有比我聪明的人可以介入并解释它。

答案3

如果运行具有更高优先级的 ffmpeg 可以解决问题,那么您是正确的。(至少您会减少丢失的数据包数量。您必须是 root 用户。并且这个命令会为您的编码提供更高的优先级。

很好--10ffmpeg -protocol_whitelist“文件,rtp,udp”-i .\test.sdp -strict -2 test.flv

相关内容