首先,您需要使用 Directshow、AVFoundation 或 v4l 等 API 来捕获视频,具体取决于您的平台。
接下来,您需要使用编解码器将原始帧转换为您可以通过实际网络实际发送的内容。原始视频数据非常庞大,因此需要编解码器来有损压缩该数据。在基本级别上,编解码器将在帧之间进行重复数据删除,因此不会为每一帧发送任何没有真正改变的内容。编解码器比这要先进得多,它使用基于我们实际感知的技术(例如,将亮度变化优先于颜色变化)来减少需要发送的数据量。您不需要编写编解码器......这样的任务不是一件小事,而且非常复杂。有许多现有的编解码器可供选择。平台选择和兼容性通常会为您提供一两个选项。
现在,您需要一个传输协议。大多数视频流实际上是通过 TCP 完成的,确保流是稳定的、无故障的。 (UDP 数据包一直在重新排序,并且很容易丢失。)视频会议等实时应用程序确实经常使用 UDP,因为延迟比质量流更重要。在实时对话中丢帧和偶尔出现故障是可以接受的。例如,在电影中出现此类故障是不可接受的,甚至是延迟无关紧要的单向直播流。
您使用的应用程序协议通常会决定您使用的是 TCP 还是 UDP。 RTSP 是一个选项,还有很多其他选项。但是,如果要在浏览器中查看流,则需要带有 Flash 的 RTMP、WebRTC 或基于 HTTP 的协议,例如直接 HTTP 渐进式、DASH 或 HLS。
DASH 和 HLS 是分段流的形式,通常通过记录几秒钟并将静态文件写入磁盘来实现,它们由普通的 HTTP 服务器提供服务。清单或播放列表文件用于向客户端指示所有这些文件的位置。 (如果您愿意,可以直接从您的应用程序中提供相同的资源。)
WebRTC 旨在用于在以点对点方式连接的两个客户端之间流式传输数据和媒体流。可以构建一个充当这些客户端之一的服务器。我不知道有任何开源代码可以让您发送媒体流。但是,它已经商业化了。
HTTP 渐进式是您只需将输出流式传输到客户端的位置。并非所有格式都可以通过这种方式流式传输。 MJPEG 可以这样工作。 (MJPEG 常被安全摄像头使用。它质量低,但易于实现,并且可以在大多数浏览器中按原样工作。)
如果我今天做这个项目,我会使用带有 VP8 或 VP9 的 DASH 作为视频编解码器(取决于兼容性),并使用 Opus 作为音频编解码器。您将需要客户端页面上的 DASH.js 以方便使用媒体源扩展加载 DASH 片段。这是获得体面质量流的最兼容方式。