|
网上拷贝来的,没试过,你自己试试. 论坛发链接的话,要审核,估计这两天版主们都过节去了.
从youku下载视频,总是分段的,非常麻烦去看,
折腾许久,搞出来这个,试试还没啥问题
flv的格式 http://osflash.org/flv#flv_format, 好像百度百科也有详细介绍,
大体上是
9字节 header + n个tag
每个tag的格式为:
4字节 上一个tag的size(上1个tag的data长度+11字节),
1字节 data format(video,audio之类),
3字节 data 长度,
3字节 timestamp(低bit位),
1字节 timestamp extented(高bit位),
3字节 保留,
data(长度为上面3字节)
不明白为啥每个独立的flv文件最后多出4字节为哪般,难道是youku的1个啥保留之类的?
- #-*- encoding: utf-8 -*-
- import binascii
- import sys,re,os
- # 第一个flv文件,取得最后的tagsize,赋于下一个flv,按最后的datalength复制给输出文件,得到总time_1
- # 从第二个flv文件起,去掉header部分后,timestamp对应的4个byte,加上之前的time_1,重新分配
- # 第二个flv文件也要取得最后的tagsize,赋于下一个flv,按最后的datalength复制给输出文件,最后总的time_2
- # 按此循环下去
- def splitdata(sf,outfh,lasttime,lasttagsize_hex):
- # 取得一个flv文件, lasttagsize, lasttime,lastdataposition,
- ts = open(sf,'rb').read()
-
- if lasttime == 0:
- outfh.write(ts[:9])
- #dp = 14
- i = 9
-
- while i+5 < len(ts):
- dp = i+5
- if lasttagsize_hex:
- outfh.write(binascii.a2b_hex(lasttagsize_hex)) # 4 byte tag size
- else:
- outfh.write(ts[dp-5:dp-1])
-
- outfh.write(ts[dp-1:dp+3])
- #print "test:::",len(ts),dp,binascii.b2a_hex(ts[dp:dp+3])
- tagdatalen = int(binascii.b2a_hex(ts[dp:dp+3]),16)
- tp = dp+3
- if lasttime == 0:
- outfh.write(ts[dp+3:dp+7])
- else: # 重新计算分配timestamp
- oldtime = int(binascii.b2a_hex(ts[dp+6])+binascii.b2a_hex(ts[dp+3:dp+6]),16)
- newtime_hex = hex(oldtime + lasttime)[2:].zfill(8)
- outfh.write(binascii.a2b_hex(newtime_hex[2:]+newtime_hex[:2]))
-
- outfh.write(ts[dp+7:dp+10+tagdatalen])
-
- i = i + 15 + tagdatalen
- #dp = dp+15+tagdatalen # 进入到下一个tag
-
- # 根据最后1个dp(dataposition),得到最后的lasttagsize, lasttime
- lasttagtime = int(binascii.b2a_hex(ts[dp+6])+binascii.b2a_hex(ts[dp+3:dp+6]),16)
- lasttagsize = int(binascii.b2a_hex(ts[dp:dp+3]),16)+11
- lasttagsize_hex = hex(lasttagsize)[2:].zfill(8)
- lasttime = lasttime + lasttagtime
- print "%s has write, this time is %s, total time is %s, last tag size is %s(%s)" %(sf,lasttagtime,lasttime,lasttagsize,lasttagsize_hex)
- return lasttime,lasttagsize_hex
-
- def main():
- outfh = open('testout.flv','wb')
- lasttime= 0
- lasttagsize_hex = None
-
- flvlist = [
- '1.flv',
- '2.flv',
- '3.flv',
- '4.flv',
- '5.flv',
- '6.flv',
- '7.flv',
- '8.flv',
- '9.flv',
- '10.flv',
- '11.flv',
- '12.flv',
- '13.flv',
- ]
-
- for f in flvlist:
- lasttime,lasttagsize_hex = splitdata(f,outfh,lasttime,lasttagsize_hex)
-
-
- if __name__ == '__main__':
- main()
复制代码 |
|