國慶月經(jīng)心血來潮,寫了個在vps上運行的推流直播的小玩意,要知道阿里云2M帶寬上行網(wǎng)速是很快的,推流能達到1500K(至少比寢室100K封頂強多了),24h放片高清流暢無壓力。
之前有人用樹莓派這樣玩過,其實都離不開ffmpeg。ffmpeg的開發(fā)團隊非常活躍,網(wǎng)絡(luò)直播大熱就馬上開發(fā)了rtmp等各種協(xié)議的推流功能,在這里我用到了node的fluent-ffmpeg,它其實只是將ffmpeg的api進行了封裝。
在阿里云ubuntu系統(tǒng)下運行24h推流程序,向戰(zhàn)旗TV推流(只搞到戰(zhàn)旗主播賬號,不過都是rtmp協(xié)議,沒差~)
var ffmpeg = require('fluent-ffmpeg');
var inputPath = './media/mv.mp4';
var outputPath = 'rtmp://dlrtmpup.cdn.zhanqi.tv/zqlive/*********';
ffmpeg(inputPath)
.inputOptions('-re')
.inputOptions('-ac 2')
.addInput('./bin/logo.png')
.complexFilter([
{
filter: 'scale',
options: [1080,-1],
inputs: '[0:v]',
outputs: 'c'
},
{
filter: 'scale',
options: [200,-1],
inputs: '[1:v]',
outputs: 'logo'
},
{
filter: 'overlay',
options: {
x: 'main_w-overlay_w-5',
y: 5
},
inputs: ['c','logo'],
outputs: ['output','a']
}
],'output')
.on('start', function(commandLine) {
console.log('Spawned Ffmpeg with command: ' + commandLine);
})
.on('error', function(err, stdout, stderr) {
console.log('error: ' + err.message);
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
})
.on('end', function() {
console.log('Processing finished !');
})
.addOptions([
'-vcodec libx264',
'-preset veryfast',
'-crf 22',
'-maxrate 1000k',
'-bufsize 3000k',
'-acodec libmp3lame',
'-ac 2',
'-ar 44100',
'-b:a 96k'
])
.format('flv')
.pipe(outputPath, { end: true });
-re
:以原視頻幀率輸入complexFilter
:復雜濾鏡,適用于多輸入輸出,用它實現(xiàn)了加logo和對輸出進行尺寸調(diào)整-preset veryfast
:犧牲視頻質(zhì)量,換取流暢性(否則以1G的內(nèi)存難以流暢編碼,會導致直播卡頓)-ar 44100
:音頻采樣率-ac 2
:雙聲道輸出concat
這個fliter來進行自如的視頻銜接。用法可以去看ffmpeg的官方文檔或者搜索。效果如上??
在程序運行時間內(nèi),阿里云cpu使用率一直100%,有于我們選擇veryfast
的預設(shè),實時轉(zhuǎn)碼時視頻質(zhì)量已經(jīng)做出很大讓步,但仍然使cpu處于高負載之下,當然這和ffmpeg處理的原視頻文件也有關(guān)系。
推流網(wǎng)速600k以上,所以說短板在于cpu而不在于網(wǎng)速。
唯一沒解決的問題是,在手機上(ios8)用戰(zhàn)旗app看時,選擇硬件解碼會沒有聲音