Red5服务器中AS3中的视频录制问题



我使用Action Script作为拥有Red5 Media Server的客户端。我的视频有2个问题:

  1. 视频录制不正确,播放不流畅
  2. 有时视频从15-20秒开始,而不是从0秒开始

我已经写了以下代码:

private function onStart():void
{  
mic = Microphone.getMicrophone();
cam = Camera.getCamera();
if(cam!=null)
{
cam.addEventListener(StatusEvent.STATUS, onDivStatus);
ns.attachCamera(cam)
cam.setQuality( 0, 100 );;

}
else
{
trace("you need to check webcam setting:");
}
if(mic != null)
{
mic.setUseEchoSuppression(true);
mic.setSilenceLevel(5, 1000);
mic.addEventListener(StatusEvent.STATUS, onDivStatus);
ns.attachAudio(mic);
}
else
{
trace("you need to check Microphone setting:");
}

webCamRecording.video1.attachCamera(cam);
webCamRecording.video1.smoothing = true;
}
var timer:Timer;
public function startRecording():void
{
ns.publish(webCamRecording.userName,"record"); 
webCamRecording.stopBtn.visible = true;
webCamRecording.stopBtn.addEventListener(MouseEvent.CLICK,stopRecording)
timer = new Timer(1000,10*60);
timer.addEventListener(TimerEvent.TIMER, onTimer);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onComplete);
timer.start(); 
}
private function stopRecording(evt:MouseEvent):void
{
trace("call external function::::::::::::::D>>>>>> ");
timer.stop();
webCamRecording.video1.clear();
ns = null
webCamRecording.video1.visible = false;
}

我检查了日志,发现以下错误:

java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at sun.nio.ch.IOUtil.write(IOUtil.java:68)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:254)
at org.red5.io.flv.impl.FLVWriter.writeMetadataTag(FLVWriter.java:371)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:226)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-12" java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at sun.nio.ch.IOUtil.write(IOUtil.java:68)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:254)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-15" java.nio.BufferOverflowException
at java.nio.Buffer.nextPutIndex(Buffer.java:519)
at java.nio.HeapByteBuffer.putInt(HeapByteBuffer.java:366)
at org.apache.mina.core.buffer.AbstractIoBuffer.putInt(AbstractIoBuffer.java:743)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:251)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-18" java.nio.BufferOverflowException
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:357)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:336)
at sun.nio.ch.IOUtil.write(IOUtil.java:60)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:254)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-20" java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at sun.nio.ch.IOUtil.write(IOUtil.java:68)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:254)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-34" java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at sun.nio.ch.IOUtil.write(IOUtil.java:68)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:278)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-43" java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:337)
at sun.nio.ch.IOUtil.write(IOUtil.java:60)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:278)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-44" java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at sun.nio.ch.IOUtil.write(IOUtil.java:68)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:278)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-48" java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at sun.nio.ch.IOUtil.write(IOUtil.java:68)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:278)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-65" java.nio.BufferOverflowException
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:357)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:336)
at sun.nio.ch.IOUtil.write(IOUtil.java:60)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:254)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-68" java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at sun.nio.ch.IOUtil.write(IOUtil.java:68)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:278)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
Exception in thread "Thread-71" java.nio.BufferOverflowException
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:357)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:336)
at sun.nio.ch.IOUtil.write(IOUtil.java:60)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:205)
at org.red5.io.flv.impl.FLVWriter.writeTag(FLVWriter.java:254)
at org.red5.server.stream.consumer.FileConsumer.write(FileConsumer.java:333)
at org.red5.server.stream.consumer.FileConsumer.doWrites(FileConsumer.java:292)
at org.red5.server.stream.consumer.FileConsumer$1.run(FileConsumer.java:180)
[INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Close
[INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect
[INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect
[INFO] [NioProcessor-1] org.red5.server.stream.ClientBroadcastStream - Provider disconnect

如果有人有解决方案,请帮帮我。谢谢

根据个人经验,Red5的录音效果不佳。

尝试其他服务器,如WowzaDeveloperServer,使用相同的flash客户端,看看是否能获得更好的结果。如果你这样做,那么这就是Red5的问题,而且切换服务器更容易。

您可以通过增加缓冲区和等待缓冲区上传来尝试一些优化。

Red5 0.9的录制过程完全中断。

Red5 0.8做得相当好,但在慢速连接上进行流媒体/录制时,无法解释Flash Player将音频优先于视频数据。因此,当通过慢速连接录制高质量视频时,最终文件中的音频和视频将不同步。

Red5 1.0 RC1引入了一种几乎有效的延迟写入机制。

Red5 1.0最终版本、1.0.1和1.0.2的延迟写入机制存在完全缺陷,导致在慢速连接录制时,flv文件只有1个视频关键帧,其余仅为音频。

录制的最佳Red5版本是本博客文章中提供的补丁Red5 1.0.2:现在可以使用Red5通过慢速连接录制高质量(HD)视频

该补丁也已应用于Red5在GitHub上的源代码,并将在下一个正式版本(1.0.3)中提供

我是那个补丁的作者,我做它是为了一劳永逸地修复Red5的录音。它非常有效。

最新更新