【问题标题】:Basic concept on live-streaming video直播视频的基本概念
【发布时间】:2017-04-29 12:55:23
【问题描述】:

我是一名业余 C++ 开发人员,对将实时视频流式传输到另一台计算机的概念感兴趣。

这是我对发生的事情的一个非常简单的抽象想法,我喜欢运行它,尽管你们看看我是否明白我的事实。

我对直播的理解是这样的:

  1. 服务器设置 UDP 服务器(最容易理解它的基于消息的 而不是恒定连接)(我知道还有很多其他原因 为什么流媒体会使用UDP,但解析数据确实是我的弱点)

    1. 服务器读取编码的视频数据(我不确定它发送的速度有多快,例如一次 1 帧的数据等)
    2. 服务器发送给客户端
    3. 客户端接收视频并解码
    4. 客户端向用户显示视频。

这是基本的想法吗?或者还有更多。我想在我的树莓派上安装一个摄像头,然后将实时提要显示到网络浏览器(我相信我必须学习 rstp)

【问题讨论】:

    标签: video encode live-streaming


    【解决方案1】:

    首先,您需要使用 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 片段。这是获得体面质量流的最兼容方式。

    【讨论】:

    • 感谢您提供的非常详细的信息!很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2014-09-22
    相关资源
    最近更新 更多