Как я могу получить звук Opus с видео VP8 в контейнере WebM с помощью MediaRecorder API?
К сожалению, в настоящее время это, по-видимому, невозможно. На самом деле кажется, что в настоящее время нельзя установить даже mimetype, в дополнение к кодекам аудио / видеопотока. Firefox решает, какой кодировщик использовать из доступных, на основе запрошенных потоков, а API JavaScript не дает особого мнения по этому поводу.
Доказательство как всегда в первоисточнике.
Здесь кодированное значение инициализируется из mimetype.
// 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);
}
Мы можем видеть, за исключением mimes 3GPP *, тип mime, переданный в CreateEncoded
, является пустой строкой NS_LITERAL_STRING("")
.
Однако этот комментарий вселяет надежду на будущее:
// At this stage, the API doesn't allow UA to choose the output mimeType format.
Первый случай для видео с включенным 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.
person
Alexander O'Mara
schedule
17.02.2016