VLC:使用FFMPEG打开H265的SDP文件失败。

3

我正在使用以下命令使用rtp和ffmpeg进行直播视频流:

ffmpeg -re -f v4l2 -framerate 30 -video_size 640x480 -i /dev/video0 -c:v libx265 -tune zerolatency -s 320x240 -preset ultrafast -pix_fmt yuv420p -r 10 -strict experimental -f rtp rtp://127.0.0.1:49170 > 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 56.36.100
m=video 49170 RTP/AVP 96
a=rtpmap:96 H265/9000

Vlc报错如下:

无法检测到“file:///home/username/ffmpeg.sdp”的格式。请查看日志获取详细信息。

终端报错如下:

[0xaf801010] ps demux error: cannot peek
[0xaf801010] mjpeg demux error: cannot peek
[0xaf801010] mpgv demux error: cannot peek
[0xaf801010] ps demux error: cannot peek
[0xb6d00618] main input error: no suitable demux module for `file/:///home/username/ffmpeg.sdp'

如果我在命令中只是将libx265改为libx264,H265改为H264,那么流媒体会正常运行。

然而,我需要使用H265进行流媒体传输。有什么建议吗?


支持通过RTP传输的HEVC显然已经在FFmpeg(https://ffmpeg.org/pipermail/ffmpeg-devel/2014-September/163213.html)和VLC(https://patches.videolan.org/patch/4313/)中添加。即使使用`ffplay`,也无法播放`ffmpeg`输出,因此可能存在某种退化。由于版本明显不是问题,因此我删除了我的答案。 - aergistal
你尝试使用我发布的命令并复制场景了吗? - Anakooter
是的,ffplay出现了错误:[hevc @ 0x7fe4f80049e0] Error parsing NAL unit #0. [hevc @ 0x7fe4f80049e0] PPS id out of range: 00KB sq= 0B f=0/0 [sdp @ 0x7fb1a40008c0] decoding for stream 0 failed [sdp @ 0x7fb1a40008c0] Could not find codec parameters for stream 0 (Video: hevc, none): unspecified size Consider increasing the value for the 'analyzeduration' and 'probesize' options ffmpeg.sdp: could not find codec parameters - aergistal
2个回答

3
我想问题是因为VLC(或ffplay)没有获取到VPS,SPS,PPS帧。为了开始解码H265流,你需要一帧VPS,一帧SPS,一帧PPS和一帧IDR。
为了要求libx265在每个IDR帧之前重复这些配置帧,你可以在你的流命令中添加:
-x265-params keyint=30:repeat-headers=1

然后命令变成:

ffmpeg -re -f v4l2 -framerate 30 -video_size 640x480 -i /dev/video0 -c:v libx265 -tune zerolatency -x265-params keyint=30:repeat-headers=1 -s 320x240 -preset ultrafast -pix_fmt yuv420p -r 10 -strict experimental -f rtp rtp://127.0.0.1:49170 > ffmpeg.sdp

它生成以下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 56.36.100 
m=video 49170 RTP/AVP 96 
a=rtpmap:96 H265/90000

我能够使用 ffplay ffmpeg.sdpVLC ffmpeg.sdp (删除 ffmpeg.sdp 的第一行 SDP:)来显示流。


v=0 o=- 0 0 IN IP4 127.0.0.1 s=无名 c=IN IP4 127.0.0.1 t=0 0 a=工具:libavformat 56.36.100 m=视频 49170 RTP/AVP 96 a=rtpmap:96 H265/90000 - Anakooter
我仍然无法播放它。 - Anakooter
无论如何对我都不起作用,而且我确实从文件中删除了“SDP:”。你能告诉我你的VLC版本吗? - Anakooter
我使用VLC VLC媒体播放器2.2.1 Terry Pratchett (Weatherwax) (修订版2.2.1-0-ga425c42) - mpromonet

1

请不要因为我不使用 VLC 来处理此类事情而批评我,但我记得为了让 Gstreamer 能够与 H265 协同工作,我必须安装:
libde265gstreamer1.0-libde265
Ubuntu 仓库中也列有一个 vlc-plugin-libde265
参见:https://github.com/strukturag/libde265


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接