如何根据输出帧的显示时间戳来命名输出帧?

如何根据输出帧的显示时间戳来命名输出帧?

我正在使用 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 来生成帧信息,并使用该时间戳信息来重命名文件。

相关内容