Указание кодеков с помощью 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 с помощью MediaRecorder API?

Firefox версии 44.0.2


person Brad    schedule 17.02.2016    source источник


Ответы (2)


Ознакомьтесь с Chrome LayoutTests для isTypeSupported(), используемый там mimeType должен применяться к конструктору MediaRecorder.

person miguelao    schedule 27.09.2016
comment
ваша ссылка неработающая она не ссылается на ресурс - person Marcos J.D Junior; 09.02.2021

Как я могу получить звук 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.

person Alexander O'Mara    schedule 17.02.2016