2014-01-18 109 views
2

我想通過node.js + ffmpeg流式傳輸音頻到只連接到局域網中的瀏覽器使用網絡音頻api。使用FFMPEG實時流式傳輸到網絡音頻api

不使用元素,因爲它添加了它自己的緩衝區8到10秒,我想要獲得最大的高延遲(最大約1到2秒)。

音頻播放成功,但音頻非常波濤洶涌。

這裏是我的node.js(服務器端)文件:

var ws = require('websocket.io'), 
server = ws.listen(3000); 
var child_process = require("child_process"); 
var i = 0; 
server.on('connection', function (socket) 
{ 

console.log('New client connected'); 

var ffmpeg = child_process.spawn("ffmpeg",[ 
    "-re","-i", 
    "A.mp3","-f", 
    "f32le", 
    "pipe:1"      // Output to STDOUT 
    ]); 

ffmpeg.stdout.on('data', function(data) 
{ 
    var buff = new Buffer(data); 
    socket.send(buff.toString('base64')); 
}); 
}); 

這裏是我的HTML:

var audioBuffer = null; 
var context = null; 
window.addEventListener('load', init, false); 
function init() { 
    try { 
     context = new webkitAudioContext(); 
    } catch(e) { 
     alert('Web Audio API is not supported in this browser'); 
    } 
} 

var ws = new WebSocket("ws://localhost:3000/"); 

ws.onmessage = function(message) 
{ 
    var d1 = base64DecToArr(message.data).buffer; 
    var d2 = new DataView(d1); 

    var data = new Float32Array(d2.byteLength/Float32Array.BYTES_PER_ELEMENT); 
    for (var jj = 0; jj < data.length; ++jj) 
    { 
     data[jj] = d2.getFloat32(jj * Float32Array.BYTES_PER_ELEMENT, true); 
    } 

    var audioBuffer = context.createBuffer(2, data.length, 44100); 
    audioBuffer.getChannelData(0).set(data); 

    var source = context.createBufferSource(); // creates a sound source 
    source.buffer = audioBuffer; 
    source.connect(context.destination); // connect the source to the context's destination (the speakers) 
    source.start(0); 
}; 

任何一個可以建議有什麼不好?

問候, 拿煙

+0

你好拿煙,我使用的Web音頻API,並且要錄製的聲音通過網絡thje音頻API發揮,,我的問題http://stackoverflow.com/questions/21234902/record-sound-of-a-webaudio-apis-audio-context在這裏,你能幫我嗎 –

回答

1

我得到它的工作!

我只需要調整通道的數量。

我已經設置FFMPEG輸出單聲道音頻,它的工作就像一個魅力。這是我的新FFMOEG命令:

var ffmpeg = child_process.spawn("ffmpeg",[ 
    "-re","-i", 
    "A.mp3", 
    "-ac","1","-f", 
    "f32le", 
    "pipe:1"      // Output to STDOUT 
    ]); 
1

您正在服用的數據塊,從他們創建單獨的節點,並且基於網絡定時開始它們。爲使音頻正確無誤,緩衝區的播放必須沒有中斷和採樣精確的時間。你需要從根本上改變你的方法。

我這樣做的方法是通過創建一個管理其自己的PCM樣本緩衝區的ScriptProcessorNode。在進程中,它將樣本讀入輸出緩衝區。這保證了音頻的流暢播放。

+0

我試過,但沒有運氣,是否有可能指出具體的例子或寫一段代碼? – Nayan

+1

這正是它應該如何完成的。小心使用一些代碼來演示? – ole

相關問題