2014-11-06 3 views
0

오디오 파일을 트랜스 코드하고 웹 오디오에서 재생할 socket.io를 통해 오디오 버퍼를 클라이언트에 보낼 때마다 곧 연결이 끊어집니다. 내가웹 오디오에서 socket.io가 충돌하는 getChannelData 설정

source.buffer.getChannelData(0).set(audio); 

을 수행 할 때 나는 이것이 Socket.IO의 문제가되지 않습니다 있으리라 믿고있어 것을 나는 단지 진짜 문제의 결과로 Socket.IO 문제를보고 있어요. 클라이언트에서 나는 오디오 파일을 ffmpeg의 stdin으로 파이프하고 ffmpeg의 stderr을 청취하여 버퍼를 보내는 것이 안전한지를 결정합니다. 클라이언트는 버퍼를 받고 있으며 위에서 언급 한 줄까지 모든 것을 올바르게 수행하고 있습니다. 다음은 문제를 재현 할 수있는 몇 가지 샘플 테스트 코드입니다.

서버 측 :

var express = require('express'); 
var http = require('http'); 
var spawn = require('child_process').spawn; 

var app  = express(); 
var webServer = http.createServer(app); 
var io  = require('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_file_cli.js'></script>" 
    ); 
}); 
webServer.listen(3000); 

io.sockets.on('connection', function(webSocket) { 

    var disconnect = '0'; 
    var count = 0; 
    var audBuf = new Buffer([]); 

    if (disconnect == '0') { 
     console.log('new connection...'); 

     var inputStream = spawn('wget', ['-O','-','http://www.noiseaddicts.com/samples/4353.mp3']); 

     var ffmpeg = spawn('ffmpeg', [ 
      '-i', 'pipe:0', // Input on stdin 
      '-acodec', 'pcm_s16le', // PCM 16bits, little-endian 
      '-ar', '24000', // Sampling rate 
      '-ac', 1, // Mono 
      '-f', 'wav', 
      'pipe:1' // Output on stdout 
     ], {stdio: ['pipe','pipe','pipe']}); 

      inputStream.stdout.pipe(ffmpeg.stdin); 

      ffmpeg.stdout.on('data', function(data) { 
       audBuf = Buffer.concat([audBuf,data]); 
      }); 

      ffmpeg.stderr.on('data', function(data) { 
      var _line = data.toString('utf8'); 
      if (_line.substring(0,5) == 'size=' && _line.indexOf('headers:') > -1) { 
       console.log('completed...'); 
       webSocket.emit('audio',audBuf); 
      } 
     }); 
    } 

    webSocket.on('disconnect', function() { 
     console.log('disconnecting...'); 
      disconnect=1; 
    }); 
}); 

클라이언트 측 (webaudio_file_cli.js) :

window.AudioContext = window.AudioContext || window.webkitAudioContext; 
var context = new AudioContext(); 
var source = context.createBufferSource(); 

var audioStack = [], audio = []; 

socket.on('audio', function(data) { 
    playAudio(data); 
}); 

function playAudio(data) { 
    // playback starting... 
    audioStack = Int16Array(data); 
    for (var i = 0; i < audioStack.length; i++) { 
     audio[i] = (audioStack[i]>0)?audioStack[i]/32767:audioStack[i]/32768; // convert buffer to within the range -1.0 -> +1.0 
    } 

    var audioBuffer = context.createBuffer(1, audio.length, 24000); 
    source.buffer.getChannelData(0).set(audio); 
    source.buffer = audioBuffer; 
    source.connect(context.destination); 
    source.start(0); 
} 

답변

2

이 예에서, 사용자가 설정하기 전에 source.buffer.getChannelData을 액세스하는 source.Buffer = 오디오 버퍼 . 그 두 줄의 순서를 뒤집을 수 있겠 니?

+0

실제로 두 부분의 문제가되었습니다. 언급 한 내용과 audioStack = Int16Array (데이터); audioStack = new Int16Array (data);가되어야했습니다. 이상하게 보입니다. 왜냐하면 FF29를 사용하는 방식대로 설정했기 때문에 이상 하지요. –