How can I specify the codecs used with the MediaRecorder API? The only option I see is for mimeType which isn't really sufficient. Cramming in the codecs in the mimeType option doesn't seem to work.
var mediaRecorder = new MediaRecorder(
outputMediaStream
),
{
mimeType: 'video/webm; codecs="opus,vp8"'
}
);
This results in a WebM stream with Vorbis and 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)
If I make a MediaStream that only has an audio track (no video), then the MediaRecorder outputs Opus audio in an Ogg container:
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
How can I get Opus audio with VP8 video in a WebM container with the MediaRecorder API?
Firefox v44.0.2
Check out the Chrome LayoutTests for
isTypeSupported()
, themimeType
used there should be applicable to theMediaRecorder
constructor.Unfortunately this is apparently impossible at this time. In fact it seems not even the mimetype can currently be set, in addition to the audio/video stream codecs. Firefox decides what encoder to used from those that are available, based on the requested streams, and the JavaScript API doesn't offer much say in the matter.
As always, the proof is in the source.
Here is where the encoded is initialized from the mimetype.
Excerpt from
dom/media/MediaRecorder.cpp
:A we can see, except for the 3GPP* mimes, the mimetype passed to
CreateEncoded
is an empty stringNS_LITERAL_STRING("")
.This comment does offer hope for the future though:
Excerpts from
dom/media/encoder/MediaEncoder.cpp
:The first case for video with WebM enabled.
The final case for just audio with OGG enabled.
Base on this code, I think we can conclude that at this point it's not possible, but it does appear to be on the roadmap.
@jib located the following related Mozilla bugs reports.