我正在使用 gstreamer 通过 RTP 发送 H.264 字节流。
# sender
gst-launch-1.0 filesrc location=my_stream.h264 ! h264parse disable-passthrough=true ! rtph264pay config-interval=10 pt=96 ! udpsink host=localhost port=5004
然后我在其他 gstreamer 实例中接收帧、解码和显示。
# receiver
gst-launch-1.0 udpsrc port=5004 ! application/x-rtp,payload=96,media="video",encoding-name="H264",clock-rate="90000" ! rtph264depay ! h264parse ! decodebin ! xvimagesink
这按原样工作,但我想尝试添加一个 rtpjitterbuffer 以完美平滑播放。
# receiver
gst-launch-1.0 udpsrc port=5004 ! application/x-rtp,payload=96,media="video",encoding-name="H264",clock-rate="90000" ! rtpjitterbuffer ! rtph264depay ! h264parse ! decodebin ! xvimagesink
但是,一旦我这样做,接收器只会显示一个帧并冻结。
如果我用 MP4 文件替换 .h264 文件,播放效果很好。
我假设我的 h264 流没有启用抖动缓冲区所需的时间戳。
我通过添加identity datarate=1000000
. 这允许 jitterbuffer 播放,但是这与我的帧速率有关,因为 P 帧的数据比 I 帧少。显然,该identity
元素添加了正确的时间戳,但只是使用了错误的数字。
是否可以通过在某处正确指定“帧率”上限来自动在发件人上生成时间戳?到目前为止,我的尝试没有奏效。