我们做爬虫工作时,经常会遇到要把爬取的视频下载到本地做存储,那么我们如何使用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
打开咱么刚才那个视频,测试一下:
以上我们就全部分析结束了。
文章首发于微信公众号菜鸟童靴,不定期更新,如有需要后台加微信