【问题标题】:How to handle clock skew in audio streaming如何处理音频流中的时钟偏差
【发布时间】:2015-02-25 12:00:14
【问题描述】:

问题:

  1. 通过 WiFi + udp 网络进行实时音频视频流传输。
  2. 流:Mpeg2Ts
  3. 播放器框架:gstreamer。
  4. Pipeline Appsrc ----> tsdemuxer -----> 音频队列---->faad 解码器--->alsasink - ----->video-queue->vpudecoder ---->videosink
  5. 音频设备配置为每秒处理 48000 个样本。
  6. 发送方时钟比接收方时钟快,我通过跟踪流中的 pcr 值和接收方系统时钟来获取此信息。 1 小时后,发送者和接收者时钟之间有 8 秒的差异。
  7. 因此,由于发送方和接收方之间的延迟随着时间的推移而不断增加,因此问题是发送方在一秒内发送更多样本(相对于接收方时钟)。

【问题讨论】:

    标签: audio gstreamer audio-streaming alsa skew


    【解决方案1】:

    时钟偏差应该由 GStreamer 的同步机制和音频接收器基类中的偏差逻辑自动处理。

    要解决发送方和接收方之间延迟增加的问题,您必须正确地为输入添加时间戳,而不是依赖 TS 流中的时间戳(基于发送方时钟,因此对您而言是错误的)。为此,使用足够新的 GStreamer 版本并在 appsrc 上设置 do-timestamp=true 和 format=time 可能已经足够了。

    【讨论】:

    • 我无法使用最新版本的 gstreamer。目前,我正在使用 gstreamer-0.10.36。在 Demuxer (tsdemuxer) 中,gstreamer 使用了一种算法来处理时钟偏差。算法需要包含 pcr 信息的 rtp 数据包的接收时间戳。使用发送方的 PCR(程序时钟参考)值和数据包的接收值,计算发送方时钟和接收方时钟之间的差异。 Diff = (PCR-PACKET-RECV-TIME-N - PCR-PACKET-RECV-TIME-1) - (PCR-VALUE-N - PCR-VALUE-1)。
    • 根据 diff 计算偏移的运行平均值并更新接收器时钟的每个数据包的 PTS(表示时间戳)。现在根据这个逻辑,视频播放没有漂移,但音频播放正在漂移时间。所以基本上我面临音视频同步问题。
    • 如果这是 RTP,为什么不只使用 udpsrc 和 rtpbin?您如何将 RTP 数据包放入您的应用程序?要保持 A/V 同步,您需要确保属于一起的音频和视频具有相同的运行时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2020-01-27
    相关资源
    最近更新 更多