Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google chrome MediaRecorder未生成有效的WebM文件_Google Chrome_Video_Mediarecorder_Webm_Matroska - Fatal编程技术网

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);
}
};
}
意见:

  • Chrome对
    isTypeSupported('video/webm;codecs=h264,opus')
    做出了
    true
    的响应,但Chrome实际上并不支持这种组合,也就是说,这种响应实际上是不正确的,并且违背了
    isTypeSupported()
    的全部目的

  • Chrome忽略了我们在
    MediaRecorder
    构造函数中传递的mimetype,而是返回
    video/x-matroska;codecs=avc1,opus
    。这将不起作用,因为
    不会播放matroska mimetype

  • 2种解决方案:

    • 哈基:录制后,只需将mimetype更改回
      video/webm;codecs=h264,opus
      。文件内容仍将显示“Matroska”,但Chrome上的
      将播放它。这是一个糟糕的解决方案,因为我们传入了错误的mimetype,它与内容不匹配。其他软件——或者更高版本的Chrome——可能会打破它
    • 正确:不要使用H.264,而是使用VP9或VP8。Chrome支持两者,Firefox支持VP8,它们工作正常。作为奖励,它们是开放的,而H.264充满了软件专利。根据硬件编码器的实现,VP8/9也可以提供更好的图像质量结果

    如果是这样的话,那么上面描述的行为就是一个Chrome bug,对吗?它不是bug,它是正确的,因为Chrome支持这些东西。。。谷歌是VP8和VP9的创建者,因此它给出了
    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视频。这似乎是相关的