ffmpeg Ход сканирования видео во время удаления кадра
Я сканирую входное видео, чтобы извлечь определенные кадры, используя ffmpeg
Выберите фильтр. Выбор основан на сложном creteria, и количество извлеченных кадров не может быть предсказано (я делаю обнаружение сцены, но это может быть что-то другое - например, выбор всех I- кадров и т. Д.).
Мне нужно отобразить процент отсканированного (декодированного) видео (например, 10% или 90%).
Я попробовал несколько способов сделать этот вывод при разборе консоли, как это обычно делают люди при работе с кодированием, но это не помогает в процессе сканирования (например, может ли ffmpeg отображать индикатор выполнения? Или ffmpeg Progress Bar - Encoding Percentage в PHP)
ffmpeg -progress sceneProgr.txt -i input.wmv -vsync passthrough -an -vf select='gt(scene\,0.2)',showinfo scene%%05d.png
Выходные данные выглядят следующим образом:
<..>
frame= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A
n:0 pts:16550 pts_time:16.55 pos:4205325 fmt:rgb24 sar:0/1 s:640x480 i:P iskey:1 type:I checksum:95895BC9 plane_checksum:[95895BC9]
frame= 1 fps=0.7 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A
n:1 pts:24591 pts_time:24.591 pos:6685325 fmt:rgb24 sar:0/1 s:640x480 i:P iskey:0 type:P checksum:FF4CC015 plane_checksum:[FF4CC015]
'frame=...' and 'n:...' lines are repeated for each of the extracted frames.
И то и другое frame=...
а также n:...
строки относятся к числам в выводе и, следовательно, не могут быть использованы для расчета прогресса, как люди обычно делают это (поскольку я не могу предсказать, сколько кадров будет найдено заранее, и, кроме того, они не равномерно распределены по входному видео).
Если я укажу -progress progress.txt
Параметр файл progress.txt выглядит следующим образом:
frame=5
fps=1.2
stream_0_0_q=0.0
total_size=N/A
out_time_ms=43209833
out_time=00:00:43.209833
dup_frames=0
drop_frames=0
progress=continue
frame=6
fps=1.3
stream_0_0_q=0.0
total_size=N/A
out_time_ms=52252200
out_time=00:00:52.252200
dup_frames=0
drop_frames=0
progress=continue
frame=6
fps=1.2
stream_0_0_q=0.0
total_size=N/A
out_time_ms=52252200
out_time=00:00:52.252200
dup_frames=0
drop_frames=0
progress=continue
Новая часть записывается примерно каждую секунду и относится к последнему извлеченному кадру. Что несколько полезно как out_time
относится к позиции последних извлеченных кадров во входном видео, поэтому я могу рассчитать ход сканирования по нему как
progress = out_time_ms/total_input_time
Но это не идеально, так как будет обновляться только тогда, когда новый кадр, который соответствует select
критерии извлечены. Так что, если у меня есть большая часть видео без соответствующих кадров, прогресс не изменится в течение длительного времени.
Подведение итогов:
Я ищу способ рассчитать прогресс сканирования видео при использовании фильтра выбора.
Любые идеи высоко ценятся.
1 ответ
Что вы получаете на каждый кадр, как данные из ffprobe.....
[FRAME]
media_type=video
key_frame=1
pkt_pts=0
pkt_pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
pkt_duration=1
pkt_duration_time=0.040000
pkt_pos=44
width=800
height=542
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
reference=3
[/FRAME]
что вы получаете в НАЧАЛЕ
I/stderr ( 7434): Input #0, image2, from '/storage/sdcard0/Pictures/me374658335.jpg':
I/stderr ( 7434): Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
I/stderr ( 7434): Stream #0:0: Video: mjpeg, yuvj420p, 1296x972 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
I/stderr ( 7434): Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/sdcard0/PictureComment/1347139284144.3gp':
I/stderr ( 7434): Metadata:
I/stderr ( 7434): major_brand : 3gp4
I/stderr ( 7434): minor_version : 0
I/stderr ( 7434): compatible_brands: isom3gp4
I/stderr ( 7434): creation_time : 2012-09-08 21:21:41
I/stderr ( 7434): Duration: 00:00:17.22, start: 0.000000, bitrate: 67 kb/s
I/stderr ( 7434): Stream #1:0(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, s16, 64 kb/s
I/stderr ( 7434): Metadata:
I/stderr ( 7434): creation_time : 2012-09-08 21:21:41
I/stderr ( 7434): handler_name : SoundHandle
I/stderr ( 7434): [libx264 @ 0x5a070910] using SAR=1/1
I/stderr ( 7434): [libx264 @ 0x5a070910] using cpu capabilities: ARMv6 NEON
I/stderr ( 7434): [libx264 @ 0x5a070910] profile High, level 3.2
Вы можете использовать метку времени кадра вместе с Длительностью, чтобы рассчитать процент выполнения?