2

最后,我创建了一个流式视频录像机 Flash 应用程序及其简单的 Red5 后端,但 Red5 当然又在开玩笑了。大多数情况下,录制的视频已损坏,如果不随机停止-恢复、挂出播放器.. 以及我,就无法播放它们。为什么要这样做?

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

执行调用时出错:服务:null 方法:play 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,但结果是一样的!视频好像有问题...

4

2 回答 2

3

*但是我应该在 packetReceived() 函数中添加什么?*

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

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

1) 第 50 行左右的数据包数据http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/listener/StreamVideoListener.java?view=markup

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 是音频(但您需要验证)。

塞巴斯蒂安

于 2012-10-15T18:00:16.740 回答
0

你现在用什么录音方法?Red5 中实际上有 2 种记录方法:1) NetStream.record => 这很简单 2) 您执行 NetStream “实时”,但您有一个服务器端 StreamListener,您将其附加到流上,然后将流写入光盘。

我已在以下位置成功实施了这两种解决方案:http: //incubator.apache.org/openmeetings/ 没有断断续续的视频或随机停止/暂停。

无需集成 FFMPEG 或 Xuggler 即可使用 Red5 进行简单的录制!如果您想修改生成的视频并添加水印,FFMPEG 可能会很有用。对于音频编辑,您可以使用 SoX 等工具。然而......只是简单的记录和播放根本不需要这些工具!

塞巴斯蒂安

于 2012-10-12T07:24:42.133 回答