Кто-либо знает, как выбрать количество общих кадров из видеофайла с помощью ffmpeg? Вывод рендеринга ffmpeg показывает текущий кадр, и мне нужно количество кадра для вычисления прогресса процента.
Это то, что я делаю, и это отлично работает для меня, и для многих других.] Во-первых, найдите длину видео в следующем фрагменте:
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 = % выполнено
.
Попробуйте что-нибудь вроде:
ffmpeg -i "path to file" -f null /dev/null
Он записывает номер кадра в stderr, так что вы можете извлечь последний кадр из него.
Не все форматы хранят свое количество кадров или общую продолжительность - и даже если это так, файл может быть неполным, поэтому ffmpeg не обнаруживает ни один из них точно по умолчанию.
Вместо этого попробуйте перейти к концу файла и прочитать время, а затем посчитать текущее время, пока вы идете.
В качестве альтернативы вы можете попробовать AVFormatContext-> nb_index_entries
или обнаруженную продолжительность, которая должна работать нормально, по крайней мере, неповрежденный AVI / MOV, или библиотеку FFMS2, которая, вероятно, слишком медленная, чтобы возиться с индикатор.
попробуйте это:
ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '