ffmpeg时间戳到日志文件

ffmpeg时间戳到日志文件,ffmpeg,timestamp,media,Ffmpeg,Timestamp,Media,如何记录每个帧的时间戳 命令: ffmpeg -i movie.mp4 image%d.jpg -vstats -timestamp now 日志文件: root@chef-server:/home/user# cat vstats_111633.log frame= 1 q= 1.8 f_size= 14964 s_size= 15kB time= 0.040 br= 2992.8kbits/s avg_br= 2992.8kbits/s type= I fram

如何记录每个帧的时间戳

命令:

 ffmpeg -i movie.mp4 image%d.jpg -vstats -timestamp now
日志文件:

root@chef-server:/home/user# cat vstats_111633.log
frame=     1 q= 1.8 f_size=  14964 s_size=       15kB time= 0.040 br=  2992.8kbits/s avg_br=  2992.8kbits/s type= I
frame=     2 q= 1.6 f_size= 150673 s_size=      162kB time= 0.080 br= 30134.6kbits/s avg_br= 16563.7kbits/s type= I
frame=     3 q= 1.6 f_size= 150794 s_size=      309kB time= 0.120 br= 30158.8kbits/s avg_br= 21095.4kbits/s type= I
frame=     4 q= 2.1 f_size= 150853 s_size=      456kB time= 0.160 br= 30170.6kbits/s avg_br= 23364.2kbits/s type= I
frame=     5 q= 4.4 f_size=  95332 s_size=      549kB time= 0.200 br= 19066.4kbits/s avg_br= 22504.6kbits/s type= I
frame=     6 q= 7.0 f_size=  65227 s_size=      613kB time= 0.240 br= 13045.4kbits/s avg_br= 20928.1kbits/s type= I
frame=     7 q= 9.8 f_size=  50215 s_size=      662kB time= 0.280 br= 10043.0kbits/s avg_br= 19373.1kbits/s type= I

因此,理想的做法是记录时间戳,例如11:33:56。事实上,以这种方式检查时间戳的唯一方法是查看日志文件中
time
列的值。这些时间戳以秒表示。所以第一帧的时间戳是0.040秒,第二帧的时间戳是-0.080秒,依此类推

很容易看出,
time
列的外观是不可定制的

为了证明这一点,让我们看看
ffmpeg.c
文件中的
do\u video\u stats
函数。此函数用于填充日志文件的内容。我们可以在这里看到下一行:

fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ", (double)ost->data_size / 1024, ti1, bitrate, avg_bitrate);
time=%0.3f
负责打印时间戳。没有修改格式的选项,因为它是在
fprintf
函数的格式字符串中硬编码的

编辑

正如@LordNeckbeard提到的,您可以将
ffprobe
-sexagesimal
选项一起使用:

ffprobe movie.mp4 -show_packets -sexagesimal
从:


因此,每个
[PACKET][/PACKET][/code>部分中的
pts\u time
都是
HH:MM:SS.MICROSECONDS
格式的时间戳。

事实上,以这种方式检查时间戳的唯一方法是查看日志文件中
time
列的值。这些时间戳以秒表示。所以第一帧的时间戳是0.040秒,第二帧的时间戳是-0.080秒,依此类推

很容易看出,
time
列的外观是不可定制的

为了证明这一点,让我们看看
ffmpeg.c
文件中的
do\u video\u stats
函数。此函数用于填充日志文件的内容。我们可以在这里看到下一行:

fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ", (double)ost->data_size / 1024, ti1, bitrate, avg_bitrate);
time=%0.3f
负责打印时间戳。没有修改格式的选项,因为它是在
fprintf
函数的格式字符串中硬编码的

编辑

正如@LordNeckbeard提到的,您可以将
ffprobe
-sexagesimal
选项一起使用:

ffprobe movie.mp4 -show_packets -sexagesimal
从:


因此,每个
[PACKET][/PACKET][/code>部分中的
pts\u time
都是
HH:MM:SS.微秒格式的时间戳。

好吧,那么我无法用当前时间戳记录时间了?或者有任何可能的黑客吗?@user3580316您在
time
列中已经有了时间戳。它们的格式是唯一的问题吗?@user3580316您可以使用
ffprobe
-show_packets
选项获得类似的结果。但时间也将以秒表示…@EdgarRokyan请参见
ffprobe
@LordNeckbeard中的
-sexagesimal
选项,我认为这正是OP想要的。作为另一个变体,OP可以更改
do\u video\u stats
函数的源代码,并通过此修改构建FFmpeg:)好的,所以我无法使用当前时间戳记录时间?或者有任何可能的黑客吗?@user3580316您在
time
列中已经有了时间戳。它们的格式是唯一的问题吗?@user3580316您可以使用
ffprobe
-show_packets
选项获得类似的结果。但时间也将以秒表示…@EdgarRokyan请参见
ffprobe
@LordNeckbeard中的
-sexagesimal
选项,我认为这正是OP想要的。作为另一个变体,OP可以更改
do\u video\u stats
函数的源代码,并通过此修改构建FFmpeg:)