7

MediaRecorder APIで使用されるコーデックを指定するにはどうすればよいですか? 私が見る唯一のオプションは、実際には十分ではないmimeType用です。mimeType オプションにコーデックを詰め込んでもうまくいかないようです。

var mediaRecorder = new MediaRecorder(
    outputMediaStream
  ),
  {
    mimeType: 'video/webm; codecs="opus,vp8"'
  }
);

これにより、Vorbis と VP8 を使用した WebM ストリームが生成されます。

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 は Ogg コンテナーに Opus オーディオを出力します。

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

MediaRecorder API を使用して、WebM コンテナーで VP8 ビデオを使用して Opus オーディオを取得するにはどうすればよいですか?

Firefox v44.0.2

4

2 に答える 2

9

MediaRecorder API を使用して、WebM コンテナーで VP8 ビデオを使用して Opus オーディオを取得するにはどうすればよいですか?

残念ながら、現時点では明らかに不可能です。実際、現在、オーディオ/ビデオ ストリーム コーデックに加えて、MIME タイプを設定することさえできないようです。Firefox は、要求されたストリームに基づいて、利用可能なエンコーダーからどのエンコーダーを使用するかを決定しますが、JavaScript API はこの問題についてあまり発言しません。

いつものように、証拠はソースにあります。

ここで、encoded が MIME タイプから初期化されます。

からの抜粋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* mime を除いて、渡される mimetypeCreateEncodedは空の文字列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 バグ レポートを見つけました。

于 2016-02-17T21:21:39.927 に答える