Red5视频流录制正在分手

时间:2012-10-11 18:10:34

标签: java video stream red5

最后我创建了一个流视频录制器Flash应用程序及其简单的Red5后端,但当然Red5再次开玩笑。大多数情况下录制的视频都已损坏,无法随意停止播放,播放播放器以及我也无法播放。为什么要这样做?

我研究了互联网并发现了这个问题,但没有解决方案!我尝试不录制视频,而是将其切换为live并附加ffmpeg来执行脏作业,但自然ffmpeg无法连接red5输出上的以下错误消息:

  

执行调用时出错:服务:null方法:播放Num Params:1 0:my_little_stream ... blabla bla

在我尝试将Xuggler内容集成到我真正不想要的内容之前,我问你该怎么做,我能以某种方式附加ffmpeg,或者我应该更改red5服务器中的配置。或者其他什么!谢谢!

编辑:我正在使用Red5 1.0 RC2

编辑#2 :我使用red5 1.0.0rc2服务器文件从主干源编译了oflaDemo应用程序,然后使用简单的flex应用程序创建了一个实时流,以便尝试ffmpeg刻录机工作。现在它可以连接到red5,但结果是一样的!视频似乎已损坏......

2 个答案:

答案 0 :(得分:3)

*但是我应该把什么放入packetReceived()函数? *

我将其添加到单独的答案中以正确突出显示:

要将数据包写入磁盘,您需要: 1)包, 2)将数据包转换为ITag 3)获取ITagWriter的实例

1)分组数据 http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/StreamVideoListener.java?view=markup 50号线附近

public void packetReceived(IBroadcastStream broadcastStream,
  IStreamPacket streampacket) {

}

streampacket =>要写入磁盘的数据包。

2)通过将数据包转换为ITag来编写数据包

http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/async/StreamVideoWriter.java?view=markup 在90ff线附近

        IoBuffer data = streampacket.getData().asReadOnlyBuffer();

        if (data.limit() == 0) {
            return;
        }

        if (startTimeStamp == -1) {
            // That will be not bigger then long value
            startTimeStamp = streampacket.getTimestamp();
        }

        timeStamp -= startTimeStamp;

        ITag tag = new Tag();
        tag.setDataType(streampacket.getDataType());

        // log.debug("data.limit() :: "+data.limit());
        tag.setBodySize(data.limit());
        tag.setTimestamp(timeStamp);
        tag.setBody(data);

        writer.writeTag(tag);

3)获取Writer的实例

http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/async/BaseStreamWriter.java?view=markup 在90ff线附近

protected ITagWriter writer = null;

private void init() throws IOException {
    file = new File(OmFileHelper.getStreamsSubDir(this.scope.getName()), this.streamName + ".flv");

    IStreamableFileFactory factory = (IStreamableFileFactory) ScopeUtils
            .getScopeService(this.scope, IStreamableFileFactory.class,
                    StreamableFileFactory.class);

    if (!this.file.isFile()) {
        // Maybe the (previously existing) file has been deleted
        this.file.createNewFile();

    } else if (!file.canWrite()) {
        throw new IOException("The file is read-only");
    }

    IStreamableFileService service = factory.getService(this.file);
    IStreamableFile flv = service.getStreamableFile(this.file);
    this.writer = flv.getWriter();

}

所以这是一个艰难的过程。从那个意义上说,你可以继续前进。

http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/async/BaseStreamWriter.java?view=markup

类还包含一个收集数据包的队列。

IStreamPacket.getType == 9是视频,我认为8是音频(但你需要验证)。

塞巴斯蒂安

答案 1 :(得分:0)

您现在使用什么录音方法? Red5中实际上有两种方法可以记录: 1)NetStream.record =>这很简单 2)你做NetStream"直播"但是你有一个服务器端StreamListener,你附加到流,然后将流写入光盘。

我已成功实施了两个解决方案:http://incubator.apache.org/openmeetings/ 没有乱七八糟的视频或随机停止/暂停。

没有必要整合FFMPEG或Xuggler来使用Red5进行简单录制!如果要修改生成的视频并添加水印,FFMPEG可能很有用。 对于音频编辑,您可以使用SoX等工具。但是......只是简单的记录和按原样播放根本不需要这些工具!

塞巴斯蒂安