首页 > 解决方案 > ffmpeg:VLC 不会打开 ffmpeg 生成的 .sdp 文件

问题描述

TLDR:VLC 或 Quicktime 不会打开 ffmpeg 生成的 .sdp 视频流文件,即使 ffplay 可以。

Web 开发和 ffmpeg 菜鸟,如果我使用了错误的术语,我们深表歉意:

我正在尝试使用 ffmpeg 流式传输我的桌面捕获(在 OSX 上),并通过 rtp 协议将其发送出去。截至目前,我只是通过在我的 localhost (4000) 中的一个端口上流式传输它来测试它。并尝试在本地播放。

问题是当我尝试打开由 ffmpeg 命令生成的 .sdp 文件时,VLC 打开它并立即停止,没有错误或任何东西,并显示它的持续时间为 0:00。Quicktime 不会首先打开文件。

ffplay 确实播放了流,我可以在播放器窗口中看到我的桌面(尽管质量有很大损失)。即便如此,还是会间歇性地出现大量警告和错误(如下所述)

我不确定这是否是我启动 ffmpeg 流的方式的问题,该命令经过大量迭代试图使其正常工作,所以我的选择可能是错误的。

“服务”桌面捕获的命令:

./ffmpeg -f avfoundation -s 1920x1080 -r 60 -i "1" -an \
-vcodec libx264 -preset ultrafast -tune zerolatency -pix_fmt yuv420p \
-sdp_file video.sdp -rtsp_transport tcp -f rtp rtp://127.0.0.1:4000

使用 ffmpeg 命令生成的 SDP 文件:

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 58.29.100
m=video 4000 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1

ffplay 用于播放流的命令:

./ffplay -probesize 32 -analyzeduration 0 -sync ext \
-fflags nobuffer -fflags discardcorrupt -flags low_delay -framedrop \
-strict experimental -avioflags direct \
-protocol_whitelist file,rtp,udp -I video.sdp

在 ffplay 开始之前的一段时间,我看到一堆重复的错误(红色):

[h264 @ 0x7ff6b788de00] non-existing PPS 0 referenced
[h264 @ 0x7ff6b788de00] decode_slice_header error
[h264 @ 0x7ff6b788de00] no frame!

然后窗口似乎“赶上”流并实际显示桌面捕获,并且我定期收到这些错误和警告:

1- 黄色警告颜色:

[sdp @ 0x7fc85b830600] RTP: missed 4 packets
[sdp @ 0x7fc85b830600] max delay reached. need to consume packet

2-红色错误颜色:

[h264 @ 0x7fc85b02aa00] out of range intra chroma pred mode
[h264 @ 0x7fc85b02aa00] error while decoding MB 132 32

(我感觉上述错误与在我正在捕获的桌面中预览桌面捕获并导致显示中的像素溢出有关)

编辑: 所以,我在发布后不久就解决了这个问题,但如果有人遇到同样的问题,我会留下这个问题。

解决方案是删除 .sdp 文件中的第一行SDP:

标签: ffmpegstreamvlcrtpsdp

解决方案


解决方案是删除 .sdp 文件中的第一行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 58.29.100
m=video 4000 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1

推荐阅读