2016-07-12 4 views
0

J'utilise l'API MediaRecorder pour enregistrer certains médias sur une page. Dans mon initialisation MediaRecorder, je ne spécifie pas le type de contenu, car je n'ai besoin d'aucun élément particulier. Le navigateur peut choisir ce qu'il veut.Obtention du mimeType à partir d'un MediaRecorder qui n'a pas été initialisé avec un mimeType

var mediaRecorder = new MediaRecorder(stream); 

Cependant, quand vient le temps de sauver que l'enregistrement, je dois connaître le mimeType pour le blob, et je peux déterminer une extension de nom de fichier raisonnable.

La propriété MediaRecorder.mimeType est ce que je veux, mais c'est une chaîne vide. Il ne définit pas mimeType par défaut pour MediaRecorder, donc je n'ai apparemment aucun moyen de savoir ce que le mimeType par défaut est.

mediaRecorder.onstop = function (e) { 
    var mediaFileUrl = window.URL.createObjectURL(
     new Blob(chunks, {type: /* TODO: mime type here */}) 
    ); 

    $('<a>').attr({ 
     href: mediaFileUrl, 
     download: 'Recording.?????' // TODO: Use mime type to figure out file name extension 
    })[0].click(); 

    window.URL.revokeObjectURL(mediaFileUrl); 
    chunks = []; 
    } 
+0

Qu'est-ce que '' chunks''? – guest271314

+0

@ guest271314 Tableau contenant des segments de média codés. – Brad

+0

Encodé dans quel format? Est-ce que 'chunks' est un' ArrayBuffer'? Pourriez-vous fournir à l'utilisateur l'option de choisir un type 'MIME' à enregistrer avant le début de l'enregistrement? Ensuite, réglez 'Blob'' type' sur 'MIME' sélectionné, au lieu de permettre au navigateur de sélectionner un type' MIME'; qui semble être en train de définir une chaîne vide? Vous pouvez également utiliser 'isTypeSupported' pour déterminer si le navigateur peut lire un type de média spécifique. – guest271314

Répondre

1

A cette époque, il n'y a pas moyen d'obtenir les informations dont vous avez besoin de la boîte.

La spécification actuelle du W3C indique que si le type MIME n'est pas spécifiée (par vous):

l'UA utilisera un format par défaut spécifique à la plateforme.

C'est ce qui se passe dans votre cas, vous n'êtes pas spécifier de type MIME et l'UA, le navigateur est de choisir le modèle le mieux adapté pour vous et il n'y a aucune spécification concernant un moyen de récupérer le format choisi. À l'heure actuelle, la seule méthode qui vous permet de vous rapprocher de cela est d'utiliser isTypeSupported qui fournit une certaine détection de support média, malheureusement avec la quantité de types MIME, navigateurs, plates-formes, tarifs, etc., il n'est pas bien adapté pour écrire une fonction qui renverra le type mime choisi avec le nombre de combinaisons disponibles: video/webm; codecs="vp", video/mp4; codecs="avc1.4d4015", etc.

L'idée originale était peut-être de cacher tous ces détails à l'utilisateur mais en fait, votre cas spécifique où l'utilisateur doit connaître le type MIME par exemple pour enregistrer le fichier généré est quelque chose qui revient très souvent. Une proposition est actuellement proposée pour fournir un moyen d'obtenir tous les types de supports supportés par des préférences faibles, ce qui signifie que le premier type de média retourné serait celui choisi par l'UA s'il n'était pas fourni.

Le problème a été créé en mai mais aucun suivi n'est actuellement effectué.

+0

Mise à jour: Chrome bug https://crbug.com/615940 suivi un problème similaire et a été corrigé, de sorte que les blobs codés produites doivent avoir un 'mimeType' correctement spécifié. – miguelao

0

Pour l'audio, la valeur par défaut semble être audio/ogg, et pour la vidéo video/ogg. Testé à la fois dans Chrome et Firefox avec VLC.

Demo: https://codecanister.com/Project/d547eed9/9/result

+0

Ceci n'est pas garanti et est susceptible de changer dans les futures versions de navigateur. Aussi, j'ai l'habitude d'avoir webm, pas ogg. – Brad

+0

Bien que ce soit vrai, c'est la seule façon d'obtenir le bon mime maintenant. La seule autre option est de faire du reniflage de contenu côté client, ce qui n'est pas facile – jlynch630

+0

Pouvez-vous montrer de façon concluante que ce n'est pas possible avec les API existantes? (Bref de type renifler.) Je donnerais volontiers la prime à quelqu'un qui pourrait prouver définitivement que ce n'est pas possible. – Brad