2014-11-07 2 views
1

Я столкнулся с https://askubuntu.com/questions/377579/ffmpeg-output-screenshot-gallery/377630#377630, это прекрасно. Это сделало именно то, что я хотел.Быстрый поиск ffmpeg несколько раз для скриншотов

Однако я использую удаленные URL для создания временной шкалы экрана. Я знаю, что можно быстро искать удаленные файлы с помощью https://trac.ffmpeg.org/wiki/Seeking%20with%20FFmpeg (используя -ss перед -i), но это работает только один раз.

Я ищу способ использовать команду

./ffmpeg -i input -vf "select=gt(scene\,0.4),scale=160:-1,tile,scale=600:-1" \ 
-frames:v 1 -qscale:v 3 preview.jpg 

, но с использованием метода быстрой искать, как это в настоящее время очень медленно при использовании удаленного файла. Я использую PHP, но я знаю, что существует метод C с помощью av_seek_frame, я едва знаю C, поэтому я не могу реализовать это в скрипте PHP, который я пишу. Так что, надеюсь, это можно сделать непосредственно с помощью ffmpeg в функции PHP system().

В настоящее время я запускаю отдельные команды ffmpeg (с помощью метода -ss), а затем объединяю скриншоты вместе в PHP. Тем не менее, с помощью этого метода он будет переназначать метаданные каждый раз, и более оптимизированный метод будет состоять в том, чтобы все это происходило в одной и той же командной строке, потому что я хочу уменьшить количество запросов, сделанных на удаленный URL, чтобы я мог запускать больше скриптов в последовательности друг с другом.

Благодарим за помощь.

+0

так вам нужно несколько «снимков» удаленного файла? если так https://trac.ffmpeg.org/wiki/Create%20a%20thumbnail%20image%20every%20X%20seconds%20of%20the%20video может быть полезно – rogerdpack

+1

Да, в удаленном файле, но с использованием метода быстрого поиска , В настоящий момент, используя ссылку -vf в ссылке askubuntu, похоже, выполняет медленный метод, так как для создания скриншотов требуется очень много времени. Используя «-ss» перед тем, как «-i», тем не менее, генерирует их очень быстро. В настоящее время быстрее создать несколько команд «-ss», а затем сшить их вместе, а не использовать метод «-vf». – user3786834

ответ

1

Основная причина, по которой это происходит медленно, заключается в том, что «select = gt (scene \, 0.4)» требует, чтобы каждый кадр декодировался и сравнивался со следующим, чтобы можно было обнаружить изменения сцены.

Я не верю, что можно делать то, что вы делаете, быстрее, чем вы делаете с детектором изменений сцены. Вы могли бы предоставить n снимков экрана из видео_для/n шагов через видео, кроме того, вы также можете проверить, что каждый кадр не является черным, проверяя интенсивность изображения выше порога.

1

Да, это потому, что -ss не раньше -i, и вам нужно добавить это перед каждым вводом.

Итак, вот рабочий пример, который быстро выводит его. ffmpeg -ss 10 -i test.avi -frames: v 1 -f image2 -map 0: v: 0 thumbnails/output_0.png -ss 800 -i test.avi - frames: v 1 -f image2 -map 1: v: 0 thumbnails/output_1.png -ss 2400 -i test.avi -frames: v 1 -f image2 -map 2: v: 0 thumbnails/output_2.png

Значит, 0: v: 0 означает 1-й вход , и выберите видеопотоки, первый видеопоток 1: v: 0 означает второй вход и выберите видеопотоки, первый видеопоток (0) 2: v: 0 означает второй вход и выберите видеопотоки, первый видеопоток (0)

+0

Я попробовал ваш ответ с помощью 'ffmpeg -ss 100 -i $ URL-кадров: v 1 -filter: v $ FILTER file1.jpg -ss 500 -i $ URL-рамки: v 1 -filter: v $ FILTER file2.jpg 'чтобы файл file1.jpg был эскизом в 100 секунд, а file2.jpg - миниатюрами на 500 секунд, но оба файла идентичны, когда их не должно быть. Правильно ли я использую это? – user779159

+0

@ user779159 Можете ли вы попробовать точную команду ниже ffmpeg -ss 100 -i $ URL-рамки: v 1 -f image2 -map 0: v: 0 file1.jpg -ss 500 -i $ URL-рамки: v 1 -f image2 -map 1: v: 0 file2.jpg –

Смежные вопросы