c++ - 如何查看网络流(http)中的视频?

标签 c++ c http video youtube

我想知道:youtube 或任何其他包含视频的网站如何将此类数据发送给客户? 当使用 Web 浏览器并请求网页时,浏览器会向服务器发送 HTTP GET 请求,服务器返回 html 页面;但视频数据是如何传输的呢? 它是否打开了一个额外的连接来做到这一点? 并且,有没有办法使用某些软件库在程序中捕获此流?

我想要实现的是类似VLC的网络流功能,可以让你观看youtube上的视频,但我不知道从哪里开始。

谢谢

最佳答案

Youtube 主要使用 MPEG DASH用于视频流。如果您用鼠标右键单击任何 YouTube 视频并选择 Nerd 统计信息,您将看到它:

screenshot

基于 HTTP 的视频流协议(protocol),例如 MPEG DASH , HLS , Smooth streaming等都有一个 list 文件,它描述了实际视频数据的结构(其中包含每个媒体 block 的 URL、可用的表示、有关每个表示的比特率的信息等信息)。客户端首先下载此 list ,对其进行解析,然后开始下载分段。每次下载后,客户端都会测量 channel 吞吐量。并根据此信息决定在下一个请求中下载哪个 block 。

使用youtube-dl例如,您可以查看哪些表示可用:

youtube-dl -F https://www.youtube.com/watch?v=b6u9WJ01Oxs

curl 一起,您还可以下载 DASH list (MPD)

curl $(youtube-dl https://www.youtube.com/watch?v=GbHSMwc4eCA --youtube-include-dash-manifest --dump-intermediate-pages -s | grep manifest.google | cut -d ' ' -f 5) > dash_manifest.mpd

下载 MPD 后,您可以使用 GPAC 来播放它 Osmo4 (MP4客户端)。或者甚至可能是 VLC(我不确定 VLC 中的 DASH 插件自 2012 年以来是否更新过)。

关于c++ - 如何查看网络流(http)中的视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36534020/

相关文章:

http - 在 Jenkins 中启用 HTTPS?

c++ - C++ 中的哪些流函数控制类的输入和输出值的格式?

c++ - 如何在 C++ 中获取 main() 中的第一个参数?

c++ - 按时间管理许可证

c - 如何获取用户输入以在 C 中打开文件?

javascript访问网络面板信息

c++ - 通过在 getter 方法上应用 begin() 获得的迭代器不允许访问指向列表的第一个元素

c++ - QTreeWidget选择点击版并双击

c - ** 运算符是什么意思,C?

http - 当用户同时离开页面时,http 请求会发生什么情况?