【问题标题】:Pion WebRTC Audio stream cutting out while video works视频工作时 Pion WebRTC 音频流中断
【发布时间】:2021-08-09 10:07:12
【问题描述】:

我正在尝试通过 Pion WebRTC 将 MP4 视频发送到浏览器。

使用 FFmpeg,我将其拆分为 Opus OGG 流和 Annex-B H.264 视频流。虽然视频工作正常,但音频不断进出。它可以正常播放几秒钟,然后停止一秒钟,然后继续。

这是我用于音频的 FFmpeg 命令:

ffmpeg -i demo.mp4 -c:a libopus -vn -page_duration 20000 demo.ogg

这是我的发射器(缩短):

var lastGranule uint64
for {
    pageData, pageHeader, err := ogg.ParseNextPage() // Uses Pion OggReader

    // Taken from the play-from-disk example
    sampleCount := float64(pageHeader.GranulePosition - lastGranule)
    lastGranule = pageHeader.GranulePosition
    sampleDuration := time.Duration((sampleCount/48000)*1000) * time.Millisecond

    err = audioTrack.WriteSample(media.Sample{Data: pageData, Duration: sampleDuration})
    util.HandleError(err)

    time.Sleep(sampleDuration)
}

我尝试将延迟硬编码为 15 毫秒,这解决了它正在切断的问题,但随后它随机播放太快或开始跳过。由于在更新我的 FFmpeg 命令(添加关键帧并删除 b 帧)之前我的视频出现故障,我认为这也是编码器问题。

这可能是什么原因?

更新:在 Chrome 中使用 WebRTC 登录,我发现了以下经常出现的日志行:

[27216:21992:0809/141533.175:WARNING:rtcp_receiver.cc(452)] 30 RTCP blocks were skipped due to being malformed or of unrecognized/unsupported type, during the past 10 second period.

这可能是剪切的原因,尽管我无法弄清楚为什么它会收到格式错误的数据。

【问题讨论】:

    标签: go ffmpeg webrtc


    【解决方案1】:

    最终的问题是由于 Go 本身的问题 #44343 导致的睡眠时间不准确。它导致样本不是以恒定速率发送,而是以随机的 5 到 15 毫秒之间的速率发送,从而导致流不连贯。

    Sean DuBois 和我在 Pion 存储库中最新的 play-from-diskplay-from-disk-h264 示例中修复了这个问题,方法是将 for-loop 和 Sleep() 替换为 Ticker,这样更准确。

    【讨论】:

    • 感谢您对 Twometer 的所有帮助!很高兴将来其他人不必处理这个问题。
    • @SeanDuBois 乐于助人! :-)
    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2014-02-25
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多