【发布时间】:2013-12-03 19:53:43
【问题描述】:
在我的以下代码中,ffmpeg 正在对输入流进行转码,并成功地将块发送到客户端。在客户端,客户端正在解码来自 socket.io 的 base64 响应,并将响应转换为数组缓冲区。从那时起,decodeAudioData 无法处理数组缓冲区并返回空错误。有谁知道为什么 decodeAudioData 不起作用?
./webaudio_svr.js:
var express = require('/usr/local/lib/node_modules/express');
var http = require('http');
var spawn = require('child_process').spawn;
var util = require('util');
var fs = require('fs');
var app = express();
var webServer = http.createServer(app);
var audServer = http.createServer(app);
var io = require('/usr/local/lib/node_modules/socket.io').listen(webServer, {log: false, });
app.use(express.static(__dirname + '/public'));
app.get('/', function(req, res){
res.send(
"<script src='/socket.io/socket.io.js'></script>\n"+
"<script>var socket=io.connect('http://127.0.0.1:3000');</script>\n"+
"<script src='/webaudio_cli.js'></script>"
);
});
webServer.listen(3000);
var inputStream = spawn('/usr/bin/wget', ['-O','-','http://nprdmp.ic.llnwd.net/stream/nprdmp_live01_mp3']);
var ffmpeg = spawn('ffmpeg', [
'-i', 'pipe:0', // Input on stdin
'-ar', '44100', // Sampling rate
'-ac', 2, // Stereo
'-f', 'mp3',
'pipe:1' // Output on stdout
]);
io.sockets.on('connection', function(webSocket) {
var disconnect = '0';
if (disconnect == '0') {
inputStream.stdout.pipe(ffmpeg.stdin);
ffmpeg.stdout.on('data', function(data) {
var data64 = data.toString('base64');
webSocket.emit('stream',data64);
});
}
webSocket.on('disconnect', function() {
disconnect=1;
});
});
./public/webaudio_cli.js:
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
var source = context.createBufferSource();
socket.on('stream', function(data) {
var data=str2ab(atob(data));
context.decodeAudioData(data, function(buffer) {
source.connect(context.destination);
source.buffer = buffer;
source.start(0);
}, function(err) {
console.log("err(decodeAudioData): "+err);
});
});
【问题讨论】:
-
如果您的音频只是原始的 16 位 PCM,我很确定
decodeAudioData不知道如何处理它。 -
不是原始 PCM,ffmpeg 正在将其转码为 mp3。我实际上想使用来自 ffmpeg 的 speex 编码的 ogg 流,但我在这个主题上看到的所有帖子都涉及 mp3,所以我想我会这样做以增加获得答案的机会。
-
var
source在load回调函数中声明。decodeAudioData如何访问它? -
只是为了缩小范围,您是否尝试过转储 base64 数据、对其进行解码并使用 VLC 或其他方式进行回放?让我们将其缩小到客户端问题,然后是是否存在编解码器支持问题。
-
@Brad.Smith,这不是内置的 DOM 方法——他们实际上已经在页面上写出了函数。
标签: html node.js google-chrome ffmpeg web-audio-api