LINUX.ORG.RU

Ищу пример кода как выдрать n-кадр из видео

 ,


6

6

Задача вроде примитивная: получить произвольный кадр из видео. Но не тут-то было.

1) Половина примеров из инета или не собираются или сыпят кучу варнингов о deprecated методах (у меня ffmpeg 3).

2) То, что работает - работает или неверно или медленно. Код из kde-ffmpegthumbs работает реактивно, но у него шаг огромный. Сделать более точное «перемещение» так и не удалось.

Нужны всего две функции: количество_кадров() и получить_кадр().

Сомневаюсь, что это уж такая титаническая задача, но на просторах инета ничего толкового не нашел.

Где уже смотрел: mpenkov/ffmpeg-tutorial, kde-ffmpegthumbs, qtffmpegwrapper, opencv (модуль CvCapture_FFMPEG, его пока и использую, но уж очень медленный он)

PS: нужен поиск именно по кадру, а не по времени.

★★★★★
Ответ на: комментарий от RazrFalcon

мне нужно 10-60 за <20ms.

Это с позиционированием? Если файл не скеширован и нужно прыгать по разным местам (далеко друг от друга), на крутящемся диске seek сам по себе займет много времени.

https://en.wikipedia.org/wiki/Hard_disk_drive_performance_characteristics#See...

Average seek time ranges from under 4 ms for high-end server drives,[13] to 15 ms for mobile drives, with the most common mobile drives at about 12 ms[14] and the most common desktop drives typically being around 9 ms.

Хотя, даже линейно декодировать 10-60 кадров за 20ms с каким-нибудь тяжелым кодеком - хз, хз.

Напиши хоть немного конкретнее какая задача. Большие видосы нужно обрабатывать? Можно ли их препроцессить?

Deleted
()
Ответ на: комментарий от Deleted

Да, видео однозначно должно лежать на SSD.

gag ★★★★★
()
Ответ на: комментарий от Deleted

Человек открывает прогу. drag&drop видоса. Внизу шкала, которая позволяет выбрать промежуток видео. Пользователь выбрал нужный отрезок, нажал ок, и прога начала обработку выбранных кадров.

Как не сложно догадаться: файл должен открываться мгновенно и скролится так же.

Никакого перекодирования быть не должно. Работаем только с исходным файлов. Контроля оборудования у меня нет. То есть должно работать на ноутах с hdd и интеграшкой. Поэтому GPU/SSD и прочие радости мимо кассы.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Поэтому GPU/SSD и прочие радости мимо кассы.

Чудес не бывает. Конечно, сначала надо выжать из алгоритмов все, что можно. А дальше - только адаптация под железа. Есть CUDA - используем. Есть OpenCL - используем. Есть Neon - тоже юзаем. Есть Intel Phi - аналогично. Всякие AVX новейшие должны, по-идее, либы задействовать, либо, опять же, ручками. Про многопоточность не стоит и говорить.

Сталкивался я с такой штукой примерно. Остановился на кешировании, заказчику канало. Пока оператор чаёк пить отошел, оно начинает фигачить. А потом быстра как понос. Ну, а на холодную тяжело ворочалось, рекомендовали погреться. Чайком :)

Deleted
()
Ответ на: комментарий от RazrFalcon

Внизу шкала, которая позволяет выбрать промежуток видео. Пользователь выбрал нужный отрезок, нажал ок, и прога начала обработку выбранных кадров.

Значит, всё таки задача стандартная: скорость 50+ кадров/с нужна не для произвольных кадров, а для отрезка, что уже совершенно реально: т.к. это просто декодирование (но не с заданной в видео FPS, а с макс. возможной для проца)?

gag ★★★★★
()
Ответ на: комментарий от gag

Нет. Скорость нужна для быстрого позиционирования этих отрезков.

То есть я мышкой тягаю ползунок - а прога обновляет кадр.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

То есть должно работать на ноутах с hdd и интеграшкой. Поэтому GPU/SSD и прочие радости мимо кассы.

последние 3 поколения интеловских интеграшек умеют в VAAPI, декодируют FullHD по 100500 кадров в секунду. Только не всякий профиль

Harald ★★★★★
()
Ответ на: комментарий от Harald

Автоматическое переключение на GPU - хорошая идея, но как это реализовать - хз. Тут 1к строк чисто на получение кадра. А адаптивный переброс обработки на видяху - фантастика.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

в последних версиях ffmpeg (из master ветки git-а, в последнем релизе этого ещё нет) значительно упростили инициализацию декодирования с ускорением при помощи VAAPI, в 100 строчек уложишься. Если поддержки со стороны железа нет, будет автоматически декодировать программно.

