video - Youtube/Netflix 如何流式传输视频?

标签 video youtube streaming rtmp netflix

我正在从事一个项目,我正在其中创建一个视频流网络服务。到目前为止,我创建的是一种将视频内容同步写入用户流的服务。但是,我的 Web 服务的工作方式与 Youtube/Netflix 的工作方式不同。

我只是想知道 Youtube/Netflix 如何流式传输视频。这些网站不会直接向用户的浏览器发送视频内容。我正在查看开发人员选项中的网络选项卡,发现这两个网站都对范围 header 已更改的 Web API 发出新请求。谁能告诉我这是如何工作的。

最佳答案

在非常高的层面上,客户端(浏览器、移动应用程序等)从服务器请求视频。

因为视频很大,用户不想等到整个视频都下载完才回放,所以大多数客户端都设计为一旦有足够的视频就开始播放解码并开始播放。

大多数客户端和服务器现在至少支持 HTTP 流:

  • 客户端接收有关视频的信息,包括总文件大小(例如 75,000 字节)。
  • 客户端最初请求视频的一个子集 - 例如字节 0 - 5000。
  • 客户端接收、解码并开始播放接收到的初始字节。
  • 随着播放的进行,客户端请求视频的下一部分 - 例如字节 5001-10,000 等等。

Adaptive Bit rate Streaming 以此为基础来适应不同的网络条件:

  • 服务器包含同一视频的多个副本,以不同的比特率编码以适应不同的网络速度(一般来说,比特率越高,质量越好)。这些视频都被分成相等长度(从时间的角度来看)的 block - 例如2 秒 block 。
  • 客户端请求有关视频的信息(例如使用网页中的源 URL)并接收“索引”或“ list ”文件作为响应。此文件包含指向此视频的所有视频、音频、字幕流等的指针
  • 客户端从 list 中列出的比特率流中请求视频的第一个 block 。例如,它可能会在开始时以最低比特率开始,以确保视频快速启动,以防出现网络问题。
  • 如果第一个 block 下载成功,则客户端将为接下来的 2 秒视频请求下一个最高比特率的 block 。
  • 客户端重复此操作,直到它达到最高比特率,或者它发现下载 block 有延迟,这意味着该比特率对于当前的网络条件来说太高了。
  • 客户端在整个播放过程中持续监控连接,并根据网络状况提高或降低比特率。

您实际上可以在 YouTube、Netflix 等中看到 ABR 效果:当您开始播放视频时,您经常会看到前 30 秒到一分钟的质量不如它提高比特率。

YouTube 也有一些不错的统计数据,您可以通过右键单击视频并查看“ Nerd 统计数据”来访问这些数据。

关于video - Youtube/Netflix 如何流式传输视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35256547/

相关文章:

c++ - 使用 Media Foundation source reader 读取 3D(左右)视频

php - 从Youtube Channel获取视频信息,使用PHP将其存储在MYSQL中

iphone - 应用程序从 iPhone 上的后台返回后的 copyNextSampleBuffer

c# - WPF - MediaElements 不显示多个 H.265 视频

javascript - 如何通过Angular2中的链接发送基于视频上传的放置请求

c# - .NET 视频音频聊天

java - 在 Java 中将对象转换为 Integer 进行赋值

api - 使用 Zend Framework PHP 从 youtube 视频中获取喜欢/不喜欢

android - 找不到com.google.android.youtube意向

video - GoLang - 通过视频搜索(作为字节)