Como nomear os quadros de saída com base no timestamp de apresentação?

2

Estou usando o ffmpeg para extrair quadros de vídeos. Usando o comando genérico

ffmpeg -i input.avi out%d.png

Estou obtendo todos os quadros, mas quero que os nomes dos quadros indiquem o timestamp de apresentação no vídeo, ou seja, a hora, minuto, segundo e milissegundos.

Por exemplo, se um quadro for exibido no filme no tempo 0 horas 5 minutos 30 segundos e 37 milissegundos, o quadro de saída deverá ser nomeado: out_00_05_30_37.png .

Alguma ajuda?

    
por diggy 12.11.2014 / 18:26

2 respostas

1

Não consegui descobrir nenhuma maneira fácil de reproduzir argumentos ffmpeg e resolver meu problema. Então eu percebi outra solução alternativa também sugerida pelo usuário: dstob.

Digamos que eu precise armazenar 10 quadros por segundo, então eu posso iterar o tempo em 0,1 segundo e usando o argumento -ss eu posso buscar o filme naquele timestamp em particular. Agora eu vou saber qual frame extrair e o timestamp desse frame também. A seguir está o meu código, embora seja no MATLAB, a idéia geral é fazer uma iteração ao longo do tempo.

%your movie name
movie = 'movie_name.mp4';

%get the duration of movie in seconds
[to,te] = system(['ffprobe -i ' movie ' -show_format -v quiet | grep duration']);
tmp_ = strsplit(te,'=');
total_time = floor(str2num(tmp_{2}));

%initialize the timer in milliseconds
curr_time = 0;

while curr_time < total_time*1000
    %iterate 10 times in 1 second to get 10 frames
    for i=1:10
            time_ = curr_time + 100*i;                       
            milli_sec = floor(mod(time_,1000));         %milliseconds
            time_ = floor(time_ / 1000);               
            sec = floor(mod(time_,60));                 %seconds;
            time_ = floor(time_ / 60);                 
            min = floor(mod(time_,60));                 %minutes;
            hour = floor(time_ / 60);                   %hour
            frame_name = sprintf('out_%.2d_%.2d_%.2d_%.3d.png',hour,min,sec,milli_sec);

            %Set the ffmpeg command to seek it to the time you want and
            %store the frame
            cmnd = sprintf('ffmpeg -ss %.2d:%.2d:%.2d.%.3d -i %s -frames:v 1 %s',hour,min,sec,milli_sec,movie,frame_name);
            system(cmnd);                               
    end;
    curr_time = curr_time + 1000;         %increment the timer by 1 second
end;

Espero que ajude.

    
por 13.11.2014 / 22:23
0

Se a taxa de quadros for constante, você poderá criar um script para renomear os arquivos. Eu não sei de uma maneira de fazer isso dentro do ffmpeg.

Se você quisesse automatizar um pouco mais as coisas, você poderia usar o ffprobe para gerar suas informações de quadros e usar essas informações para renomear os arquivos.

    
por 13.11.2014 / 04:13

Tags