我正在尝试使用 WebRTC 将一些视频流式传输到浏览器。为了实现这一点,我有一个 gstreamer 实例,它对视频进行编码并通过 RTP 将其发送到服务器,该服务器只需将其打包到 WebRTC 中即可显示。如果我使用 VP8 (
vp8enc
),这将按预期工作。但是,当使用 H.264 时,我的浏览器不会解码任何帧:
gst-launch-1.0 videotestsrc ! videoscale ! video/x-raw,width=640,height=360 ! x264enc ! rtph264pay ! udpsink host=127.0.0.1 port=6001 # < my forwarding server
此外,如果我在 Khadas VIM4 上运行管道并使用其硬件 H.264 编码器 (
amlvenc
) 而不是使用完全相同的管道的 x264
,否则将显示视频(至少在 Firefox 中)。
这两个编码器(都输出 H.264 视频)之间可能有什么区别,或者我如何找到此问题的原因?我尝试查看浏览器WebRTC调试页面,但这并没有真正帮助我......
问题很可能是由于 SPS/PPS 没有随来自
x264enc
的每个 IDR 帧一起发送,而 amlvenc
很可能默认情况下会这样做。
如果是这种情况,您可以尝试调整两件事:
config-interval=-1
设置在您的 rtph264pay
上。请参阅 config-interval 的文档。x264enc
在每个 IDR 帧中发出 SPS/PPS。似乎该选项不是通过 gstreamer 选项直接公开的,但您可以尝试通过 x264
设置名为 repeat-headers
的底层 option-string
选项。因此,请尝试将 option-string=\"repeat-headers=1\"
添加到您的 x264enc
节点。请参阅 option-string 和相关 x264
选项 repeat-headers我认为其中任何一个都应该有帮助,如果没有,那么您还可以检查 SDP 中的
a=fmtp:96 profile-level-id=42e01f; packetization-mode=1
行,看看两个编码器是否使用截然不同的配置文件,但我认为情况不应该如此。