Obter a lista de I-Frames em um vídeo no FFMPEG / Python

0

Estou tentando selecionar 10 quadros de um determinado vídeo, possivelmente com maior variedade e cenas. Eu gostaria de experimentar com vários cenários de seleção, mas o bom é que a noção de I-frame inerentemente significa mudanças de cena! Então eu gostaria de obter os quadros I. Mas talvez existam muitos quadros I, então provavelmente eu tenho que prová-los.

Como posso obter a lista do frame_number de todos os frames em um vídeo em FFMpeg ou Python? Eu gostaria de usar a lista para selecionar apenas 10 deles e salvá-los como PNG / JPEG.

    
por Tina J 02.08.2018 / 17:17

3 respostas

0

Obtendo informações de aqui , eu foi capaz de fazer isso com ffprobe :

def iframes():
    if not os.path.exists(iframe_path):
        os.mkdir(iframe_path)
    command = 'ffprobe -v error -show_entries frame=pict_type -of default=noprint_wrappers=1'.split()
    out = subprocess.check_output(command + [filename]).decode()
    f_types = out.replace('pict_type=','').split()
    frame_types = zip(range(len(f_types)), f_types)
    i_frames = [x[0] for x in frame_types if x[1]=='I']
    if i_frames:
        cap = cv2.VideoCapture(filename)
        for frame_no in i_frames:
            cap.set(cv2.CAP_PROP_POS_FRAMES, frame_no)
            ret, frame = cap.read()
            outname = iframe_path+'i_frame_'+str(frame_no)+'.jpg'
            cv2.imwrite(outname, frame)
        cap.release()
        print("I-Frame selection Done!!")


if __name__ == '__main__':
    iframes()
    
por 03.08.2018 / 17:22
1

Isso produzirá todos os quadros i como imagens PNG.

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png

Agradecemos a este comentário uma pergunta superuser.com similar. Como extrair todos os quadros principais de um videoclipe ?

Espero que ajude. Felicidades.

Ian

    
por 03.08.2018 / 01:29
1

Isso parece um problema X / Y, então vou propor vários comandos diferentes:

Lista de carimbos de data / hora

Se você deseja gerar uma lista de registros de data e hora para cada quadro-chave:

ffprobe -v error -skip_frame nokey -show_entries frame=pkt_pts_time -select_streams v -of csv=p=0 input
0.000000
2.502000
3.795000
6.131000
10.344000
12.554000

Observe o -skip_frame nokey .

selecione o filtro

Outro método é usar o filtro de seleção com a opção scene para exibir suas miniaturas:

ffmpeg -i input -vf "select=gt'(scene,0.4)',scale=160:-1" -vsync vfr %04d.png
    
por 03.08.2018 / 21:02