javascript - 在 Windows 10 的 Chrome 上录制和播放 webm 块时出现音频/视频同步问题
问题描述
问题
我正在Windows 10 中的 Chrome 83 上通过MediaRecorder记录 webm 块,并将这些块发送到其他计算机。这些块正在使用Media Source Extension(MSE)在另一个 Chrome 上播放。
sourceBuffer.appendBuffer(webmChunkData);
在 1 到 1.20 秒之间一切正常。但在那之后,音频/视频同步问题就开始了。目前音视频的差距很小,但随着时间的增加,差距也在拉大。
奇怪的是我们可以在不同的浏览器上看到不同的行为,让我通过
Chrome 的版本在几乎所有操作系统中都是 83+。
相机可以是问题吗?
我认为相机不是问题,因为我在同一台机器上有双操作系统 Fedora 和 Windows。并且 webm 块在 Fedora 上运行良好。
采样率可能是问题吗?
我对此表示怀疑。但是当我比较浏览器在播放时使用的采样率时。chrome://media-internals
显示有和没有同步问题的48000。
来自 Chrome 的警告消息
有同步问题的 Chrome 也显示以下消息chrome://media-internals
问题:
为什么在 Windows 10 的 Chrome 浏览器上进行录制和播放时会出现音频/视频同步问题?
如何消除此同步问题?
解决方案
我相信我有一个解决方法。该问题似乎特定于 Chrome + MediaRecorder + VP8,与 MSE 或平台无关。我在 Mac 12.2.1 上的 Chrome 98 上遇到了同样的问题。此外,如果你减少.start(timeslice)
论点,问题会出现得更快、更严重。
但是...当我使用VP9时,问题并没有表现出来!
我正在使用这样的代码:
function supportedMimeTypes(): string[] {
// From least desirable to most desirable
return [
// most compatible, but chrome creates bad chunks
'video/webm;codecs=vp8,opus',
// works in chrome, firefox falls back to vp8
'video/webm;codecs=vp9,opus'
].filter(
(m) => MediaRecorder.isTypeSupported(m)
);
}
const mimeType = supportedMimeTypes().pop();
if (!mimeType) throw new Error("Could not find a supported mime-type");
const recorder = new MediaRecorder(stream, {
// be sure to use a mimeType with a specific `codecs=` as otherwise
// chrome completely ignores it and uses video/x-matroska!
// https://stackoverflow.com/questions/64233494/mediarecorder-does-not-produce-a-valid-webm-file
mimeType,
});
recorder.start(1000)
生成的 VP9 似乎可以在 Firefox 中播放,而记录在 Firefox 中的 VP8 在 Chrome 中也可以很好地播放。
推荐阅读
- gitlab - 带有 Gitlab Runner 的 Google Cloud Compute Engine
- jruby - 嵌入式 JRuby 访问 ScriptEngine 可用的类
- python - 在 Vim 中执行 python 脚本的行
- mysql - Prisma 2 对具有角色的用户的高效多对多查询
- javascript - 对 POST 请求使用 fetch 将数据添加到 JSON 服务器数据库
- python - 如何将系列特定线 y=x 添加到 Altair 中的多面(或类似)双轴图表?
- spring - 为什么在 Spring 中构建 DataSource 时需要 @ConfigurationProperties?
- python - 在开发中使用生产媒体文件 - Django
- google-data-studio - 重复客户被多次统计 BigQuery 和数据洞察
- snowflake-cloud-data-platform - 所有用户共享的 snowsql