Skip to content

Instantly share code, notes, and snippets.

@aarongeorge
Last active December 2, 2017 12:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aarongeorge/750e7f78ba94ab243c6ed47e26626cbd to your computer and use it in GitHub Desktop.
Save aarongeorge/750e7f78ba94ab243c6ed47e26626cbd to your computer and use it in GitHub Desktop.
Get supported audio and video codecs of the browser
/**
* Get Codecs
*
* Usage:
*
* getCodecs() Returns an object with the keys 'audio' and 'video'
* each contain an array of the supported codecs for the browser
*
* Author: Aaron George
* Github: github.com/aarongeorge
* Gist: gist.github.com/aarongeorge/750e7f78ba94ab243c6ed47e26626cbd
*/
const getSupportedCodecs = (codecs = [], type) => {
const testEl = document.createElement(type);
const supportedCodecs = [];
if (Boolean(testEl.canPlayType)) {
codecs.forEach((codec) => {
if (typeof codec.mimeType === 'string') {
codec.mimeType = codec.mimeType.split();
}
for (let i = 0; i < codec.mimeType.length; i++) {
if (Boolean(testEl.canPlayType(codec.mimeType).replace(/^no$/, ''))) {
supportedCodecs.push(codec.name);
break;
}
}
});
};
return supportedCodecs;
};
const getSupportedVideoCodecs = () => {
const codecs = [
{
'name': 'h264',
'mimeType': 'video/mp4; codecs="avc1.42E01E"'
},
{
'name': 'hls',
'mimeType': 'application/x-mpegURL; codecs="avc1.42E01E"'
},
{
'name': 'theora',
'mimeType': 'video/ogg; codecs="theora"'
},
{
'name': 'vp8',
'mimeType': 'video/webm; codecs="vp8, vorbis"'
},
{
'name': 'vp9',
'mimeType': 'video/webm; codecs="vp9"'
}
];
return getSupportedCodecs(codecs, 'video');
};
const getSupportedAudioCodecs = () => {
const codecs = [
{
'name': 'flac',
'mimeType': 'audio/flac;'
},
{
'name': 'm4a',
'mimeType': ['audio/x-m4a;', 'audio/aac;']
},
{
'name': 'mp3',
'mimeType': 'audio/mpeg; codecs="mp3"'
},
{
'name': 'ogg',
'mimeType': 'audio/ogg; codecs="vorbis"'
},
{
'name': 'opus',
'mimeType': ['audio/ogg; codecs="opus"', 'audio/webm; codecs="opus"']
},
{
'name': 'wav',
'mimeType': 'audio/wav; codecs="1"'
}
];
return getSupportedCodecs(codecs, 'audio');
};
const getCodecs = () => {
return {
'audio': getSupportedAudioCodecs(),
'video': getSupportedVideoCodecs()
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment