2014-05-23 76 views
0

我想要node.js將極長的音頻文件轉換爲mp3,第二個數據在stdout上可用,node.js應該將它發送給客戶端供他們播放。node.js live streaming ffmpeg stdout to res

我寫了下面這段代碼,當它工作時,html5音頻/視頻標記會一直等到ffmpeg完成代碼轉換,因爲我想在ffmpeg做它的事情時開始播放視頻。

var ffmpeg = childProcess.spawn('ffmpeg', [ 
    '-i', params.location, //location of the specified media file 
    '-f', 'mp3', 
    'pipe:1' 
]); 
res.writeHead(200, { 
    'Content-Type': 'audio/mp3' 
}); 
ffmpeg.stdout.pipe(res); 

編輯1:不知道爲什麼,但如果params.location指向電影一切似乎工作。但如果它是一個音頻文件,ffmpeg似乎不會輸出到標準輸出,直到其100%轉換。

編輯2:原來,由於mp4文件不是因果關係(http://en.wikipedia.org/wiki/Causal_system),您無法將mp4文件轉儲到標準輸出。因此,如果你使用webm它的作品。只要確保使用webm支持編譯ffmpeg(對於自制程序用戶:brew install ffmpeg --with-vpx --with-vorbis)。

我已經上傳了GitHub的要點顯示兩個函數來發送實時MP3/WebM譯碼:https://gist.github.com/cobookman/c1a9856a4588496b021a

+0

原來,這是由於prams.location指向一個mp3文件。仍然不知道如何讓ffmpeg管道以較低比特率重新轉碼的mp3文件。 – blasteye

+0

所以無法弄清楚如何讓ffmpeg發揮出色,所以我現在使用lame for * audio-> mp3,而ffmpeg for * video - > webm/h.264。不知道ffmpeg有什麼問題。 – blasteye

回答

0

我不知道這是爲什麼不爲你工作,因爲我幾乎是在完全相同的代碼我的申請。區別在於我使用-而不是pipe:1作爲輸出。試試看。

我建議的另一件事是從FFmpeg的stderr讀取,這樣就可以看到FFmpeg是否有任何奇怪的輸出,可能會爲您提供有關正在發生的事情的線索。

+0

因爲w/e原因ffmpeg的版本我只是沒有管道/流標準輸出音頻到node.js。所以,相反,我創建了一個bash腳本,當它被調用時,ffmpeg會將音頻轉換爲wav,並將其轉換爲libmp3lame。然後libmp3lame(lame)將wav轉換爲mp3,並將其導入到stdout。這一切都適用於該設置。 要點:https://gist.github.com/cobookman/c1a9856a4588496b021a – blasteye