【问题标题】:Capture current image from youtube live stream从 youtube 直播中捕获当前图像
【发布时间】:2016-09-09 09:17:57
【问题描述】:
我想每隔几秒处理一次 youtube 直播的输出。在其他人的帮助下,我想出了一个解决方案来捕获图像以供以后处理,但它往往会损坏并且速度太慢:
youtube-dl --prefer-ffmpeg -f worst "https://www.youtube.com/watch?v=Gy5PC5Auoak" -o - | dd count=32 bs=4096 | ffmpeg -i - -f image2 -frames:v 1 img22.jpeg
(抓取 128 KB 的流数据并将其中的一帧提取为 jpg)。最快的一次运行大约需要 30 秒。其他尝试涉及将 youtube-dl 管道传输到 mplayer,但上面显示的方法似乎更有意义,因为它明确限制了接收的数据量。
- 为什么要花这么长时间?另外,是否有一些广告在前 25 秒左右就出现了?
- 有更快的解决方案吗?
- 可以通过 ustream 获得相等的流,如果这样更容易的话。
我希望结果在树莓派上运行。
【问题讨论】:
标签:
youtube
video-capture
image-capture
【解决方案1】:
youtube-dl 命令首先将流解析为 .m3u8。每次运行youtube-dl 命令时都会发生这种情况。如果您要按时间间隔处理图像,则保存已解析的 .m3u8 URL 然后直接与 ffmpeg 一起使用会更快。
首先,使用-g 标志解析.m3u8 流并将其保存到文件中,例如stream-url。您只需执行一次,直到 m3u8 链接不再有效(见下文)。
youtube-dl -g -f worst "https://www.youtube.com/watch?v=Gy5PC5Auoak" > stream-url
然后,您可以简单地使用 ffmpeg 中的 url。这是您将在间隔上运行的命令:
ffmpeg -i $(cat stream-url) -f image2 -frames:v 1 img22.jpeg
我发现 .m3u8 流也有过期时间。这意味着您必须每隔几个小时更新一次 URL。您可以将其视为stream-url 的一部分,其中显示.../expire/1559856313/...,其中1559856313 只是流将过期的Unix 时间。可以使用一个简单的 bash 脚本对此进行检查并根据需要进行更新。
我在我的 Raspberry Pi 2 上每 10 秒运行一次高清流(即“没有-f worst”),它似乎工作得很好。