Указание кодеков с помощью MediaRecorder
Как я могу указать кодеки, используемые с MediaRecorder API? Единственный вариант, который я вижу, - это mimeType, которого на самом деле недостаточно. Похоже, что вставка в кодеки в опции mimeType не работает.
var mediaRecorder = new MediaRecorder(
outputMediaStream
),
{
mimeType: 'video/webm; codecs="opus,vp8"'
}
);
В результате получается поток WebM с Vorbis и VP8:
FFMPEG STDERR: Input #0, matroska,webm, from 'pipe:':
Metadata:
encoder : QTmuxingAppLibWebM-0.0.1
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0(eng): Video: vp8, yuv420p, 640x360, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Stream #0:1(eng): Audio: vorbis, 44100 Hz, stereo, fltp (default)
Если я создаю MediaStream, который имеет только звуковую дорожку (без видео), то MediaRecorder выводит аудио Opus в контейнер Ogg:
FFMPEG STDERR: Input #0, ogg, from 'pipe:':
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp
Metadata:
ENCODER : Mozilla44.0.2
Как получить аудио Opus с видео VP8 в контейнере WebM с помощью API MediaRecorder?
Firefox v44.0.2
2 ответа
Проверьте Chrome LayoutTests для isTypeSupported()
, mimeType
используемый там должен быть применим к MediaRecorder
конструктор.
Как получить аудио Opus с видео VP8 в контейнере WebM с помощью API MediaRecorder?
К сожалению, в настоящее время это, по-видимому, невозможно. На самом деле кажется, что даже mimetype в настоящее время не может быть установлен, в дополнение к кодекам аудио / видео потока. Firefox решает, какой кодер использовать из доступных, на основе запрошенных потоков, и JavaScript API не дает особого мнения в этом вопросе.
Как всегда, доказательство в источнике.
Вот где кодированный инициализируется из mimetype.
Выдержка изdom/media/MediaRecorder.cpp
:
// Allocate encoder and bind with union stream.
// At this stage, the API doesn't allow UA to choose the output mimeType format.
// Make sure the application has permission to assign AUDIO_3GPP
if (mRecorder->mMimeType.EqualsLiteral(AUDIO_3GPP) && CheckPermission("audio-capture:3gpp")) {
mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(AUDIO_3GPP),
mRecorder->GetAudioBitrate(),
mRecorder->GetVideoBitrate(),
mRecorder->GetBitrate(),
aTrackTypes);
} else if (mRecorder->mMimeType.EqualsLiteral(AUDIO_3GPP2) && CheckPermission("audio-capture:3gpp2")) {
mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(AUDIO_3GPP2),
mRecorder->GetAudioBitrate(),
mRecorder->GetVideoBitrate(),
mRecorder->GetBitrate(),
aTrackTypes);
} else {
mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(""),
mRecorder->GetAudioBitrate(),
mRecorder->GetVideoBitrate(),
mRecorder->GetBitrate(),
aTrackTypes);
}
А мы можем видеть, за исключением мимов 3GPP*, миметип передан в CreateEncoded
пустая строка NS_LITERAL_STRING("")
,
Этот комментарий вселяет надежду на будущее, хотя:
// At this stage, the API doesn't allow UA to choose the output mimeType format.
Выдержки изdom/media/encoder/MediaEncoder.cpp
:
Первый случай для видео с включенным WebM.
else if (MediaEncoder::IsWebMEncoderEnabled() &&
(aMIMEType.EqualsLiteral(VIDEO_WEBM) ||
(aTrackTypes & ContainerWriter::CREATE_VIDEO_TRACK))) {
if (aTrackTypes & ContainerWriter::CREATE_AUDIO_TRACK) {
audioEncoder = new VorbisTrackEncoder();
NS_ENSURE_TRUE(audioEncoder, nullptr);
}
videoEncoder = new VP8TrackEncoder();
writer = new WebMWriter(aTrackTypes);
NS_ENSURE_TRUE(writer, nullptr);
NS_ENSURE_TRUE(videoEncoder, nullptr);
mimeType = NS_LITERAL_STRING(VIDEO_WEBM);
}
Финальный случай только для аудио с включенным OGG.
else if (MediaDecoder::IsOggEnabled() && MediaDecoder::IsOpusEnabled() &&
(aMIMEType.EqualsLiteral(AUDIO_OGG) ||
(aTrackTypes & ContainerWriter::CREATE_AUDIO_TRACK))) {
writer = new OggWriter();
audioEncoder = new OpusTrackEncoder();
NS_ENSURE_TRUE(writer, nullptr);
NS_ENSURE_TRUE(audioEncoder, nullptr);
mimeType = NS_LITERAL_STRING(AUDIO_OGG);
}
Основываясь на этом коде, я думаю, что мы можем сделать вывод, что на данный момент это невозможно, но, похоже, оно есть в дорожной карте.
jib следующие сообщения об ошибках Mozilla.