MediaRecorder.isTypeSupported('audio/webm;codecs=opus'); // true on chrome, true on firefox => SO OPUS IT IS!
MediaRecorder.isTypeSupported('audio/ogg;codecs=opus'); // false on chrome, true on firefox
MediaRecorder.isTypeSupported('audio/webm;codecs=vorbis'); // false on chrome, false on firefox
MediaRecorder.isTypeSupported('audio/ogg;codecs=vorbis'); // false on chrome, false on firefox
8条答案
按热度按时间hfsqlsce1#
我还没有看到任何形式的全面清单,但我 * 有 * 设法找到一些东西(通过post on the MediaRecorder API从谷歌的网页更新部分),链接到this test set,似乎揭示了一些事情。
基本上,看起来以下是(在撰写本文时)Chrome中视频/音频的可接受MIME类型:
(编辑于2019-02-10:更新以包括brianchirls'链接查找)
xkftehaa2#
我在
utils.js
中创建了这个小函数,以获得最佳支持的编解码器,并支持多种可能的命名变体(例如:firefox
支持video/webm;codecs:vp9
,但不支持video/webm;codecs=vp9
)您可以根据需要按优先级重新排序
videoTypes
、audioTypes
和codecs
阵列,因此您将始终落在下一个支持的类型上。编辑:添加对音频的支持,修复了
mimetype
重复字符串
w8f9ii693#
对于Firefox,可以在
MediaRecorder.cpp
中找到接受的mimetype,并使用MediaRecorder.isTypeSupported(...)
进行确认范例:
字符串
lo8azlld4#
MediaRecorder对常见音频编解码器的支持:
字符串
Firefox在第一个实现中使用Vorbis进行音频录制,但后来转移到Opus。
所以OPUS它是!
这可能证明有意义:
drkbr07n5#
只需执行下面的代码片段(基于@MillenniumFennec的answer +
audio
+去重+其他一些改进):字符串
svujldwt6#
抱歉,无法添加评论;但我认为有必要指出通过ScriptProcessor或audioWorklet记录原始样本的实现存在缺陷,原因有很多,one here-主要是因为它将您连接到输出节点,并且时钟“校正”发生在您看到数据之前。
所以缺乏音频/wav或其他原始格式真的很要命。
但也许... seems 'audio/webm; chrome支持codecs=pcm'。
kuhbmx9i7#
ISTYPE支持
基于前面的答案(感谢@Fennec),我创建了一个jsfiddle来列出所有支持的类型:https://jsfiddle.net/luiru72/rfhLcu26/5/。我还添加了一个不存在的编解码器(“notatall”)。
在此脚本的结果中,如果从Firefox调用,会发现:
字符串
请注意,您将不会找到**“video/webm; codecs=vp9.0”,你将找不到“video/webm; codecs=notatall”either.
这是因为Firefox上的isTypeSupported能够理解请求“video/webm; codecs=vp9.0”或“video/webm; codecs=notatall”,并且它响应不支持它;但是它不能理解请求“video/webm;编解码器:vp9.0”或“video/webm; codecs:notatall”,所以Firefox上的isTypeSupported(从版本92.0,2021-09-14起)响应它是受支持的。
媒体记录器
我创建了另一个jsfiddle来实验MediaRecorder:https://jsfiddle.net/luiru72/b9q4nsdv/42/的
如果您尝试在Firefox上使用错误的语法“video/webm;编解码器:VP 9,opus或video/webm; codecs:notatall,opus”,你不会得到一个错误,你只会得到一个用VP 8和Opus编码的视频。如果您使用MediaInfo https://sourceforge.net/projects/mediainfo/等工具打开该文件,您会发现它是用VP 8,Opus编码的。
如果指定“video/webm; codecs= vp 8”,你会得到一个错误,因为vp 8不能编码音频。您需要同时指定:“video/webm; codecs= vp 8,opus”,或者你可以只依赖默认值,只指定容器格式“video/webm”。通过这种方式,您现在可以获得使用VP 8,Opus编码的文件,但实际的视频和音频编码器默认值可能会随着时间的推移而更改,因此如果您想确保使用VP 8和Opus,则需要指定它们。
关键要点:
1.你应该使用语法:video/webm; codecs=vp8,notvideo/webm;编解码器:vp 8**
1.创建MediaRecorder时,您应该格外小心:例如,在Firefox上,video/webm;支持codecs= vp 8,但在创建MediaRecorder时,应使用“video/webm”或“video/webm;编解码器= vp 8,opus
1.如果指定了不正确语法,例如video/webm; codecs:vp 9,opus在Firefox中,你不会得到一个错误,你只是得到一个用VP 8,opus编码的文件。只有当您使用MediaInfo之类的程序打开它时,您才会意识到它的格式与预期的格式不同,该程序能够向您显示已使用的编解码器
mjqavswn8#
我今天找到了一个解决方案,它涉及使用
var canRecordVp9 = MediaRecorder.isTypeSupported('video/webm;codecs=vp9');
区分Chrome(和Opera)和Firefox,然后执行
if (canRecordVp9) { mediaRecorder = new MediaRecorder(stream, {mimeType : 'video/webm;codecs=vp9'}); } else { mediaRecorder = new MediaRecorder(stream); }
以相应地构造MediaRecorder。
然后,当抓取斑点时:
if (canRecordVp9) { blob = new Blob([myArrayBuffer], { "type" : "video/webm;codecs=vp9" }); } else { blob = new Blob([myArrayBuffer], { "type" : "video/webm" }); }
个最后,使用FileReader获取blob作为dataUrl:”
字符串
然后我将blobDataUrl保存为webm文件,在Chrome中录制的视频在Firefox中也能正常工作,反之亦然。