Я не мог придумать какой-нибудь простой способ, которым я могу играть с аргументами 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;
Надеюсь, поможет.