Захватите текущее изображение из прямой трансляции на YouTube
Я хотел бы обрабатывать вывод живого потока 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 КБ потоковых данных и извлекает один кадр из этого в jpg). Самый быстрый пробег занял около 30 секунд. Другие попытки включали передачу youtube-dl в mplayer, но показанный выше подход, кажется, имеет больше смысла, поскольку он явно ограничивает объем получаемых данных.
- Почему это так долго? Кроме того, возможно, какая-то реклама пришла таким образом, что это заняло первые 25 секунд или около того?
- Есть ли более быстрые решения для этого?
- через ustream доступен равный поток, если это облегчает.
Я хотел бы, чтобы результат работал на малиновом пи.
0 ответов
В youtube-dl
сначала преобразует поток в файл.m3u8. Это происходит каждый раз, когда вы запускаетеyoutube-dl
команда. Если вы обрабатываете изображение с интервалом, может быть быстрее сохранить разрешенный URL-адрес.m3u8, а затем использовать его напрямую с ffmpeg.
Сначала разрешите поток.m3u8 с помощью -g
флаг и сохранение его в файл, например stream-url
. Вам нужно сделать это только один раз.
youtube-dl -g -f worst "https://www.youtube.com/watch?v=Gy5PC5Auoak" > stream-url
Затем вы можете просто использовать URL-адрес в ffmpeg. Это команда, которую вы должны выполнять с интервалом:
ffmpeg -i $(cat stream-url) -f image2 -frames:v 1 img22.jpeg
Я обнаружил, что у потока.m3u8 также есть время истечения срока действия. Это означает, что вам придется обновлять URL-адрес каждые несколько часов. Вы можете увидеть это как частьstream-url
где это говорит .../expire/1559856313/...
где 1559856313 - это время Unix, когда истекает срок действия потока. Можно использовать простой сценарий bash, чтобы проверить это и при необходимости обновить.
Я запускал это на своем Raspberry Pi 2 с потоком HD (т.е. без -f worst
') каждые 10 секунд, и, похоже, все работает нормально.