Pion WebRTC 音频流在视频工作时中断
Pion WebRTC Audio stream cutting out while video works
我正在尝试通过 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 帧)之前我的视频有问题,我认为这也是一个编码器问题。
这可能是什么原因造成的?
更新:使用 WebRTC 登录 Chrome,我发现了以下经常出现的日志行:
[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本身的问题#44343导致睡眠时间不准确。它导致样本不是以恒定速率发送,而是以随机间隔 5 到 15 毫秒的速率发送,导致断断续续的流。
Sean DuBois 和我通过将 for
-循环和 Sleep()
替换为 Ticker
,更准确。
我正在尝试通过 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 帧)之前我的视频有问题,我认为这也是一个编码器问题。
这可能是什么原因造成的?
更新:使用 WebRTC 登录 Chrome,我发现了以下经常出现的日志行:
[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本身的问题#44343导致睡眠时间不准确。它导致样本不是以恒定速率发送,而是以随机间隔 5 到 15 毫秒的速率发送,导致断断续续的流。
Sean DuBois 和我通过将 for
-循环和 Sleep()
替换为 Ticker
,更准确。