ffmpeg:VLC 不会打开 ffmpeg 生成的 .sdp 文件

标签 ffmpeg stream vlc rtp sdp

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

Web 开发和 ffmpeg 菜鸟,如果我使用了错误的术语,请见谅:

我正在尝试使用 ffmpeg 流式传输我的桌面捕获(在 OSX 上),通过 rtp 协议(protocol)将其发送出去。
到目前为止,我只是通过在我的 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!

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

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: 的第一行。

最佳答案

解决方案是删除 .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

关于ffmpeg:VLC 不会打开 ffmpeg 生成的 .sdp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61687212/

相关文章:

Java - 播放/暂停 VLC

ffmpeg - 在组合多个图像和音轨时对输入图像应用填充

android - Android 上的慢 avcodec_decode_video2、ffmpeg

java - 在极其庞大的数据集中查找重复项

scala - 使用 Akka Streams、Scala 异步读取多个文件

Docker - 挂载目录的所有者和组

ffmpeg - 为什么我的 ffmpeg 库这么大?

python - ffmpeg 将图像转换为 mp4 错误

delphi - Delphi7中如何从流中剪切一部分

VLC 的 Python 绑定(bind)