2017-06-06 3 views
5

Je suis en train de convertir des fichiers webM en mp4 avec ffmpeg.js. Je suis en train d'enregistrer une vidéo à partir de canvas (superposition avec quelques informations) et d'enregistrer les données audio de la vidéo.webRTC convertir webm en mp4 avec ffmpeg.js

stream = new MediaStream(); 
var videoElem = document.getElementById('video'); 
var videoStream = videoElem.captureStream(); 
stream.addTrack(videoStream.getAudioTracks()[0]); 
stream.addTrack(canvas.captureStream().getVideoTracks()[0]); 
var options = {mimeType: 'video/webm'}; 
    recordedBlobs = []; 
    mediaRecorder = new MediaRecorder(stream, options); 
    mediaRecorder.onstop = handleStop; 
    mediaRecorder.ondataavailable = handleDataAvailable; 
    mediaRecorder.start(100); // collect 100ms of data 

function handleDataAvailable(event) { 
    if (event.data && event.data.size > 0) { 
    recordedBlobs.push(event.data); 
    } 
} 
mediaRecorder.stop(); 

Ce code fonctionne comme prévu et renvoie une vidéo WebM

var blob = new Blob(recordedBlobs, {type: 'video/webm'}); 

Maintenant, je veux un fichier mp4 et vérifié les ffmpeg.js de Muaz-khan. Les exemples montrent juste comment convertir en mp4 lorsque vous avez 2 flux uniques (audio et vidéo). Mais j'ai un flux avec une piste audio supplémentaire. Puis-je convertir un tel flux en MP4? Comment cela peut-il être fait?

Répondre

2

Selon l'exemple de code fourni, le flux de votre enregistreur n'a qu'une seule piste audio &.

Si votre fichier d'entrée contient à la fois Audio & Vidéo, vous devez spécifier le codec de sortie pour les deux pistes here comme suit.

worker.postMessage({ 
    type: 'command', 
    arguments: [ 
     '-i', 'audiovideo.webm', 
     '-c:v', 'mpeg4', 
     '-c:a', 'aac', // or vorbis 
     '-b:v', '6400k', // video bitrate 
     '-b:a', '4800k', // audio bitrate 
     '-strict', 'experimental', 'audiovideo.mp4' 
    ], 
    files: [ 
     { 
      data: new Uint8Array(fileReaderData), 
      name: 'audiovideo.webm' 
     } 
    ] 
    }); 

Trans-codage de la vidéo dans le navigateur est pas recommandé, car il consommera plus de temps & mémoire CPU. Et ffmpeg_asm.js est lourd. Peut être ok pour POC :)

Quelle est votre utilisation? webm (vp8/vp9) utilise largement ces jours-ci.

Chrome soutiendra suivant les types MIME:

"video/webm" 
"video/webm;codecs=vp8" 
"video/webm;codecs=vp9" 
"video/webm;codecs=h264" 
"video/x-matroska;codecs=avc1" 

Vous pouvez donc obtenir mp4 enregistrement directement à partir MediaRecorder chrome avec suivant bidouille

var options = {mimeType: 'video/webm;codecs=h264'}; 
mediaRecorder = new MediaRecorder(stream, options); 
..... 
//Before merging blobs change output mime 
var blob = new Blob(recordedBlobs, {type: 'video/mp4'}); 
// And name your file as video.mp4 
+2

c'est une bidouille impressionnante. Maintenant, j'économise beaucoup de code et je peux me débarrasser de ffmpeg_asm.js. Merci beaucoup. –

+0

@Ajay _ "Donc, vous pouvez obtenir l'enregistrement mp4 directement à partir de chrome MediaRecorder avec piratage suivant" _ '$ ffmpeg -i fichier.mp3' sorties' Entrée # 0, matroska, webm, de 'fichier.mp3': Métadonnées: encodeur: Chrome Durée: N/A, début: 0.000000, débit: N/A Stream # 0: 0 (eng): Audio: opus, 48000 Hz, mono, fltp (par défaut) 'et' $ ffprobe -v error -select_streams a: 0 -show_entries stream = codec_name -of default = noprint_wrappers = 1: nokey = 1 fichier.mp3' sort 'opus' pour utiliser l'approche avec l'entrée de fichier' .wav'. – guest271314

+0

@Ajay que voulez-vous dire par "obtenir l'enregistrement mp4 directement"? Peut-être que j'ai fait une erreur, mais dans mon test je reçois seulement la vidéo webm/h264 originale mais avec un type mime différent. Donc, le conteneur vidéo ne change pas. Ainsi, les données binaires sont exactement les mêmes après la nouvelle ligne Blob (...), n'est-ce pas? Thats ce que j'ai essayé: https://jsfiddle.net/zqd8qf6e/ Est-ce que le but ici n'est pas que le conteneur vidéo change de webm en mp4 sans ffmpeg.js? –