Получение mimeType из MediaRecorder, который не был инициализирован с помощью mimeType

Я использую API MediaRecorder для записи некоторых медиафайлов на странице. В моей инициализации MediaRecorder я не указываю тип содержимого, поскольку мне ничего особенного не требуется. Браузер может выбрать то, что он хочет.

var mediaRecorder = new MediaRecorder(stream);

Однако, когда приходит время сохранить эту запись, мне нужно знать mimeType для большого двоичного объекта, чтобы я мог определить разумное расширение имени файла.

Свойство MediaRecorder.mimeType — это то, что мне нужно, но это пустая строка. Он не устанавливает mimeType по умолчанию для MediaRecorder, поэтому у меня, похоже, нет возможности узнать, что такое mimeType по умолчанию.

  mediaRecorder.onstop = function (e) {
    var mediaFileUrl = window.URL.createObjectURL(
      new Blob(chunks, {type: /* TODO: mime type here */})
    );

    $('<a>').attr({
      href: mediaFileUrl,
      download: 'Recording.?????' // TODO: Use mime type to figure out file name extension
    })[0].click();

    window.URL.revokeObjectURL(mediaFileUrl);
    chunks = [];
  }

person Brad    schedule 12.07.2016    source источник
comment
@guest271314 guest271314 Массив, содержащий сегменты закодированных медиафайлов.   -  person Brad    schedule 15.07.2016
comment
В каком формате закодирован? Является ли chunks ArrayBuffer? Не могли бы вы предоставить пользователю возможность выбрать тип MIME для записи до начала записи? Затем установите Blob type на выбранный MIME вместо разрешения браузеру выбирать тип MIME; который, кажется, устанавливает пустую строку? Вы также можете использовать isTypeSupported, чтобы определить, может ли браузер воспроизводить определенный тип мультимедиа.   -  person guest271314    schedule 15.07.2016
comment
См. раздел isTypeSupported.   -  person guest271314    schedule 15.07.2016
comment
См. addpipe.com/blog/mediarecorder-api.   -  person guest271314    schedule 15.07.2016


Ответы (2)


В настоящее время нет возможности получить необходимую информацию из коробки.

Текущая спецификация W3C гласит, что если mimetype не указан (вами):

UA будет использовать формат по умолчанию для конкретной платформы.

Это то, что происходит в вашем случае, вы не указываете какой-либо MIME-тип и UA, браузер выбирает наиболее подходящий для вас тип, и нет никаких указаний относительно способа вернуть выбранный формат.

Прямо сейчас единственный метод, который может приблизить вас к этому, - это использовать isTypeSupported, который обеспечивает некоторое обнаружение поддержки мультимедиа, к сожалению, с количеством MIME-типов, браузеров, платформ, ставок и т. д., он не очень подходит для написания функции, которая будет вернуть выбранный MIME-тип с количеством доступных комбинаций: video/webm; codecs="vp", video/mp4; codecs="avc1.4d4015" и т. д.

Первоначальная идея, возможно, заключалась в том, чтобы скрыть все эти детали от пользователя, но действительно, ваш конкретный случай, когда пользователю необходимо знать MIME-тип, чтобы, например, сохранить сгенерированный файл, возникает очень часто.

В настоящее время открыт вопрос с предложением предоставить способ получения всех поддерживаемых носителей типы, упорядоченные по слабым предпочтениям, что означает, что первый возвращенный тип носителя будет типом по умолчанию, выбранным UA, если он не указан.

Выпуск был создан в мае, но на данный момент никаких последующих действий.

person HiDeo    schedule 15.07.2016
comment
Обновление: ошибка Chrome crbug.com/615940 выявила аналогичную проблему и была исправлена, поэтому созданные закодированные BLOB-объекты должны были иметь mimeType указано правильно. - person miguelao; 28.09.2016

Для аудио по умолчанию используется audio/ogg, а для видео video/ogg. Протестировано как в Chrome, так и в Firefox с VLC.

Демо: https://codecanister.com/Project/d547eed9/9/result

person jlynch630    schedule 14.07.2016
comment
Это не гарантируется и может быть изменено в будущих версиях браузера. Кроме того, я обычно получаю webm, а не ogg. - person Brad; 15.07.2016
comment
Хотя это правда, сейчас это единственный способ получить правильный мим. Единственным другим вариантом является прослушивание содержимого на стороне клиента, что не так просто. - person jlynch630; 15.07.2016
comment
Можете ли вы убедительно показать, что это невозможно с существующими API? (Если не считать обнюхивания шрифтов.) Я бы с радостью присудил награду тому, кто сможет окончательно доказать, что это невозможно. - person Brad; 15.07.2016
comment
У меня работает, может проблема на вашей стороне? - person jlynch630; 15.07.2016
comment
@jDawg удалось загрузить страницу - person guest271314; 17.07.2016