音声データを操作するボイスチャットを構築しています。マイクから SAMPLE_DATA (ByteArray) を取得し、NetStream send() メソッド経由で送信しています。次に、それをサウンドに戻す必要があります。どうすればいいですか?
これは、接続を確立し、音声データをキャプチャして送信するクラスです (これは見苦しいですが、一時的なバージョンです)。
package app.net {
public class CirrusConnection extends EventDispatcher {
private const SERVER_ADDRESS:String = "rtmfp://p2p.rtmfp.net/";
private const DEVELOPER_KEY:String = "bla-bla-bla";
// Net objects ~~~~~~~~~~
private var nc:NetConnection;
private var sendStream:NetStream;
private var recvStream:NetStream;
private var myPeerID:String;
private var farPeerID:String;
// User output handler
private var chatTextArea:TextArea;
//---
private var mic:Microphone;
//---
public function CirrusConnection() { }
public function initConnection():void {
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
nc.connect(SERVER_ADDRESS + DEVELOPER_KEY);
mic = Microphone.getMicrophone();
mic.rate = 8;
mic.setUseEchoSuppression(true);
mic.gain = 50;
}
private function netStatusHandler(event:NetStatusEvent):void {
trace("CirrusConnection: " + event.info.code);
switch(event.info.code) {
case "NetConnection.Connect.Success":
myPeerID = nc.nearID;
openSendStream();
dispatchEvent(new Event(NetEvent.CIRRUS_SENT_KEY));
break;
case "NetStream.Play.Start":
dispatchEvent(new Event(NetEvent.CLIENT_IS_CALLING ));
break;
}
}
public function getNetConnection():NetConnection {
return nc;
}
public function getMyPeerID():String {
return myPeerID;
}
public function isConnected():Boolean {
return Boolean(myPeerID);
}
public function setChatTextArea(chatTextArea:TextArea):void {
this.chatTextArea = chatTextArea;
}
private function openSendStream():void {
var sendStreamClient:Object = new Object();
sendStreamClient.onPeerConnect = function(callerns:NetStream):Boolean {
if (!Boolean(farPeerID)) {
connectToPeer(callerns.farID);
}
return true;
}
sendStream = new NetStream(this.nc, NetStream.DIRECT_CONNECTIONS);
sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
sendStream.client = sendStreamClient;
sendStream.publish("media");
}
public function connectToPeer(id:String):void {
farPeerID = id;
recvStream = new NetStream(nc,farPeerID);
recvStream.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
recvStream.client = this;
recvStream.play("media");
}
public function read(data:ByteArray):void {
var snd:Sound = new Sound();
data.position = 0;
snd.loadPCMFromByteArray(data, data.length >> 3);
snd.play();
}
public function beginStreamMicrophoneData():void {
mic.addEventListener("sampleData", streamData);
}
public function streamData(event:SampleDataEvent):void {
sendStream.send("read", event.data as ByteArray );
}
}
}
マイク データがキャプチャされると、streamData 関数が呼び出されます。ByteArray を 2 番目のピアに送信しています。2 番目のピアは、読み取り機能でそれを取得しています。それをデコードするものがあります。現在は機能していますが、スピーカーからひどい通常の音が聞こえます。迅速な対応をして下さり、感謝しております。