AS3接收netstream.send ByteArray

时间:2013-07-28 16:53:39

标签: actionscript-3 red5 netstream

我正在尝试从通过Red5路由的实时流中获取原始音频数据。

我可以毫无问题地使用netstream.attachAudio(mic),但了解不支持获取原始数据。

我有使用netstream.send通过ByteArray发送音频数据的代码。我可以验证数据是否正在发送到Red5服务器,并且正在从Red5服务器发送回客户端(查看网络流量)。从未尝试过我设置接收数据的客户端功能。我找到了许多例子并实现了一个解决方案,根据这些例子应该有效。但显然缺少了一些东西。代码如下:

protected function ncStatus(event:NetStatusEvent):void {
            trace("rtmp connection status: " + event.info.code );
            if ( event.info.code == "NetConnection.Connect.Success" ) {
                upStream = new NetStream( netc );
                upStream.client = this;
                upStream.attachCamera(_camera);
                upStream.addEventListener(NetStatusEvent.NET_STATUS, netStatus);

                //this.upStream.attachAudio(this._mic);
                _mic.addEventListener( SampleDataEvent.SAMPLE_DATA, micSampleDataHandler, false, 0, false );

                upStream.publish("Seat1","live");
            }
        }

        public function micSampleDataHandler( event:SampleDataEvent ):void {

            upStream.send("audiodata", event.data as ByteArray );

            if ( txnum==7 ) {
                downStream.play("Seat1");
            }
            txnum++;
        }

        public function audiodata( data ):void {

            var buf2:ByteArray = newBuffer();
            var res:Boolean = ane.processEngine( data as ByteArray, buf2, true, true );

            if ( res ) 
                processBuffer.push( buf2 );

            if ( processBuffer.length > 8 ) 
                _sound.play();
        }

        protected function netStatus( event:NetStatusEvent):void {
            trace("netstream status: " + event.info.code + " " + event.target );
            if ( event.info.code == "NetStream.Publish.Start" ) {
                downStream = new NetStream( netc );
                downStream.client = this;

                video = new Video();
                video.attachNetStream( downStream );
                mediaContainer.addChild(video);

                downStream.addEventListener(NetStatusEvent.NET_STATUS, netStatus );
            }
        }

视频没有问题,从服务器发送和从服务器发送适当数量的数据,没有指出错误,但从不调用函数'audiodata'。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

事实证明,这是AMF3的Red5问题。

我切换到Adobe Media Server,它按预期工作。

如果我在netConnection上更改了objectEncoding,它就可以工作,但是ByteArray作为一个对象被接收,这会引起很多麻烦并且也会影响性能。

有问题的Red5代码位于org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.java中。我暂时离开那个并继续推进AMS。