A python .ap and .sc generator for enigma2 recordings
from struct import pack, unpackimport ioimport os.pathimport sysLEN = 24064PACKET_SIZE = 188 def WriteBufInternal(f, sc, tm): f.write(pack('>QQ', sc, tm))def FrameGenerator(ts, packetoffset=0, maxlen=-1): s = io.open(ts, 'rb', buffering=LEN) buf = bytearray(PACKET_SIZE) streamtype = -1 pid = -1 while len(s.peek())>=PACKET_SIZE: #Skip if not a whole packet left while ord(s.peek()[0]) != 0x47: #Sync stream s.read(1) print("Skipped 1 byte") filepos = s.tell() if maxlen >= 0 and filepos > maxlen: #Limit reading for debugging purposes break if s.readinto(buf) != PACKET_SIZE: #If not enough data quit s.close() break if not buf[3]&0x10: #Skip if there is no payload continue pos = buf[4] + 5 if buf[3]&0x20 else 4 #Skip adaption field if pos > PACKET_SIZE: #Skip large adaption field continue tpid = ((buf[1]&0x1F) << 8) | buf[2] #Read current packet pid if (not (buf[pos] or buf[pos+1] or not buf[pos+2]&0x01) and buf[pos+3]&0xf0 == 0xe0 and buf[1]&0x040): #Find video pid pid = tpid elif pid>=0 and pid != tpid: #Wrong pid continue pts = -1 if buf[1]&0x40: #Pusi if buf[pos] or buf[pos+1] or not buf[pos+2]&0x01: print("Broken startcode") continue if buf[pos+7]&0x80: #PTS present? pts = ((buf[pos+9]&0xE) << 29 | (buf[pos+10]&0xFF) << 22 | (buf[pos+11]&0xFE) << 14 | (buf[pos+12]&0xFF) << 7 | (buf[pos+13]&0xFE) >> 1) pos = buf[pos+8] + 9 while pos < PACKET_SIZE - 4: if not (buf[pos] or buf[pos+1] or not buf[pos+2]&0x01): sc = buf[pos+3] if streamtype < 0: #Stream type is unknown if sc in [0x00, 0xb3, 0xb8]: streamtype = 0 print("Detected MPEG2 stream type") elif sc in [0x09]: streamtype = 1 print("Detected H264 stream type") else: pos += 1 continue if streamtype == 0: #MPEG2 if sc in [0x00, 0xb3, 0xb8]: #Picture, sequence, group start code retpos = retpts = retdat = retpos2 = -1 if sc == 0xb3 and pts >=0 : #Sequence header retpos = filepos retpts = pts if pos < PACKET_SIZE - 6: retdat = sc | buf[pos+4] << 8 | buf[pos+5] << 16 if pts >= 0: retdat |= (pts << 31) | 0x1000000; retpos2 = filepos + pos yield (retpts, retpos, retdat, retpos2) elif streamtype == 1: if sc == 0x09: retpos = retpts = retdat = retpos2 = -1 retdat = sc | (buf[pos+4] << 8) if pts >= 0: retdat |= (pts << 31) | 0x1000000 retpos2 = filepos + pos if (buf[pos+4]&0x60) == 0: if pts >= 0: retpos = filepos retpts = pts yield (retpts, retpos, retdat, retpos2) pos += 1def ProcessScAp(ts, maxlen=-1): scf = open(ts+'.sc', 'wb') apf = open(ts+'.ap', 'wb') filesize = os.path.getsize(ts) lastprogress = -1 for (pts, pos, dat, pos2) in FrameGenerator(ts, maxlen=maxlen): curpos = max(pos, pos2) if curpos >= 0: progress = curpos*100/filesize if progress > lastprogress: print("{0}%".format(progress)) lastprogress = progress if pts >= 0 and pos >= 0: WriteBufInternal(apf, pos, pts) if dat >= 0 and pos2 >= 0: WriteBufInternal(scf, pos2, dat) scf.close() apf.close()-----------------------------------------------------------------------------------------------
maaf,,masih newbie masalah transcoder,,silahkan kunjungi http://serioustinker.blogspot.com/2013/01/a-python-ap-and-sc-generator-for.html
untuk lebih mendalam.,,,thnks
|
Read more






