2017-06-06 55 views
5

के साथ वेबएम को एमपी 4 में परिवर्तित करें। मैं fmpepeg.js के साथ mp4 में वेबएम फ़ाइलों को परिवर्तित करने की कोशिश कर रहा हूं। मैं कैनवास (कुछ जानकारी के साथ ओवरलेयर) से वीडियो रिकॉर्ड कर रहा हूं और वीडियो से ऑडियो डेटा रिकॉर्ड कर रहा हूं।वेबआरटीसी fmpepeg.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(); 

इस कोड अपेक्षित ढंग से काम करता है और एक WebM वीडियो

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

अब मैं एक mp4 फ़ाइल चाहते हैं और muaz-खान से ffmpeg.js जाँच देता है। उदाहरण केवल दिखाएं कि आपके पास 2 सिंगल स्ट्रीम (ऑडियो और वीडियो) होने पर एमपी 4 में कैसे परिवर्तित किया जाए। लेकिन मेरे पास एक अतिरिक्त ऑडियो ट्रैक वाला एक स्ट्रीम है। क्या मैं ऐसी स्ट्रीम को एमपी 4 में परिवर्तित कर सकता हूं? वह कैसे किया जा सकता है?

उत्तर

2

प्रदान किए गए कोड नमूने के अनुसार, आपके रिकॉर्डर स्ट्रीम में केवल एक ऑडियो & एक वीडियो ट्रैक है।

यदि आपकी इनपुट फ़ाइल में ऑडियो & वीडियो दोनों हैं, तो आपको निम्न ट्रैक here दोनों के लिए आउटपुट कोडेक निर्दिष्ट करना होगा।

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' 
     } 
    ] 
    }); 

ट्रांस-कोडिंग ब्राउज़र के भीतर वीडियो, की सिफारिश नहीं है के रूप में यह खपत होगी अधिक CPU समय & मेमोरी। और ffmpeg_asm.js भारी है। पीओसी के लिए ठीक हो सकता है :)

आपका उपयोग केस क्या है? वेबएम (vp8/vp9) इन दिनों व्यापक रूप से उपयोग कर रहा है।

क्रोम माइम प्रकार निम्नलिखित का समर्थन करेंगे:

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

तो तुम हैक निम्नलिखित

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

इस एक भयानक हैक है साथ mp4 क्रोम MediaRecorder से सीधे रिकॉर्डिंग प्राप्त कर सकते हैं। अब मैं बहुत सारे कोड को बचा रहा हूं और ffmpeg_asm.js से छुटकारा पा सकता हूं। आपका बहुत बहुत धन्यवाद। –

+0

@Ajay _ "तो आप क्रोम MediaRecorder से सीधे mp4 रिकॉर्डिंग प्राप्त कर सकते हैं निम्नलिखित हैक" _ '$ ffmpeg -i file.mp3' आउटपुट 'इनपुट # 0, matroska, webm,' file.mp3 'से: मेटाडाटा: एन्कोडर: क्रोम अवधि: एन/ए, शुरू करें: 0.000000, बिटरेट: एन/ए स्ट्रीम # 0: 0 (एनजी): ऑडियो: ओपस, 48000 हर्ट्ज, मोनो, फ्लैट (डिफ़ॉल्ट) 'और '$ ffprobe -v त्रुटि-चयन_स्ट्रीम एक: '-wav' फ़ाइल इनपुट के साथ दृष्टिकोण का उपयोग करने के लिए 0 -show_entries stream = codec_name -of default = noprint_wrappers = 1: nokey = 1 file.mp3' outputs' opus'। – guest271314

+0

@Ajay "एमपी 4 रिकॉर्डिंग सीधे प्राप्त करें" से आपका क्या मतलब है? शायद मैंने कुछ गलती की, लेकिन मेरे परीक्षण में मुझे केवल मूल वेबएम/एच 264 वीडियो मिलता है लेकिन एक अलग माइम प्रकार के साथ। तो वीडियो कंटेनर बदल नहीं है। इस प्रकार बाइनरी डेटा बिल्कुल नई ब्लॉब (...) लाइन के बाद समान है, है ना? जो मैंने कोशिश की है: https://jsfiddle.net/zqd8qf6e/ क्या लक्ष्य यहां नहीं है कि वीडियो कंटेनर fmpepeg.js के बिना वेबएम से mp4 में बदलता है? –

संबंधित मुद्दे