2

Я использую ffmpeg для извлечения кадров из видео. Использование универсальной команды

ffmpeg -i input.avi out%d.png

Я получаю все кадры, но я хочу, чтобы имена кадров указывали их метку времени представления в видео, то есть час, минуту, секунду и миллисекунду.

Например, если кадр показан в фильме в моменты времени 0 часов 5 минут 30 секунд и 37 миллисекунд, то выходной кадр должен иметь имя: out_00_05_30_37.png .

Любая помощь?

2 ответа2

1

Я не мог придумать какой-нибудь простой способ, которым я могу играть с аргументами ffmpeg и решить мою проблему. Таким образом, я нашел другой обходной путь, также предложенный пользователем:dstob.

Допустим, мне нужно хранить 10 кадров в секунду, затем я могу перебрать время с точностью до 0,1 секунды и, используя аргумент -ss найти фильм к этой конкретной отметке времени. Теперь я буду знать, какой фрейм извлечь и временную метку этого фрейма тоже. Ниже приведен мой код, хотя в MATLAB общая идея состоит в том, чтобы выполнять итерации во времени.

%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;

Надеюсь, поможет.

0

Если частота кадров постоянна, вы можете просто создать скрипт для переименования файлов. Я не знаю, как сделать это в ffmpeg.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .