0

音声データを操作するボイスチャットを構築しています。マイクから 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 番目のピアは、読み取り機能でそれを取得しています。それをデコードするものがあります。現在は機能していますが、スピーカーからひどい通常の音が聞こえます。迅速な対応をして下さり、感謝しております。

4

1 に答える 1

0

私は常にストリーミングソースとレシーバーの間にメディアサーバーを見てきましたが、あなたのアプローチは合理的なようです。セットアップRed5(または同様の)を試み、オーディオを「ライブ」ソースとしてストリーミングしてから、反対側から再生してみてください。

おそらく送信中のPCMですが(いくつかの種類の圧縮が利用可能ですが)、翻訳のステップを逃したためにノイズが聞こえている可能性があります。

于 2012-12-29T13:49:14.000 に答える