0

我正在尝试从通过 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”。有任何想法吗?

4

1 回答 1

0

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

我切换到 Adob​​e Media Server,它按预期工作。

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

有问题的 Red5 代码位于 org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.java 中。我将再次离开,现在继续推进 AMS。

于 2013-07-29T14:49:29.487 回答