ffmpeg 时间戳到日志文件
ffmpeg timestamp to logfile
如何记录每一帧的时间戳?
命令:
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_video_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
来自docs:
-show_packets
Show information about each packet contained in the input multimedia stream.
The information for each single packet is printed within a dedicated section with name "PACKET".
-sexagesimal
Use sexagesimal format HH:MM:SS.MICROSECONDS for time values.
因此每个 [PACKET][/PACKET]
部分中的 pts_time
是 HH:MM:SS.MICROSECONDS
格式的时间戳。
如何记录每一帧的时间戳?
命令:
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_video_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
来自docs:
-show_packets
Show information about each packet contained in the input multimedia stream.
The information for each single packet is printed within a dedicated section with name "PACKET".
-sexagesimal
Use sexagesimal format HH:MM:SS.MICROSECONDS for time values.
因此每个 [PACKET][/PACKET]
部分中的 pts_time
是 HH:MM:SS.MICROSECONDS
格式的时间戳。