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