我正在尝试从通过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'。有什么想法吗?
答案 0 :(得分:0)
事实证明,这是AMF3的Red5问题。
我切换到Adobe Media Server,它按预期工作。
如果我在netConnection上更改了objectEncoding,它就可以工作,但是ByteArray作为一个对象被接收,这会引起很多麻烦并且也会影响性能。
有问题的Red5代码位于org.red5.server.net.rtmp.codec.RTMPProtocolDecoder.java中。我暂时离开那个并继续推进AMS。