MediaRecorder API を使用して、WebM コンテナーで VP8 ビデオを使用して Opus オーディオを取得するにはどうすればよいですか?
残念ながら、現時点では明らかに不可能です。実際、現在、オーディオ/ビデオ ストリーム コーデックに加えて、MIME タイプを設定することさえできないようです。Firefox は、要求されたストリームに基づいて、利用可能なエンコーダーからどのエンコーダーを使用するかを決定しますが、JavaScript API はこの問題についてあまり発言しません。
いつものように、証拠はソースにあります。
ここで、encoded が MIME タイプから初期化されます。
// 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* mime を除いて、渡される mimetypeCreateEncoded
は空の文字列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 バグ レポートを見つけました。