最近有個需求,需要不下載視頻,獲取到視頻的時長,就比如網頁上加載視頻,視頻還沒下載完成,就已經能拖動進度條了
網站找了一堆,都寫得不明就里
后來找到1個帖子,講了下MP4的文件格式,然后通過搜索關鍵詞來獲取時長信息
https://www.cnblogs.com/ranson7zop/p/7889272.html
時長 = duration/time scale
只需要知道這兩個字段在文件中的位置即可,而且這兩個是連續的字段。
如圖所知,我們找到mvhd,向后偏移12位,第13位到17位就得到了time scale,17位往后4位就是,duration。
import requests import struct url = 'http://xxxxx.mp4' r = requests.get(url, stream=True) for data in r.iter_content(chunk_size=512): if data.find(b'mvhd') > 0: 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] break
代碼如上
首先使用requests的stream流,開啟后,使用循環下載數據,搜索到mvhd關鍵詞后解析出字段,計算出時長就完成了
理論上來說,除非關鍵詞在文件尾部,否則可以很快就獲取到,不需要下載完整的視頻