2017-06-06 487 views
5

我正嘗試使用ffmpeg.js將webM文件轉換爲mp4。 我正在從畫布上錄製視頻(疊加了一些信息)並錄製了視頻中的音頻數據。webRTC使用ffmpeg.js將webm轉換爲mp4

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個單一流(音頻和視頻)時如何轉換爲mp4。但是我有一個音軌有附加音軌。我可以將這種流轉換爲mp4嗎?如何做到這一點?

回答

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很重。可能對POC好:)

你的用例是什麼? webm(vp8/vp9)這些日子廣泛使用。

Chrome將支持下列MIME類型:

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

這樣你就可以得到MP4直接從鉻MediaRecorder記錄與下面的技巧

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

這是一個真棒黑客。現在我節省了大量的代碼,可以擺脫ffmpeg_asm.js。非常感謝你。 –

+0

@Ajay _「所以你可以直接從chrome MediaRecorder通過以下hack獲取mp4錄音:_ffmpeg -i file.mp3輸出從'file.mp3'輸入#0,matroska,webm:元數據:編碼器: Chrome持續時間:不適用,開始:0.000000,比特率:不適用流#0:0(eng):音頻:opus,48000Hz,單聲道,fltp(默認值)'和$ ffprobe -v error -select_streams a: 0 -show_entries stream = codec_name -of default = noprint_wrappers = 1:nokey = 1 file.mp3'輸出'opus'用於使用'.wav'文件輸入的方法。 – guest271314

+0

@Ajay你的意思是「直接獲取mp4錄音」?也許我犯了一些錯誤,但在我的測試中,我只獲得了原始的webm/h264視頻,但使用了不同的MIME類型。所以視頻容器不會改變。因此,在新的Blob(...)行後,二進制數據完全相同,對嗎?那就是我所嘗試的:https://jsfiddle.net/zqd8qf6e/ 這裏的目標不是視頻容器從webm改變到沒有ffmpeg.js的mp4嗎? –