Python小技巧|如何获取MP4格式的视频时长

举报
悦来客栈的老板 发表于 2020/12/29 00:08:45 2020/12/29
【摘要】 如题,如何获取一个MP4文件格式的视频时长?嗯,对MP4格式的文件进行解析,如果有表示时长的字段,直接读取即可。而我对该格式又不熟悉该怎么办?当然是使用搜索引擎了。 果不其然,看到了这个字段: 看着解释就是 时长 =  duration / time scale,只需要知道这两个字段在文件中的位置即可,而且这两个是连续的字段。 通过阅读理解文章,位置即是 ...

如题,如何获取一个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 秒,与播放软件的视频时长一致。通过对多个视频的对比发现,结果都是一致的,因此,可以写个程序来获取。


   
  1. import struct
  2. def get_video_duration(video_file):
  3. with open(video_file,'rb') as fp:
  4. data = fp.read(80)
  5. time_scale = struct.unpack('>I', data[4*16 - 4:4*16 + 0])
  6. durations = struct.unpack('>I', data[4*16 + 0:4*16 + 4])
  7. duration = durations[0] / time_scale[0]
  8.     return duration

上面的代码只是对该视频的获取有效,如果是另外的MP4文件,可能就失效了,因此需要一个通用的脚本:


   
  1. import struct
  2. def get_video_duration(video_file):
  3. with open(video_file,'rb') as fp:
  4.         data = fp.read()
  5.     index = data.find(b'mvhd') + 4
  6. time_scale = struct.unpack('>I', data[index+13:index+13+4])
  7.     durations  = struct.unpack('>I'data[index+13+4:index+13+4+4])
  8. duration = durations[0] / time_scale[0]
  9. return duration

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/109508008

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。