java - Red5视频流录制中断

标签 java video stream red5

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

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

Error executing call: Service: null Method: play Num Params: 1 0: my_little_stream ... blabla bla

在我尝试集成 Xuggler 之前我真正不想做的事情我问你,该怎么办,我可以以某种方式附加 ffmpeg 或者 red5 服务器中是否有我应该更改的配置..或任何东西!谢谢!

编辑:我使用的是 Red5 1.0 RC2

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

最佳答案

*但是我应该在 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 90号线附近

        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 90号线附近

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

塞巴斯蒂安

关于java - Red5视频流录制中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845920/

相关文章:

java - 将数据输出到 android 上的文件,不确定它要去哪里或是否去任何地方

java - 十进制负数和正数之和

java - 使用 Java 及其 SWING 库

java - 我想在android中获取类的字段名称

java - 如何将对象转换为 boolean 值?

audio - 如何使用 ffmpeg 将音频文件一分为二?

php - 是否有任何现有服务可通过浏览器上传巨大的视频文件 (~5gb)?

sql-server - 打开从 sql server 下载的 Office 文件时出错

javascript - AngularJS视频背景不工作

java - Socket 上的 BufferedReader.readLine() 是阻塞操作吗?