да и остальные всякие DXVA2 на винде не сильно сложнее будут

Harald ★★★★★
()
Ответ на: комментарий от RazrFalcon

Для самого позиционирования чем вариант mpv (мгновенно по ключевым кадрам) не устраивает? Если в видео не 100, а 100500 кадров при 24 fps (4187 секунд, 1 час 10 минут), то какая разница, если ползунок будет бегать по +-40 кадров, т.е. можно позиционироваться с точностью до 0.04% (40 кадров - это 1.667 секунд, 1.667/4187=0.0003981)! Всё равно мышью точнее просто не тыкнуть.

gag ★★★★★
()
Ответ на: комментарий от gag

У меня ролики 1-10мин. По ключевым кадрам не вариант - слишком большой шаг.

Тут разве что какой-то адаптивный подход. Типа мы сначала грубо позиционируем по ключевым кадрам, а потом подстраиваем уже более точно. Хз как это реализовать в GUI.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Тут разве что какой-то адаптивный подход.

Мне видится это единственным возможным решением. Аналогично предпросмотру ресурсоёмких плагинов: поменять параметр и увидеть как оно будет для целой картинки не реально долго, значит, единственный выход применять только для небольшого кусочка - можно более менее точно оценить подходит или нет и быстро.

gag ★★★★★
()
Ответ на: комментарий от Harald

У меня эта версия, ставил через msys2, работает в разы медленнее (тестил x86 сборку). Хз что они там наменяли, но официальные сборки Qt работают в разы шустрее. Искать конкретную причину времени не было.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от Harald

Если в cygwin-е смогли собрать, значит это возможно.

Под POSIX-совместимую ОС, не? Ведь задача Cygwin как раз в том, чтобы приложения под GNU/Linux абсолютно без изменений можно было собрать под виндой. А mingw-w64 совсем не об этом.

Но и под mingw-w64 собрали webkitgtk2, webkitgtk3 и qtwebkit-tp5: http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-qtwebkit-tp5-4-any.pkg.ta...

gag ★★★★★
()
Ответ на: комментарий от Harald

При чём тут вообще вебкит? Тормоза были при сборки проги с Qt из msys2. В то время как сборка с официальной сборкой Qt не тормозила.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Но он же собран не с официальной сборкой Qt, а своей...

и что? Бери свою. И это 32 битная версия, а не 64

Harald ★★★★★
()
Ответ на: комментарий от Harald

Хотите сказать, что если я закину эти файлы в папку с Qt, установленным через инсталятор Qt - они у меня подхватятся? Очень сомневаюсь.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

И вообще, в крайнем случае можно 32 битный гуй оставить, а декодирование отдельным 64 битным процессом

Harald ★★★★★
()
Ответ на: комментарий от Harald

Во всём. Тупо во всём.

PS: тестил заказчик, а не я. Так что тут дохлый номер. У меня работало, на глаз, так же.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Хотите сказать, что если я закину эти файлы в папку с Qt, установленным через инсталятор Qt - они у меня подхватятся? Очень сомневаюсь.

В чём смысл данного действия? Закидывать надо весь Qt, собранный нужным тулчейном (в данном случае, mingw-w64), со своими хэдерами и библиотеками импорта

Harald ★★★★★
()
Ответ на: комментарий от Harald

Это понятно. Так я и делал, с 32 битной сборкой. Но заказчик забраковал этот вариант.

RazrFalcon ★★★★★
() автор топика
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Внизу шкала, которая позволяет выбрать промежуток видео

Там натурально ползунок? Или можно ввести номер кадра вручную?

Можно, кстати, завести два ползунка: один позиционирует грубо, по ключевым кадрам, второй точно, прямо по отдельным.

Типа когда пользователь перестал возюкать грубый ползунок, можно несколько секунд до и после ключевого разложить по кадрам и дать ему возможность точно позиционироваться.

В любом случае придется хитрить, очень быстро спозиционироваться на произвольный кадр в общем случае не получится

Deleted
()
Ответ на: комментарий от Deleted

Да, ползунок. Я именно этот вариант и предлагал выше.

RazrFalcon ★★★★★
() автор топика
4 мая 2017 г.
Ответ на: комментарий от RazrFalcon

QtWebKit уже смогли собрать с помощью mingw64? Я не осилил

Я осилил. В чем трабл?

На худой конец можно из msys2 бинарный пакет поставить

annulen ★★★★★
()
Ответ на: комментарий от annulen

Логов не осталось. Были ошибки компиляции.

RazrFalcon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.