mat*_*att 7 rtp gstreamer gstreamer-1.0
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
然后我接收帧,解码并在其他 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
Run Code Online (Sandbox Code Playgroud)
这是按原样工作的,但我想尝试添加 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
Run Code Online (Sandbox Code Playgroud)
然而,一旦我这样做,接收器就只显示一帧并冻结。
如果我用 MP4 文件替换 .h264 文件,播放效果会很好。
我假设我的 h264 流没有使抖动缓冲区发挥作用所需的时间戳。
我通过添加取得了一些进展identity datarate=1000000。这允许抖动缓冲区播放,但这会影响我的帧速率,因为 P 帧的数据比 I 帧少。显然,该identity元素添加了正确的时间戳,但只是添加了错误的数字。
是否可以通过在某处正确指定“帧速率”上限来自动在发送方上生成时间戳?到目前为止我的尝试还没有奏效。
您已经部分回答了问题:
如果我用 MP4 文件替换 .h264 文件,播放效果会很好。
我假设我的 h264 流没有使抖动缓冲区发挥作用所需的时间戳。
您的发送方管道没有协商帧速率,因为您使用的是原始h264 流,而您实际上应该使用包含此信息的容器格式(例如 MP4)。如果没有时间戳,udpsink则无法与时钟同步以进行节流,因此发送方会以管道处理数据包的速度发送数据包。这不是一个活水槽。
然而,添加一个rtpjitterbuffer使您的接收器充当实时信号源。它冻结是因为它正在尽力应对大量格式错误的时间戳数据包。据我所知,RTP 不会传输“丢失”的时间戳,因此所有数据包可能具有相同的时间戳。因此,它可能会重建第一帧并将其余帧作为重复项丢弃。
我必须同意user1998586 的观点,在这种情况下,管道崩溃并显示良好的错误消息应该更好,而不是尽力而为。
是否可以通过在某处正确指定“帧速率”上限来自动在发送方上生成时间戳?到目前为止我的尝试还没有奏效。
不,你真的应该使用容器。
然而,从理论上讲,au只需知道帧速率就可以为对齐的 H264 原始流添加时间戳,但没有(我知道的)gstreamer 元素可以执行此操作,并且仅指定上限无法执行此操作。
| 归档时间: |
|
| 查看次数: |
15555 次 |
| 最近记录: |