Захватите текущее изображение из прямой трансляции на 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 секунд, и, похоже, все работает нормально.

Другие вопросы по тегам