Кадр выборки рассчитывает с ffmpeg

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

95
задан Stu Thompson 11 September 2011 в 18:50
поделиться

4 ответа

Рассчитайте его на основе времени, вместо этого.

Это то, что я делаю, и это отлично работает для меня, и для многих других.] Во-первых, найдите длину видео в следующем фрагменте:

Seems stream 0 codec frame rate differs from container frame rate: 5994.00 
(5994/1) -> 29.97 (30000/1001)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/stu/Movies/District9.mov':
  Duration: 00:02:32.20, start: 0.000000, bitrate: 9808 kb/s
    Stream #0.0(eng): Video: h264, yuv420p, 1920x1056, 29.97tbr, 2997tbn, 5994tbc
    Stream #0.1(eng): Audio: aac, 44100 Hz, 2 channels, s16
    Stream #0.2(eng): Data: tmcd / 0x64636D74

Вы сможете последовательно и безопасно найти Длительность: hh:mm:ss.nn, чтобы определить размер исходного видео клипа. Затем, для каждой строки обновления (CR, без LF) вы можете разобрать текст на текущую временную отметку в:

frame=   84 fps= 18 q=10.0 size=       5kB time=1.68 bitrate=  26.1kbits/s    
frame=   90 fps= 17 q=10.0 size=       6kB time=1.92 bitrate=  23.8kbits/s    
frame=   94 fps= 16 q=10.0 size=     232kB time=2.08 bitrate= 913.0kbits/s    

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

frame=   24 fps= 24 q=-1.0 size=       0kB time=1.42 bitrate=   0.3kbits/s    
frame=   41 fps= 26 q=-1.0 size=       0kB time=2.41 bitrate=   0.2kbits/s    
[h264 @ 0x1013000]Cannot parallelize deblocking type 1, decoding such frames in
sequential order
frame=   49 fps= 24 q=26.0 size=       4kB time=0.28 bitrate= 118.1kbits/s    
frame=   56 fps= 22 q=23.0 size=       4kB time=0.56 bitrate=  62.9kbits/s    

Как только у вас есть время, это простая математика: время / дюрация * 100 = % выполнено.

.
13
ответ дан 24 November 2019 в 05:49
поделиться

Попробуйте что-нибудь вроде:

ffmpeg -i "path to file" -f null /dev/null

Он записывает номер кадра в stderr, так что вы можете извлечь последний кадр из него.

8
ответ дан 24 November 2019 в 05:49
поделиться

Не все форматы хранят свое количество кадров или общую продолжительность - и даже если это так, файл может быть неполным, поэтому ffmpeg не обнаруживает ни один из них точно по умолчанию.

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

В качестве альтернативы вы можете попробовать AVFormatContext-> nb_index_entries или обнаруженную продолжительность, которая должна работать нормально, по крайней мере, неповрежденный AVI / MOV, или библиотеку FFMS2, которая, вероятно, слишком медленная, чтобы возиться с индикатор.

8
ответ дан 24 November 2019 в 05:49
поделиться

попробуйте это:

ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '
4
ответ дан 24 November 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: