J'essaie de convertir des fichiers webM en mp4 avec ffmpeg.js. J'enregistre une vidéo à partir de la toile (superposition avec certaines informations) et j'enregistre les données audio de la vidéo.
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 j'ai vérifié le ffmpeg.js de muaz-khan. Les exemples montrent simplement comment convertir en mp4 lorsque vous avez 2 flux simples (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?
Selon l'exemple de code fourni, votre flux d'enregistreur n'a qu'une seule piste audio et une seule piste vidéo.
Si votre fichier d'entrée contient à la fois de l'audio et de la vidéo, vous devez spécifier le codec de sortie pour les deux pistes ici 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'
}
]
});
Le transcodage de la vidéo dans le navigateur n'est pas recommandé, car cela consommera plus de temps et de mémoire CPU. Et ffmpeg_asm.js est lourd. Peut être ok pour POC :)
Quel est votre cas d'utilisation? webm (vp8/vp9) utilise largement ces jours-ci.
Chrome prend en charge les types MIME suivants:
"video/webm"
"video/webm;codecs=vp8"
"video/webm;codecs=vp9"
"video/webm;codecs=h264"
"video/x-matroska;codecs=avc1"
Ainsi, vous pouvez obtenir un enregistrement mp4 directement depuis chrome MediaRecorder avec le hack suivant
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