用 C++ 流式传输视频? [关闭]

Posted

技术标签:

【中文标题】用 C++ 流式传输视频? [关闭]【英文标题】:Stream Video in C++? [closed] 【发布时间】:2015-07-09 03:11:11 【问题描述】:

我有两台机器对数据包进行如下编码/解码:它们在第一台机器上读取和编码,发送到第二台机器,然后在那里解码。这是为了防止丢失。

我想通过视频测试来演示代码:理想情况下,视频使用网络摄像头实时录制,动态编码/解码,然后在单独的屏幕上播放解码结果。

我能找到的最接近的资源是this link,它既过时又看似不完整。

特别是,当我从 OpenCV 读取帧时,我假设我必须将其分成小块,以便对它们进行编码,通过 UDP 套接字发送它们,然后对其进行解码。此外,在客户端,我应该能够获取这些解码数据并将其作为视频流输出。但是,我不确定 1)将数据划分为数据包的最佳方法以及 2)如何从接收到的数据包中重建帧。如果您能指出我的任何相关资源,那就太好了。谢谢!

【问题讨论】:

为什么要重新发明***?使用 RTSP 之类的东西。 这更多是为了展示减轻损失的目的,我希望保持数据传输原样。 【参考方案1】:

这听起来不像是在编码/解码数据包?你是如何“编码”它们的?你指的是网络编码吗?

编码行为(例如使用 H.264 编解码器)会压缩数据包,从而使通过网络发送它们变得相当容易。即使您想提出一些基于网络编码的错误恢复,您也应该对压缩的视频数据执行操作。

其次,已指定实时传输协议(RTP 或 RFC3550)和编解码器特定的有效载荷格式(例如 RFC6184)以解决 1)如何将压缩视频帧拆分为多个 RTP 数据包(如果必要的,即压缩数据包大小 > MTU),以及 2)如何在接收端重建它们。

它们还解决了许多其他问题,例如数据包重新排序、媒体同步、报告/计算接收器质量(例如丢失、抖动、RTT 等)。

正如@Hobo Sapiens 所指出的,当人们花费大量时间提出经过测试的解决方案时,为什么要重新发明***。在这种情况下,我认为 RTSP 有点矫枉过正。 (它为会话建立和控制提供信号)

您可以对端口进行硬编码,在一台机器上设置 RTP/UDP 接收器,在另一台机器上设置 RTP 发送器。

此外,还有一些很棒的开源库已经实现了 RTP/RTCP RTSP,例如 live555,在推出自己的库之前,您可能需要了解一下。正确实施标准需要花费大量时间和精力。

编辑 我怀疑走标准路线可能会花费太多精力,或者您可以使用 RTP 规范中的序列号等可用部分(允许您重新排序数据包并检测丢失),以及 RFC6184 规范中的 NAL 单元分段并构建您的自己的自定义标头为您提供所需的最少功能。

【讨论】:

通过编码/解码,我指的是前向纠错方案。编码器读取数据包并构造一些冗余/修复数据包。然后,数据包从编码器发送到解码器,并引起一些损失。然后,我想看看解码器可以用源数据包重建多少,并修复它收到的数据包。 好的,想了这么多,在这种情况下,根据您的目的调整标准中的序列号和分段方案,然后将 FEC 应用于视频编码(例如 H264)数据包。您绝对不想保护未压缩的媒体,因为您的数据速率可能会导致更大的损失。

以上是关于用 C++ 流式传输视频? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将实时视频流式传输到浏览器(低延迟)[关闭]

从 ios 流式传输实时视频 [关闭]

将 openCV C++ 视频流式传输到浏览器

如何仅流式传输来自 YouTube 的视频的声音? [关闭]

您可以将视频从Android流式传输到Google云端硬盘吗? [关闭]

将视频从 Android 相机流式传输到服务器 [关闭]