我正在使用 ffmpeg 从视频中提取帧。使用通用命令
ffmpeg -i input.avi out%d.png
我获取了所有帧,但我希望帧的名称指示它们在视频中的显示时间戳,即小时、分钟、秒和毫秒。
例如,如果影片中在 0 小时 5 分 30 秒 37 毫秒时显示某一帧,则输出帧应命名为:out_00_05_30_37.png
。
有什么帮助吗?
答案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;
希望能帮助到你。
答案2
如果帧速率是恒定的,那么您只需创建一个脚本来重命名文件即可。我不知道如何在 ffmpeg 中执行此操作。
如果您想要进一步自动化操作,您可以使用 ffprobe 来生成帧信息,并使用该时间戳信息来重命名文件。