我是业余C ++开发人员,他对将实时视频流式传输到另一台计算机的概念感兴趣。
这是一个非常简单的抽象概念,我对所发生的事情有所了解,并且喜欢运行它,虽然你们看看我是否直接得到了我的事实。
我理解直播的方式是:
服务器设置UDP服务器(最容易理解它的消息基础 而不是恒定连接)(我知道还有很多其他原因 为什么流媒体会使用UDP,但解析数据确实是我的弱点)
这是基本的想法吗?还是有更多。我想将相机附加到我的覆盆子pi上,然后只显示网页浏览器的实时信息(我相信这会让我不得不学习rstp)
答案 0 :(得分:7)
首先,您需要使用类似Directshow,AVFoundation或v4l的API捕获视频,具体取决于您的平台。
接下来,您需要使用编解码器将原始帧转换为您可以通过实际网络实际发送的内容。原始视频数据非常庞大,因此需要使用编解码器来对数据进行有损压缩。在基本级别,编解码器将在帧之间进行重复数据删除,以便不会为每个帧发送任何不真正改变的内容。编解码器比这更先进,使用基于我们实际感知的技术(例如,优先考虑亮度变化而不是颜色变化)来减少需要发送的数据量。你不需要编写编解码器......这样的任务不是一项小任务,而且非常复杂。有许多现有的编解码器可供选择。平台选择和兼容性通常会为您提供一两个选项。
现在,您需要一个传输协议。大多数视频流实际上是通过TCP完成的,确保了一个稳定而不是小故障的流。 (UDP数据包会一直重新排序,很容易丢失。)视频会议等实时应用程序通常使用UDP,因为延迟比质量流更重要。丢帧是可以接受的,并且在实时对话中偶尔会出现故障。例如,在电影中出现这样的故障是不可接受的,甚至是延迟并不重要的单向直播流。
您使用的应用程序协议通常会指示您是否使用TCP或UDP。 RTSP是一种选择,还有很多其他选项。但是,如果要在浏览器中查看流,则需要RTMP与Flash,WebRTC或基于HTTP的协议,如直接HTTP渐进式,DASH或HLS。
DASH和HLS是分段流式传输的形式,通常通过记录几秒钟并将静态文件写入磁盘来实现,其中它们由普通的HTTP服务器提供服务。清单或播放列表文件用于向客户端指示所有这些文件的位置。 (如果愿意,您可以直接从您的应用程序提供相同的资源。)
WebRTC旨在用于以对等方式连接的两个客户端之间的流数据和媒体流。可以构建一个充当这些客户端之一的服务器。我不知道任何开源代码以允许您发送媒体流的方式执行此操作。但是,它已在商业上完成。
HTTP progressive是您只需将输出流式传输到客户端的地方。并非所有格式都可以通过这种方式流式传输。 MJPEG可以这样工作。 (MJPEG通常被安全摄像头使用。它质量低但易于实现,并且在大多数浏览器中都可以正常工作。)
如果我今天正在做这个项目,我将DASH与VP8或VP9一起用于视频编解码器(取决于兼容性),以及Opus用于音频。您需要在客户端页面上使用DASH.js以便于使用Media Source Extensions加载DASH段。这是获得体面质量流的最兼容的方式。