python如何下载MP4视频和获取时长

我们做爬虫工作时,经常会遇到要把爬取的视频下载到本地做存储,那么我们如何使用python去下载视频呢,下载视频不是本文章的重点,在此废话不多说,直接上完整的代码:

def download_file(url, base_path, filename='', call_func=''):
    file_path = base_path + filename
    directory = os.path.dirname(file_path)
    mkdir(directory)

    # 进度条
    def progress_callfunc(blocknum, blocksize, totalsize):
        '''回调函数
        @blocknum : 已经下载的数据块
        @blocksize : 数据块的大小
        @totalsize: 远程文件的大小
        '''
        percent = 100.0 * blocknum * blocksize / totalsize
        if percent > 100:
            percent = 100
        # print ('进度条 %.2f%%' % percent, end = '\r')
        sys.stdout.write('进度条 %.2f%%' % percent + "\r")
        sys.stdout.flush()

    if url:
        try:
            log.debug('''
                         正在下载 %s
                         存储路径 %s
                      '''
                      % (url, file_path))

            request.urlretrieve(url, file_path, progress_callfunc)

            log.debug('''
                         下载完毕 %s
                         文件路径 %s
                      '''
                      % (url, file_path)
                      )

            call_func and call_func()
            return 1
        except Exception as e:
            log.error(e)
            return 0
    else:
        return 0

我们开始下载我们的视频:

 

下载好这个视频,当然业务需求,还有可能需要获取这个视频的时长,接下来

进入到今天我们的重点分析:

上网搜索发现了这篇博客:

https://www.cnblogs.com/ranson7zop/p/7889272.html

读完这边博客我们了解到:

时长 = duration/time scale

只需要知道这两个字段在文件中的位置即可,而且这两个是连续的字段。

 

 

如图所知,我们找到mvhd,向后偏移12位,第13位到17位就得到了time scale,17位往后4位就是,duration。

我们打开视频源文件,看一看,我们就能更好的理解了:

 

时长 = 0x00001c93/0x000003E8=7

 

 

我们使用ALC打开视频,对比一下时间:

 

时间刚刚好,ok分析结束

 

为了方便,咱可以写个程序来获取。

 

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

 

打开咱么刚才那个视频,测试一下:

以上我们就全部分析结束了。

 

 

文章首发于微信公众号菜鸟童靴,不定期更新,如有需要后台加微信

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值