LINUX.ORG.RU

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

 ,


6

6

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

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

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

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

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

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

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

★★★★★
Ответ на: комментарий от deep-purple

Всё эта инфа мне и так доступна. Декодировать кадры всё равно приходится.

Ну и чё-то оно совсем не быстрое. Это конечно не шибко бенчмарк, но показательно.

time ffprobe -select_streams v -show_frames test.mp4 > out.txt
...
Duration: 00:03:07.93
...
19.46s user 0.17s system 98% cpu 19.867 total

Три минуты ролика за 20 сек пролистало... У меня оно быстрее листает.

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

Что-то доолго слишком, да. Значит нужно глянуть что делает xjadeo. Первый проход у него вообще быстрый, второй помедленнее, но суммарно, полуторачасовой фильм он лопатит секунд за 10-15.

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

Он так же само работает. Только он сначала генерирует список индексов (Seek-Table). Правда не пойму зачем.

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

Скачал его себе и разочаровался:

WARNING: Keyframe distance is very large (>100 frames).
The file is not unsuitable. Please transcode.

PS: или я туплю, или «not unsuitable» - полный бред. Должно быть «not suitable».

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

Гы ))

А я смотрю исходники, xjadeo.c:736, первый проход собирает ключевики, второй верифицирует. Причина того сообщения — начиная со строки 1129. Может просто увеличить лимиты? Ну будет на каких-то видео тормозить, а что делать?

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

Чтобы скакать быстро куда ему скажут. Он с Ардором используется, тот ему командует что показывать синхронно со звуком.

deep-purple ★★★★★
()
Ответ на: комментарий от 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
()
Ответ на: комментарий от RazrFalcon

Его там и нет, зато итерация по кадрам там есть искаропки, тебе останется только каунтер инкрементить и тормозить на нужном.

Допиши этот метод, поделись)

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

Да. Только плеер никуда не спешит, ему 30 кадров в секунду(условно) надо сделать, а мне нужно 10-60 за <20ms.

тогда на видеокарте декодировать или чем-то ещё более специализированном. И то гарантии насчёт 20мс нет.

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

Кути за это получают деньги.

А вот про линукс не согласен. Совсем недавно приходилось портировать модуль написанный под более старое ядро на 4.10.

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

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

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

А вот про линукс не согласен.

У ядра только одно API - системные вызовы. И оно невероятно стабильное. Разве другие функции для написания модулей официально называются API?

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

Только индексы далеко не везде и не всегда есть. Особенная ненависть идет в адрес авторов матрешки.

Свой видеоредактор я забросил, да.

ruzisufaka
()
Ответ на: комментарий от deep-purple

Дык на mjpeg и у меня летает. А когда h264 c кучей b-frames - тупняк.

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

тебе останется только каунтер инкрементить и тормозить на нужном.

Ничего, что это будет космически медленно?

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

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

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

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

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

Так у меня на этом видео и тормозит. Если ролик в xvid или h264 Main@L3 - всё ок.

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

А может всё-таки рассмотреть вариант кеширования индекса кадров? Всё, до чего уже успело дотянуться, пишем в кеш. А последующие обращения будут реактивными. Так же, обращения к отсутствующей в кеше точной инфе нужно сделать через существующую хоть какую-то ближайшую. Максимально убрать повторные проходы. Конечно, если задача позволяет.

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

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

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

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

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

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

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

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

Я не знаю юзкейза. Если у тебя, допустим, юзер часто возвращается к одному и тому же видео. Либо, к нему приходит пакет видосиков на обработку, он пока тупит, сопроводительную документацию заполняет, болтает с женой по телефону - оно всё кешируется.

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

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

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

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

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

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

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

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

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

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

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

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

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

А если взаимодействие интерактивное, с оператором, то надо учитывать человеческий фактор. Жизненно: cейчас в данный момент оно потормозит чуток, а через 5 минут, пока он в носу чешет, будет летать - это кешем и фоновой работой обеспечивается. Надо искать способы, не только в стену алгоритмов и ffmpeg-а долбиться, а организовать работу оператора соответствующим образом.

Ты так и не ответил (или я не заметил), тебе с человеком нужно взаимодействовать или с каким роботом? И какова максимальная задержка по ТЗ от момента произошедшего и запечатленого события до момента его фиксации оператором, и до момента его обработки оператором. Это очень важные значения, можно на этом сыграть. Например, у меня был большой объем видео, но оффлайн, записи за прошлые дни. И они успешно кешировались до заступления на смену оператора. А потом он непрерывно свою смену лопатил, ничего не тормозило.

Deleted
()
Ответ на: комментарий от 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 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

О каком роботе идёт речь? =)

Прогой пользуется специально обученный человек. Это не для общего пользования прога. Но у них, судя по предыдущим проблема, IQ на уровне макаки.

Никакого кеширования нет и не может быть. Файл скинули с видео камеры, флешки или ещё откуда-то и мы должны как можно быстрее получить результат.

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

можно им прогресс бар или крутилку показывать во всплывающем окне, пока до нужного кадра декодирование дойдёт :)

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

крутилка и так есть, ибо обработка в отдельном потоке...

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

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

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

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

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

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

Никакого кеширования нет и не может быть. Файл скинули с видео камеры, флешки или ещё откуда-то и мы должны как можно быстрее получить результат.

=) А на флешке он до этого полгода лежал? Лол. Ты им предложи, пусть флешку втыкают, а сами руки моют и чайку пьют, да погорячее. А в это время все закешировалось, и готово к работе. Торопиться надо при ловле блох. А интерактивность обеспечить можно и вот такими способами.

робот.

Робот - программа анализа, без участия человека. Но, видимо, это отпадает.

Кароч, пусть заказчик не парит мозг. Это только в фильмах приходит чел со смартфоном, скачивает туда полпетабаайта 4k@60fps видео, и оно тут же ему анализ всех лиц с досье за месяц съемки и отчет формирует. Такого не бывает. Либо, ты можешь неплохой миллиардик заработать, реализовав.

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

Кароч, пусть заказчик не парит мозг.

Не в этой вселенной =)

В общем я ещё обсуждаю с ним эту проблему. Посмотрим чем всё закончится.

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