【问题标题】:Live555 - TCP streaming of video and audio in one using two subsessionsLive555 - 使用两个子会话的 TCP 视频和音频流
【发布时间】:2015-10-29 14:54:08
【问题描述】:

我一直在尝试通过单个流实现实时 RTSP 视频和音频流。

我所做的与他们的示例非常相似(创建 ServerMediaSession 并向其中添加两个 SubSession,一个用于视频,一个用于音频),我所做的唯一更改是创建了一个名为的新字节流源TcpSource,和他们的 ByteStreamFileSource 非常相似,只是我在 doReadFromFile 方法中调用了 recv(),而不是“fread()”(当然,视频和音频有不同的套接字)。

结果是,如果我分别拥有每个子会话,它就可以正常工作。但是,当我尝试通过 TCP 流式传输视频和音频时,它会导致严重的数据包丢失,或者只有一个流正常工作而另一个流卡在中间(例如,视频冻结而音频保持正常播放)。

你能建议吗?它与发送\接收超时有关吗? 提前致谢。

【问题讨论】:

    标签: sockets live555 tcpsocket


    【解决方案1】:

    live555 事件循环是单线程的,对任何阻塞或繁重的处理都很敏感。

    首先要检查的是您没有使用blocking I/O。如果你是,你正在干扰 live555 框架处理的所有事情,例如任何计时器、RTCP 报告、套接字读取和写入等。

    第二件事是您需要检查您的doReadFromFile 是否被阻止。不推荐像sleep 这样的系统调用。而是使用 live555 任务调度机制。

    我编写了类似的代码,即从 tcp 套接字读取音频/视频,解析数据包,然后通过 live555 重新广播媒体。我在一个单独的线程中处理我的所有网络 I/O,并通过共享队列机制将解析的媒体样本传递到 live555 线程。到目前为止效果很好,但是还有很多其他方法可以解决这个问题,例如只要您不干扰 live555 事件循环,像您正在做的那样使用live555 线程进行I/O 应该没问题。

    【讨论】:

    • 嗨@Ralf,感谢您的回复,很抱歉延迟发表评论...您能否详细说明“阻止 i\o”是什么意思?来自套接字的 recv() 是否被视为阻塞 i\o?调试打印?
    • @DanielY 你用的是什么操作系统? recv() 可能是阻塞的或非阻塞的,具体取决于您如何配置套接字。如果您没有明确地将套接字设为非阻塞,则它可能是阻塞的。这意味着在使用 live555 时会导致各种问题的套接字上读取某些内容之前,调用不会返回。假设您正在阻止阅读视频,同时可能已经读取了 x 个音频数据包,需要发送 RTCP,等等。
    • 我目前使用的是 64 位的 win7 电脑。我已将套接字配置为非阻塞,即使我收到许多“无法立即完成非阻塞操作”的错误,视频\音频也不会卡住(只是彼此不同步,但这是另一个问题)。知道为什么在使用 recv() 时会出现上述错误吗?
    • 这是非阻塞套接字的正确行为:这意味着如果没有要读取的内容,则 recv() 操作将返回该错误代码:不要在函数中执行任何操作并让live555 事件循环继续。如果有要读取的内容,则像以前一样处理数据。
    • 好的,我试试,非常感谢。如果我还有其他需要,有什么方法可以联系到您吗?
    猜你喜欢
    • 2014-11-22
    • 2018-05-30
    • 2011-06-08
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多