Google chrome MediaRecorder未生成有效的WebM文件
Google chrome MediaRecorder未生成有效的WebM文件,google-chrome,video,mediarecorder,webm,matroska,Google Chrome,Video,Mediarecorder,Webm,Matroska,MediaRecorder.isTypeSupported()为'video/webm','video/webm'返回true;编解码器=avc1',和“视频/webm”;编解码器=vp9' 但是,只有mimeType='video/webm;codecs=vp9'生成有效的webm文件('video/webm;codecs=vp9,opus') 将mimeType设置为“video/webm”和“video/webm”;编解码器=avc1“结果”视频/x-matroska;codecs=avc
MediaRecorder.isTypeSupported()
为'video/webm','video/webm'返回true
;编解码器=avc1',和“视频/webm”;编解码器=vp9'
但是,只有mimeType='video/webm;codecs=vp9'生成有效的webm文件('video/webm;codecs=vp9,opus')
将mimeType设置为“video/webm”和“video/webm”;编解码器=avc1“结果”视频/x-matroska;codecs=avc1,opus的文件,它不是有效的webm视频
这是MediaRecorder bug、Chrome bug还是我遗漏了什么\
软件:Chrome85,MacOS10.15。我没有在Windows或Linux上尝试过
但是,只有mimeType='video/webm;codecs=vp9'生成有效的webm文件。
这是MediaRecorder bug、Chrome bug还是我遗漏了什么?
WebM是VP8和VP9视频编解码器的正确a/v媒体容器
AVC1视频编解码器属于MPEG容器(.mp4
,.m4v
)。此视频编解码器也可以包含在MKV媒体文件(Matroska
.MKV
)中。复制:
const wantMimeType = 'video/webm;codecs=h264,opus';
if (MediaRecorder.isTypeSupported(wantMimeType)) {
let mediaRecorder = new MediaRecorder(stream, {
mimeType: wantMimeType,
});
// ...drive the recorder
mediaRecorder.onstop = (event) => {
try {
// returns 'video/x-matroska;codecs=avc1,opus' in Chrome,
// and the binary file content also says Matroska instead of WebM
let mimetype = mediaRecorder.mimeType;
if (!mimeType.startsWith('video/webm')) {
throw new Error(`We requested "${wantMimeType},
but the browser gave us "${mediaRecorder.mimeType}"`);
}
let blob = new Blob(chunks, { type: mimeType });
// ...convert to data: URL
// ...play it in <video src="data:..."> // won't work, if Matroska
} catch (ex) {
alert(ex);
}
};
}
const-wantMimeType='video/webm;编解码器=h264,opus';
if(MediaRecorder.isTypeSupported(WantMiType)){
让mediaRecorder=新的mediaRecorder(流{
mimeType:wantMimeType,
});
//…开录音机
mediaRecorder.onstop=(事件)=>{
试一试{
//在Chrome中返回“video/x-matroska;codecs=avc1,opus”,
//二进制文件内容也使用Matroska而不是WebM
让mimetype=mediaRecorder.mimetype;
如果(!mimeType.startsWith('video/webm')){
抛出新错误(`We requested“${wantMimeType}),
但是浏览器给了我们“${mediaRecorder.mimeType}`”;
}
设blob=newblob(块,{type:mimeType});
//…转换为数据:URL
//…如果马特罗斯卡的话,在……中播放它是行不通的
}捕获(ex){
警报(ex);
}
};
}
意见:
isTypeSupported('video/webm;codecs=h264,opus')
做出了true
的响应,但Chrome实际上并不支持这种组合,也就是说,这种响应实际上是不正确的,并且违背了isTypeSupported()
的全部目的
MediaRecorder
构造函数中传递的mimetype,而是返回video/x-matroska;codecs=avc1,opus
。这将不起作用,因为
不会播放matroska mimetype
- 哈基:录制后,只需将mimetype更改回
。文件内容仍将显示“Matroska”,但Chrome上的video/webm;codecs=h264,opus
将播放它。这是一个糟糕的解决方案,因为我们传入了错误的mimetype,它与内容不匹配。其他软件——或者更高版本的Chrome——可能会打破它 - 正确:不要使用H.264,而是使用VP9或VP8。Chrome支持两者,Firefox支持VP8,它们工作正常。作为奖励,它们是开放的,而H.264充满了软件专利。根据硬件编码器的实现,VP8/9也可以提供更好的图像质量结果
MediaRecorder.isTypeSupported()=true
当您查询codecs=avc1
或video/webm
时,您可以看到,您不能将MPEG的avc1编解码器放在竞争对手Google的webm容器中,而期望有一个有效的工作文件。我的答案告诉您使用什么编解码器来避免损坏文件,我相信这是Chrome的错误,因为将mimeType设置为“video/webm”(未指定编解码器)会导致“video/x-matroska;codecs=avc1,opus文件,它不是有效的webm视频。必须始终为容器指定编解码器。我认为H264是Chrome默认的编解码器(参见:Chrome's的第24行)。您试图解决的代码/应用程序中的具体问题是什么?是否有任何东西阻止你的应用程序正常工作?如果东西(编解码器和容器)使用正确,就不会有bug。检查是否支持某个容器(MP4、MKV、WebM),然后为该容器使用正确的编解码器(VP8/VP9是WebM,H264是MKV或MP4)。我认为这是Chrome的错误,因为将mimeType设置为“video/WebM”会导致“video/x-matroska”;codecs=avc1,opus的文件,它不是有效的webm视频。这似乎是相关的