我們做爬蟲工作時,經常會遇到要把爬取的視頻下載到本地做存儲,那麼我們如何使用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
打開咱麼剛纔那個視頻,測試一下:
以上我們就全部分析結束了。
文章首發於微信公衆號菜鳥童靴,不定期更新,如有需要後臺加微信