Десятые сутки пылают станицы, или как делать скриншот из Youtube плеера
Пылают станицы и плавятся мозги. Мы пытаемся получить screenshot flash-приложения, построенного на основе YouTube Player SDK или фрагмент заданной области, заданного кадра YouTube-видео. Уже долго ломаем над этим голову. Пока ничего не получается.
Ниже методы, которые мы уже опробовали:
1) Получение screenshot методами Flash. Этот вариант не работает т.к. YouTube запрещает доступ к своему плееру помимо методов разрешенных в YouTube Player SDK (попытки обращения к самому приложению запрещены файлами политики crossdomain.xml на серверах YouTube). В багтрекере YouTube Player SDK запрос на отмену таких security ограничений отклонен с резолюцией Won't fix:
2) Фотографирование на стороне клиента методами JS с помощью библиотеки html2canvas (и подобных). html2canvas и подобные библиотеки не фотографируют Flash-приложения.
3) Фотографирование на стороне сервера с помощью серверного WebKit. Решение не подходит, т.к. на стороне сервера не удается задать правильный кадр видео (YouTube player позволяет позиционироваться только с точностью до keyframe, э это не подходит так как нужна большая точность, так как объект может уже сместиться).
4) Получение скриншота из RTSP потока, полученного с помощью YouTube API. Позволяет получить скриншот только с точночтью до keyframe. Что для нас не подходит. (нужна большая точность)
Ситуация уже входит в режим «злобного спортивного интереса». Я знаю что на Хабре нам помогут и не хочу чтобы это выглядело как попытка дополнительного мотивирования, но в качестве личной благодарности, тому кто поможет нам решить эту «загадку» мы подарим новый ipad или любой другой похожий планшет на выбор. А также выразим свою искреннюю благодарность и восхищение.
Примерно в таком виде:
ffmpeg -ss 200.15 -t 0.2 -i rtsp://v4.cache3.c.youtube.com/CjYLENy73wIaLQkZ72dLOkt_CRMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYKnWibCCituxUQw=/0/0/0 /video.3gp image%d.png
cvlc rtsp://v7.cache4.c.youtube.com/CiILENy73wIaGQlTJ8ZFBv0wtxMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp --start-time=31 --run-time=1 --vout=dummy --aout=dummy --video-filter=scene --scene-format=jpeg --scene-replace --scene-ratio=1 --scene-prefix=snapshot --scene-path=/directory/
на выходе получаем скриншот 31 секунды в /directory/snapshot.jpg
--start-time с какой секунды начинать
--run-time после секунды останавливаться, можно заменить на --stop-time
Получаем на выходе пачку файлов image001.png-image030.png (image001.png частенько порченый из за старта декодинга не с кейфрейма).
Далее можно брать произвольный требуемый кадр в png и делать с ним что угодно.
Конечно требуется тестирование и возможно декодинг придется делать не 1-й а нескольких секунд. Но в любом случае точность получается до кадра.
Но я честно незнаю можно ли с ютуба получить rtmp в требуемом качестве с их апи никогда не работал :)
Предполагал нечто похожее (заабузили ютуб в прошлом). Тем не менее, цитата
As I mentioned before, if you want to select a thumbnail that best represents your video then become a partner. If you think your channel isn't suitable then work on it to make it more attractive to partnership.
1. У ffmpeg/VCL метод декодирования фреймов отличает от флешового, поэтому мы никогда не попадем в нужный кадр. Можно конечно выдавать несколько кадров из секундного отрезка, но нам нужен автоматизм, без выбора кадра пользователем.
2. Работа на сервере заранее плоха тем, что в зависимости от количества пользователей и временного отрезка на видео, где нужно сделать скриншот, будет кратно расти время обработки. Т.е. юзеры начнут вставать в очередь и это будут сначала секунды, а потом и минуты при сверхбольших объемах. Мы хотим добиться получения изображения менее, чем за секунду, при любом количестве запросов.
1. — Странно. Если в видео требуемый кадр имеет номер 545 то он в любом случае будет иметь номер 545. даже вне зависимости от методов кодирования и т.п. Другой вопрос как вы получаете номер требуемого кадра и насколько точно.
2. Ну мой подход в большей степени спровоцирован вариантами 3 и 4 которые вы рассматривали. В вебе на стороне клиента я мягко говоря слабо разбираюсь, а тут знакомые слова увидел :-)
Опять таки серверный процесс получения скриншотов вполне нормально масштабируется как по ядрам так и в принципе по серверам. По моим прикидкам озвученый мной способ даст возможность обработать от 1 до 10 запросов на ядро в секунду (зависит как минимум от разрешения). Хотя время реакции (от поступления запроса до выдачи результата) скорее всего будет около 2-х секунд из-за работы с rtsp. Итого на одном сервере можно рассчитывать на обработку (8 ядер на 3600 секунд) от 28 до 280 тысяч запросов в час. Не так уж мало хотя сколько вам реально нужно я конечно же не знаю. В целом же кушать оно будет не сильно больше чем какой-нибудь друпал на генерацию странички, а масштабироваться в некоторых случаях проще.
В общем если есть желание — пишите. Можно обсудить подробнее и попробовать на практике.