使用C ++流式传输视频?

时间:2015-07-09 03:11:11

标签: c++ sockets opencv video udp

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

修改 我怀疑标准路线可能会花费太多精力,或者您可以从RTP规范中获取可用部分(例如序列号(允许您重新排序数据包并检测丢失)),并从RFC6184规范中获取NAL单元碎片并构建您的拥有自定义标题,为您提供所需的最少功能。