Все типы MIME, поддерживаемые MediaRecorder в Firefox и Chrome?
Где я могу найти список всех типов MIME, которые поддерживаются Firefox
или же Chrome
? Все примеры, которые я видел до сих пор, используют video/webm
только.
9 ответов
Я еще не видел какого-либо исчерпывающего списка для Firefox, но мне удалось найти что-то (через сообщение об API MediaRecorder из раздела веб-обновлений Google), которое ссылается на этот набор тестов, который, кажется, проливает свет на некоторые вещи.
По сути, похоже, что (на момент написания) были приняты MIME-типы для видео / аудио в Chrome:
- видео / WebM
- видео / WebM; кодеки =vp8
- видео / WebM; кодеки =vp9
- видео / WebM; кодеки =vp8.0
- видео / WebM; кодеки =vp9.0
- видео / WebM; кодеки =H264
- видео / WebM; кодеки =H264
- видео / WebM; кодеки = AVC1
- видео / WebM, кодеки =vp8, опус
- видео /WEBM, кодеки =VP8,OPUS
- видео / WebM, кодеки =vp9, опус
- видео / WebM, кодеки =vp8,vp9, опус
- видео / WebM, кодеки =h264, опус
- видео / WebM, кодеки =h264,vp9, опус
видео / х-Matroska; кодеки = AVC1
аудио / WebM
- аудио / WebM; кодеки = опус
Я сделал эту небольшую функцию в своем
utils.js
чтобы получить лучший поддерживаемый кодек с поддержкой нескольких возможных вариантов именования (пример:
firefox
служба поддержки
video/webm;codecs:vp9
но нет
video/webm;codecs=vp9
Вы можете изменить порядок
VIDEO_CODECS
массив по приоритету, поэтому вы всегда можете перейти к следующему поддерживаемому кодеку.
function getSupportedMimeTypes() {
const VIDEO_TYPES = [
"webm",
"ogg",
"mp4",
"x-matroska"
];
const VIDEO_CODECS = [
"vp9",
"vp9.0",
"vp8",
"vp8.0",
"avc1",
"av1",
"h265",
"h.265",
"h264",
"h.264",
"opus",
];
const supportedTypes = [];
VIDEO_TYPES.forEach((videoType) => {
const type = `video/${videoType}`;
VIDEO_CODECS.forEach((codec) => {
const variations = [
`${type};codecs=${codec}`,
`${type};codecs:${codec}`,
`${type};codecs=${codec.toUpperCase()}`,
`${type};codecs:${codec.toUpperCase()}`
]
variations.forEach(variation => {
if(MediaRecorder.isTypeSupported(variation))
supportedTypes.push(variation);
})
});
if (MediaRecorder.isTypeSupported(type)) supportedTypes.push(type);
});
return supportedTypes;
}
const supportedMimeTypes = getSupportedMimeTypes();
console.log('Best supported mime types by priority : ', supportedMimeTypes[0])
console.log('All supported mime types ordered by priority : ', supportedMimeTypes)
Для Firefox принятые миметипы можно найти в MediaRecorder.cpp
и подтвердил использование MediaRecorder.isTypeSupported(...)
Пример:
21:31:27.189 MediaRecorder.isTypeSupported('video/webm;codecs=vp8')
21:31:27.135 true
21:31:41.598 MediaRecorder.isTypeSupported('video/webm;codecs=vp8.0')
21:31:41.544 true
21:32:10.477 MediaRecorder.isTypeSupported('video/webm;codecs=vp9')
21:32:10.431 false
21:31:50.534 MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')
21:31:50.479 true
21:31:59.198 MediaRecorder.isTypeSupported('audio/webm')
21:31:59.143 false
MediaRecorder поддержка общих аудио кодеков:
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
Firefox использовал Vorbis для записи звука в первой реализации, но с тех пор перешел на Opus.
Так что это OPUS!
Это может оказаться интересным:
- MediaRecorder в настоящее время является экспериментальным в Safari (август 2020 г.)
- Caniuse Opus
- caniuse MediaRecorder
Извините, не могу добавлять комментарии; но счел важным отметить: реализация записи сырых сэмплов через ScriptProcessor или audioWorklet ошибочна по ряду причин, одна из которых здесь - в основном потому, что она соединяет вас с выходным узлом, а "коррекция" часов происходит до того, как вы увидите данные.
Так что отсутствие аудио /wav или другого необработанного формата действительно убивает.
Но может быть.... кажется, что 'audio/webm;codecs=pcm' поддерживается в Chrome.
Что я использую для обнаружения поддерживаемых форматов:
const containers = ['webm', 'ogg', 'mp4', 'x-matroska', '3gpp', '3gpp2',
'3gp2', 'quicktime', 'mpeg', 'aac', 'flac', 'wav']
const codecs = ['vp9', 'vp8', 'avc1', 'av1', 'h265', 'h.265', 'h264',
'h.264', 'opus', 'pcm', 'aac', 'mpeg', 'mp4a'];
const supportedAudios = containers.map(format => `audio/${format}`)
.filter(mimeType => MediaRecorder.isTypeSupported(mimeType))
const supportedAudioCodecs = supportedAudios.flatMap(audio =>
codecs.map(codec => `${audio};codecs=${codec}`))
.filter(mimeType => MediaRecorder.isTypeSupported(mimeType))
console.log('Supported Audio formats:', supportedAudios)
console.log('Supported Audio codecs:', supportedAudioCodecs)
const supportedVideos = containers.map(format => `video/${format}`)
.filter(mimeType => MediaRecorder.isTypeSupported(mimeType))
const supportedVideoCodecs = supportedVideos.flatMap(video =>
codecs.map(codec => `${video};codecs=${codec}`))
.filter(mimeType => MediaRecorder.isTypeSupported(mimeType))
console.log('Supported Video formats:', supportedVideos)
console.log('Supported Video codecs:', supportedVideoCodecs)
Итоги 2023 года:
macOS
Сафари 16.6:
Supported Audio formats: – ["audio/mp4"]
Supported Audio codecs: – ["audio/mp4;codecs=avc1", "audio/mp4;codecs=mp4a"]
Supported Video formats: – ["video/mp4"]
Supported Video codecs: – ["video/mp4;codecs=avc1", "video/mp4;codecs=mp4a"]
Хром 116:
Supported Audio formats: ['audio/webm']
Supported Audio codecs: ['audio/webm;codecs=opus', 'audio/webm;codecs=pcm']
Supported Video formats: ['video/webm', 'video/x-matroska']
Supported Video codecs: ['video/webm;codecs=vp9', 'video/webm;codecs=vp8',
'video/webm;codecs=avc1', 'video/webm;codecs=av1', 'video/webm;codecs=h264',
'video/webm;codecs=opus', 'video/webm;codecs=pcm', 'video/x-matroska;codecs=vp9',
'video/x-matroska;codecs=vp8', 'video/x-matroska;codecs=avc1',
'video/x-matroska;codecs=av1', 'video/x-matroska;codecs=h264',
'video/x-matroska;codecs=opus', 'video/x-matroska;codecs=pcm']
Окна
Все браузеры на базе Chrome и Blink, такие как Edge и Vivaldi, поддерживают ту же поддержку, что и Chrome macOS.
Фаерфокс 117:
Supported Audio formats: ["audio/webm", "audio/ogg"]
Supported Audio codecs: ["audio/webm;codecs=opus", "audio/ogg;codecs=opus"]
Supported Video formats: ["video/webm"]
Supported Video codecs: ["video/webm;codecs=vp8", "video/webm;codecs=opus"]
ПОДДЕРЖИВАЕМЫЕ ТИПЫ
Основываясь на предыдущих ответах (спасибо @Fennec), я создал jsfiddle, чтобы перечислить все поддерживаемые типы: https://jsfiddle.net/luiru72/rfhLcu26/5/. Я также добавил несуществующий кодек ("notatall").
Среди результатов этого скрипта, если вы вызовете его из Firefox , вы обнаружите:
video/webm;codecs:vp9.0
video/webm;codecs=vp8
video/webm;codecs:vp8
video/webm;codecs:notatall
Обратите внимание, что вы не найдете «video / webm; codecs = vp9.0» , и вы также не найдете «video / webm; codecs = notatall» .
Это связано с тем, что isTypeSupported в Firefox может понять запрос «video / webm; codecs = vp9.0» или «video / webm; codecs = notatall» и отвечает, что он не поддерживается; но он не может понять запрос "video / webm; codecs: vp9.0" или "video / webm; codecs: notatall", поэтому isTypeSupported в Firefox (начиная с версии 92.0, 2021-09-14) отвечает, что он поддерживается.
МЕДИА ЗАКАЗ
Я создал еще один jsfiddle для экспериментов с MediaRecorder: https://jsfiddle.net/luiru72/b9q4nsdv/42/
Если вы попытаетесь создать MediaRecorder в Firefox, используя неправильный синтаксис «video / webm;codecs:vp9,opus» или «video / webm;codecs:notatall,opus», вы не получите ошибку, вы просто получите закодированное видео в VP8 и Opus. Если вы откроете файл с помощью такого инструмента, как MediaInfo https://sourceforge.net/projects/mediainfo/ , вы поймете, что он закодирован в VP8,Opus.
Если вы укажете «video / webm; codecs =vp8», вы получите сообщение об ошибке, потому что vp8 не может кодировать аудио. Вам нужно указать оба: «video / webm; codecs =vp8, opus», или вы можете просто полагаться на значения по умолчанию, указав только формат контейнера «video / webm». Таким образом, теперь вы получаете файл, закодированный в VP8,Opus, но фактические значения по умолчанию для видео- и аудиокодера могут измениться со временем, поэтому, если вы хотите быть уверены, что используются VP8 и Opus, вам необходимо указать их.
Ключевые моменты на вынос:
вы должны использовать синтаксис: video / webm; codecs =vp8 , not video / webm;codecs:vp8
при создании MediaRecorder следует проявлять особую осторожность: например, в Firefox поддерживается video / webm; codecs =vp8 поддерживается, но при создании MediaRecorder следует использовать "video / webm" или "video / webm; codecs =vp8". , опус
если вы укажете неверный синтаксис, например video / webm;codecs:vp9,opus в Firefox, вы не получите ошибку, вы просто получите файл, который закодирован в VP8,opus. Вы поймете, что он имеет формат, отличный от предполагаемого, если вы откроете его с помощью такой программы, как MediaInfo, которая может показать вам использованные кодеки.
Сегодня я нашел решение, которое предполагает использование
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, чтобы получить большой двоичный объект как dataUrl:
var reader = new FileReader();
reader.onload = function(event)
{
var blobDataUrl = event.target.result;
}
reader.readAsDataURL(blob);`
Затем я сохраняю blobDataUrl как файл webm, и видео, записанные в Chrome, нормально работают в Firefox, и наоборот.