优酷客户端下载的[超清]清晰度视频会被保存为kux格式。其实这个格式就是一堆分段的flv。
头上应该还有索引之类的,懒得分析了其实是分析不出来
因为木有索引,我们只能自己判断flv段何时开始,何时结束;因为flv文件头特征不明显其实是想装b,我们需要分析flv的格式。
在参考这篇博客之后,写了个脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
def grab(infile, outfile, buff_size = 0x200000, debug = True): #flv format http://wuyuans.com/2012/08/flv-format/ _in = open(infile, 'rb') _in.seek(0xe40000) # 第一个flv似乎总是在这个位置开始 _out = None idx = 0xe40000 # 当前偏移量 cnt = 1 _ = '\x00' * 11 # setup while _: if _ == '\x00' * 11: if _out: # 不是第一次 _out.close() _out = None idx = math.ceil(idx / 0x40000) * 0x40000 # flv的起始位置是0x40000对齐的 _in.seek(idx) _h = _in.read(9 + 4) # 头 9b,前一个tag 4b if _h.strip('\x00') != '' and _h[:3] == 'FLV': # 看开头是不是FLV _out = open(outfile[:-4] + '_%d.flv' % cnt, 'wb') print('New flv(%dp) @0x%08X%s' % (cnt, idx, ' ' * 20)) _out.write(_h) idx += 9 + 4 cnt += 1 else: tagtype, length = struct.unpack('b3s7x', _) # 我们只关心tag类型(其实也可以不用关系)和数据长度 length = _byte2ui24(length) # 3字节转uint24 if debug: print('TAG:%6s 0x%06X @0x%08X-0x%08X%s' % (TAG_TYPE[tagtype], length, idx, idx + length + 4, '\b' * 42), end = '') idx += length + 4 _ = _in.read(length + 4) #data, pre tag size _out.write(_) #next tag _ = _in.read(11) if _out: _out.write(_) idx += 11 _in.close() #_out.close()# out is already closed return cnt - 1 |
拖出了所有flv之后,我们用mkvmerge来合体
完整脚本在gist上可以找到