如题,如何获取一个MP4文件格式的视频时长?嗯,对MP4格式的文件进行解析,如果有表示时长的字段,直接读取即可。而我对该格式又不熟悉该怎么办?当然是使用搜索引擎了。
果不其然,看到了这个字段:
看着解释就是 时长 = duration / time scale,只需要知道这两个字段在文件中的位置即可,而且这两个是连续的字段。
通过阅读理解文章,位置即是 “mvhd”结构 的偏移,找出 “mvhd”结构即可。
下面是我在某音上下载的视频,用win 10 系统自带的播放器,显示时长22秒:
用 UltraEdit 软件将其打开,查看其二进制内容:
红色箭头处指向的是 “mvhd”结构,偏移13个字节为 time scale,其值为 0x000003E8,偏移17个字节为 duration,其值为 0x000056E0,根据解析,该视频时长结果:
0x000056E0 / 0x000003E8 = 22.240
结果是 22.240 秒,与播放软件的视频时长一致。通过对多个视频的对比发现,结果都是一致的,因此,可以写个程序来获取。
-
import struct
-
-
-
def get_video_duration(video_file):
-
with open(video_file,'rb') as fp:
-
data = fp.read(80)
-
time_scale = struct.unpack('>I', data[4*16 - 4:4*16 + 0])
-
durations = struct.unpack('>I', data[4*16 + 0:4*16 + 4])
-
-
duration = durations[0] / time_scale[0]
-
return duration
上面的代码只是对该视频的获取有效,如果是另外的MP4文件,可能就失效了,因此需要一个通用的脚本:
-
import struct
-
-
-
def get_video_duration(video_file):
-
with open(video_file,'rb') as fp:
-
data = fp.read()
-
-
index = data.find(b'mvhd') + 4
-
time_scale = struct.unpack('>I', data[index+13:index+13+4])
-
durations = struct.unpack('>I', data[index+13+4:index+13+4+4])
-
duration = durations[0] / time_scale[0]
-
return duration
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/109508008