Streaming 视频流应用程序从哪里开始

Streaming 视频流应用程序从哪里开始,streaming,video-streaming,live-streaming,Streaming,Video Streaming,Live Streaming,因此,现在有一段时间,我正在考虑创建某种视频流应用程序(客户端和服务器)。做一些小搜索,我总是得到流应用程序,而不是如何编写流应用程序 我知道应该是这样的。。。捕获数据,打包,发送到服务器,然后服务器将广播给任何连接的人…对吗 那么,我应该从哪里开始……我应该学习套接字……我应该学习更多关于如何实现UDT或TCP协议……或者这两种协议的结合吗???您在搜索中遇到的部分问题是,您没有真正定义要解决的问题。“视频流应用程序”还不够。。。制约因素是什么?有助于缩小适当解决方案范围的一些问题: 玩家是

因此,现在有一段时间,我正在考虑创建某种视频流应用程序(客户端和服务器)。做一些小搜索,我总是得到流应用程序,而不是如何编写流应用程序

我知道应该是这样的。。。捕获数据,打包,发送到服务器,然后服务器将广播给任何连接的人…对吗


那么,我应该从哪里开始……我应该学习套接字……我应该学习更多关于如何实现UDT或TCP协议……或者这两种协议的结合吗???

您在搜索中遇到的部分问题是,您没有真正定义要解决的问题。“视频流应用程序”还不够。。。制约因素是什么?有助于缩小适当解决方案范围的一些问题:

  • 玩家是否需要基于网络
  • 源是否需要基于web
  • 还有哪些平台需要支持
  • 您有什么样的延迟要求?(视频会议风格,其中质量不太重要,但低延迟非常重要……或更传统的流媒体,您选择质量,而不太关心延迟。)
  • 源流和播放流的比率是多少?每个流有很多观察者,还是有很多观察者却很少
  • 您的整个运营需要达到什么样的规模
我知道应该是这样的。。。捕获数据,打包,发送到服务器,然后服务器将广播给任何连接的人…对吗

接近。让我们把它分解一下。所有视频流都将包含一些捕获元素、编解码器、容器或传输、分发服务器以及连接到服务器并反转整个过程的客户端

媒体捕获 正如我在上面所暗示的,你如何做到这一点取决于你所处的平台。这实际上是变化最大的地方。如果你在Windows上,就会有DirectShow。OSX和Linux有自己的捕获框架。还请记住,您还需要音频流,这在视频捕获中不一定要处理。如果您是基于web的,则需要getUserMedia

编解码器 如果发送未压缩的原始帧,效率会非常低。如果没有编解码器,我们知道视频流是不可能的。每个编解码器的工作原理都有点不同,但有很多常用技术

在一个基本的层面上,如果你能想象一个电影带上的帧,每一帧与下一帧没有太大的不同。对于给定的快照,可能会发生运动,但帧中的许多内容保持非常相似。我们可以通过发送更改的内容来节省大量带宽。(现实地说,由于我们拍摄的世界的模拟性质,每个帧总是有点不同,但是编解码器在几乎完全相同的东西上花费的带宽很少,而在完全不同的东西上花费的带宽很少。)当我们转到不同的镜头时,编解码器看到整个帧是不同的,并发送整个帧。可以独立使用的框架是“I型框架”。I帧也定期插入流中,每几秒钟插入一次。大多数视频播放器只会寻找I帧,因为任何不是I帧的东西都需要解码之前的所有帧,直到前一个I帧。如果你曾试图在电影中准确地击中某个位置,但玩家在几秒钟内就把你放在了附近的某个地方,这就是为什么会发生这种情况。此外,如果某些帧被损坏,流将在下一个I帧上自我纠正。(曾经看过一段视频,其中很大一部分在几秒钟内变为绿色,但后来又变好了吗?这就是为什么。)

视频编解码器还利用了我们如何看待事物的本质,使其发挥优势。我们的眼睛对亮度的变化比颜色的变化更敏感。因此,编解码器在帧的亮度差异上比在色差上花费更多的带宽。还有一些巧妙的技巧可以平滑和添加视觉噪音,使事物看起来更正常,而不是块状

还需要音频编解码器。虽然CD质量的立体声未压缩音频流可能只占用1.4mbit,但就互联网而言,这是一个很大的带宽。许多流媒体视频网站在整个视频中使用的带宽比这要少。音频编解码器,就像视频编解码器一样,使用了一些技巧来帮助我们节省带宽。(欲了解更详细的解释,请阅读我关于MP3工作原理的帖子:)

容器 下一步是以容器格式将编码的音频和视频流多路复用在一起。如果您正在录制到磁盘,您可能会选择类似于MKV的东西,它支持音频、视频、字幕等,所有这些都在同一个文件中。WebM基本上是MKV的一个有限版本,但其设计便于浏览器支持。或者,您可以选择一种不太复杂的格式,如MP4,您在音频和视频编解码器的选择上受到限制,但可以获得更好的播放器兼容性

由于您是实时流媒体,流媒体协议和容器之间的界限通常会有点模糊。HLS将要求您制作一组独立的视频文件,但您的muxer和编解码器需要知道如何将这些文件分段,以便它们可以再次组合在一起。我认为RTMP从FLV获得了一些线索,但在与客户机的交换中也有一些关于流的信息。(如果你使用RTMP,你可能会在别处读到……我对引擎盖下的RTMP知之甚少。)

服务器 这里有很多选择。在WebRTC的情况下,“服务器”实际上可能是执行所有编码的web浏览器,因为它可以运行点对点。或者,您可能有一个运行RTMP的专用流服务器,或者一个用于分发HLS块的普通HTTP web服务器。同样,您选择什么取决于您的需求

客户 客户端需要连接到服务器,对数据流进行解复用