gstreamer h264 多播缺少 SPS/PPS 信息
gstreamer h264 multicast missing SPS/PPS information
我有两个视频流单元能够流式传输实时视频输入:
- AXIS Q7424-R 视频编码器
- EPIPHAN VGADVI 广播公司 99460 -
我正在使用 gstreamer 在客户端上查看这些流 运行 linux。我对 h264、rtp 多播流(这两个单元都支持)感兴趣。
我可以使用以下 gstreamer 管道流式传输 Epiphan 视频:
gst-launch-0.10 udpsrc multicast-group=ADDRESS port=PORT caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' ! rtph264depay ! ffdec_h254 ! autovideosink
但是,此管道不适用于 Axis 单元,因为我反复收到以下错误:
ffmpeg:0:: non-existing PPS referenced
ffmpeg:0:: non-existing PPS 0 referenced
ffmpeg:0:: decode_slice_header error
ffmpeg:0:: no frame!
ffdec_h264: decoding error (len:-1, have_data: 0)
我读到这个错误意味着 ffmpeg 解码器缺少关键帧提供的 SPS/PPS 信息。轴单元有一个GOV参数,它是发送i帧的间隔;它设置为 32。
请注意,我可以通过以下方式在单播中查看两个单元的 rtp 流:
gst-launch-0.10 rtspsrc location=rtsp://ADDRESS:PORT/... latency=100 ! rtph264depay ! ffdec_h264 ! autovideosink
由于单播有效并且单播和多播管道相同(源除外),我的猜测是:
我的 udpsrc 上限对于轴流来说是不正确的(而且我真的不知道 where/how 来验证它)
或者,轴多播 format/encoding 不同,需要修改管道(我发现这不太可能,因为单播正在工作,我不明白为什么编码会在unicast/multicast).
感谢您提出任何建议,因为我对 gstreamer 和媒体格式的了解有限,无法决定接下来要做什么。
如 szatmary 的评论所述,轴硬件似乎不会传输 SPS/PPS 信息。我已经就此问题联系了 AXIS 的支持,我收到了回复,指出我的问题是 "outside of the scope of support staff"。
我找到的解决方案是在接收管道中包含 "sprop-parameter-sets"。此参数似乎每个流都是唯一的,可以通过以下任一方式获得:
- 使用
rtsp
启动单播接收器(上面提供的示例)将提供可以复制的上限集,或者
- 从硬件访问 .sdp 文件,通常可以通过 http(例如,
http://<USERNAME:PASSWORD>@<ADDRESS:PORT>/axis-cgi/alwaysmulti.sdp?camera=1
)访问
请注意,访问 sdp 文件是按流进行的(因此 camera=1
),因此如果您的硬件有多个输入,请确保选择正确的输入。
我有两个视频流单元能够流式传输实时视频输入:
- AXIS Q7424-R 视频编码器
- EPIPHAN VGADVI 广播公司 99460 -
我正在使用 gstreamer 在客户端上查看这些流 运行 linux。我对 h264、rtp 多播流(这两个单元都支持)感兴趣。
我可以使用以下 gstreamer 管道流式传输 Epiphan 视频:
gst-launch-0.10 udpsrc multicast-group=ADDRESS port=PORT caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' ! rtph264depay ! ffdec_h254 ! autovideosink
但是,此管道不适用于 Axis 单元,因为我反复收到以下错误:
ffmpeg:0:: non-existing PPS referenced
ffmpeg:0:: non-existing PPS 0 referenced
ffmpeg:0:: decode_slice_header error
ffmpeg:0:: no frame!
ffdec_h264: decoding error (len:-1, have_data: 0)
我读到这个错误意味着 ffmpeg 解码器缺少关键帧提供的 SPS/PPS 信息。轴单元有一个GOV参数,它是发送i帧的间隔;它设置为 32。
请注意,我可以通过以下方式在单播中查看两个单元的 rtp 流:
gst-launch-0.10 rtspsrc location=rtsp://ADDRESS:PORT/... latency=100 ! rtph264depay ! ffdec_h264 ! autovideosink
由于单播有效并且单播和多播管道相同(源除外),我的猜测是:
我的 udpsrc 上限对于轴流来说是不正确的(而且我真的不知道 where/how 来验证它)
或者,轴多播 format/encoding 不同,需要修改管道(我发现这不太可能,因为单播正在工作,我不明白为什么编码会在unicast/multicast).
感谢您提出任何建议,因为我对 gstreamer 和媒体格式的了解有限,无法决定接下来要做什么。
如 szatmary 的评论所述,轴硬件似乎不会传输 SPS/PPS 信息。我已经就此问题联系了 AXIS 的支持,我收到了回复,指出我的问题是 "outside of the scope of support staff"。
我找到的解决方案是在接收管道中包含 "sprop-parameter-sets"。此参数似乎每个流都是唯一的,可以通过以下任一方式获得:
- 使用
rtsp
启动单播接收器(上面提供的示例)将提供可以复制的上限集,或者 - 从硬件访问 .sdp 文件,通常可以通过 http(例如,
http://<USERNAME:PASSWORD>@<ADDRESS:PORT>/axis-cgi/alwaysmulti.sdp?camera=1
)访问
请注意,访问 sdp 文件是按流进行的(因此 camera=1
),因此如果您的硬件有多个输入,请确保选择正确的输入。