def aplayer(name): import pymedia.muxer as muxer, pymedia.audio.acodec as acodec, pymedia.audio.sound as sound import time dm = muxer.Demuxer(str.split(name, '.')[-1].lower()) f = open(name, 'rb') f.seek(0, 2) size = f.tell() f.seek(0, 0) snd = resampler = dec = None s = f.read(32000) t = time.time() while len(s): frames = dm.parse(s) if frames: for fr in frames: # Assume for now only audio streams if dec == None: print dm.getInfo(), dm.streams dec = acodec.Decoder(dm.streams[fr[0]]) r = dec.decode(fr[1]) if time.time() - t > SEEK_INTERVAL: newPos = random.randint(0, size / 2) print 'Seek to', newPos dec.reset() dm.reset() f.seek(newPos, 0) t = time.time() s = f.read(512)
def play(file_path): #file_path = "test.mp3" root, ext = path.splitext(file_path) demuxer = muxer.Demuxer(ext[1:].lower()) decoder = None output = None file = open(file_path, 'rb') data = ' ' while data: data = file.read(90000) if len(data): frames = demuxer.parse(data) for frame in frames: if decoder == None: decoder = acodec.Decoder(demuxer.streams[0]) audio_frame = decoder.decode(frame[1]) if audio_frame and audio_frame.data: if output == None: output = sound.Output(audio_frame.sample_rate, audio_frame.channels, sound.AFMT_S16_LE) #while self.stop: #time.sleep(1) output.play(audio_frame.data) while output.isPlaying(): time.sleep(0.05)
def decompressWAV(fname): snd = None fname1 = str.split(fname, '.') fname2 = string.join(fname1[:len(fname1) - 1]) # Open demuxer first dm = muxer.Demuxer(fname1[-1].lower()) dec = None f = open(fname, 'rb') s = " " while len(s): s = f.read(20000) if len(s): frames = dm.parse(s) for fr in frames: if dec == None: # Open decoder dec = acodec.Decoder(dm.streams[0]) r = dec.decode(fr[1]) if r and r.data: if snd == None: snd = wave.open(fname2 + '.wav', 'wb') snd.setparams( (r.channels, 2, r.sample_rate, 0, 'NONE', '')) snd.writeframes(r.data) return snd
def _getStreamLength( self, format, dm, f, fr ): # Get file size if possible pos= f.tell() f.seek( 0, 2 ) self.fileSize= f.tell() f.seek( pos, 0 ) # Demux frames from the beginning and from the end and get the PTS diff if not dm.hasHeader(): startPTS= -1 for d in fr: if d[ 3 ]> 0: startPTS= d[ 3 ] / 90 break # Seek to the end and get the PTS from the end of the file if startPTS> 0: pos= f.tell() f.seek( 0, 0 ) dm1= muxer.Demuxer( format ) s= f.read( FILE_CHUNK ) r= dm1.parse( s ) endPTS= startPTS for d in fr: if d[ 3 ]> 0: endPTS= d[ 3 ] / 90 f.seek( pos, 0 ) self.length= endPTS- startPTS else: lStreams= filter( lambda x: x and ( x[ 'length' ]> 0 ), dm.streams ) if len( lStreams ): self.length= max( [ x[ 'length' ] for x in lStreams ] ) else: self.length= -1
def playAudio(filename): import pymedia.audio.acodec as acodec import pymedia.muxer as muxer import pymedia.audio.sound as sound import time name1 = str.split(filename, '.') # Open demuxer first dm = muxer.Demuxer(name1[-1].lower()) dec = None snd = None s = " " f = open(filename, 'rb') while len(s): s = f.read(20000) if len(s): # 解析出最初的几帧音频数据 frames = dm.parse(s) for fr in frames: if dec == None: # Open decoder dec = acodec.Decoder(dm.streams[0]) #音频数据在 frame 数组的第二个元素中 r = dec.decode(fr[1]) if r and r.data: if snd == None: snd = sound.Output(r.sample_rate, r.channels, sound.AFMT_S16_LE) snd.play(r.data) #8.延时,直到播放完毕 while snd.isPlaying(): time.sleep(0.5)
def get_audio_analysis(audio): dm = muxer.Demuxer('ogg') frames = dm.parse(audio) print len(frames) #return dm #get_audio_decoder dec = acodec.Decoder(dm.streams[0])
def aplayer( name, card, rate, tt ): import pymedia.muxer as muxer import pymedia.audio.acodec as acodec #import pymedia.audio.sound as sound import time dm= muxer.Demuxer( str.split( name, '.' )[ -1 ].lower() ) f= open( name, 'rb' ) #snd= resampler= dec= None dec=None s= f.read( 32000 ) t= 0 while len( s ): frames= dm.parse( s ) if frames: for fr in frames: # Assume for now only audio streams if dec== None: print dm.getInfo(), dm.streams dec= acodec.Decoder( dm.streams[ fr[ 0 ] ] ) r= dec.decode( fr[ 1 ] ) if r: pass #print repr(r) s= f.read( 512 )
def run(self): dm = muxer.Demuxer(str.split(self.mfile, '.')[-1].lower()) self.snd = dec = None s = self.getbuff() while len(s) and not self.stop: frames = dm.parse(s) if frames: for fr in frames: if dec == None: dec = acodec.Decoder(dm.streams[fr[0]]) r = dec.decode(fr[1]) if r and r.data: if self.snd == None: self.snd = sound.Output(int(r.sample_rate), r.channels, sound.AFMT_S16_LE) data = r.data self.snd.play(data) s = self.getbuff() # 淡出 fade_out(self.snd) # 停止 self.snd.stop() # 设置音量正常 self.snd.setVolume(65535)
def demuxVideo( inFile, ftype ): if nodecode==0: import pymedia.video.vcodec as vcodec import pygame YV12= pygame.YV12_OVERLAY pygame.init() r="" filmlen=0 reqpos=0 pos=0 print '*****************************************************************************' print "%s" % inFile, print "file type %s" % ftype print '*****************************************************************************' try: dm= muxer.Demuxer(ftype) except: print "Unsupported fyle type:%s" % ftype return f= open( inFile, 'rb' ) while not dm.hasHeader(): s= f.read( BufferSize) try: r= dm.parse( s ,pos) pos=pos+BufferSize except muxer.SeekRequired, reqpos: print "seek to %d" % reqpos[0] if dm.hasHeader() and reqpos[0]!=0: r=dm.ReadyData() f.seek( reqpos[0]) pos=reqpos[0]
def dumpPCM(name): import pymedia.audio.acodec as acodec import pymedia.muxer as muxer import time, wave, string, os name1 = str.split(name, '.') name2 = string.join(name1[:len(name1) - 1]) # Open demuxer first dm = muxer.Demuxer(name1[-1].lower()) dec = None f = open(name, 'rb') snd = None s = " " while len(s): s = f.read(20000) if len(s): frames = dm.parse(s) for fr in frames: if dec == None: # Open decoder dec = acodec.Decoder(dm.streams[0]) r = dec.decode(fr[1]) if r and r.data: if snd == None: snd = open(name2 + '.pcm', 'wb') snd.write(r.data)
def dumpWAV(name): import pymedia.audio.acodec as acodec import pymedia.muxer as muxer import time, wave, string, os name1 = str.split(name, '.') name2 = string.join(name1[:len(name1) - 1]) # Open demuxer first dm = muxer.Demuxer(name1[-1].lower()) dec = None f = open(name, 'rb') snd = None s = " " while len(s): s = f.read(20000) if len(s): frames = dm.parse(s) for fr in frames: if dec == None: # Open decoder dec = acodec.Decoder(dm.streams[0]) r = dec.decode(fr[1]) if r and r.data: if snd == None: snd = wave.open(name2 + '.wav', 'wb') snd.setparams( (r.channels, 2, r.sample_rate, 0, 'NONE', '')) snd.writeframes(r.data)
def __init__(self, file_name): super(audio_decoder, self).__init__() self.file_name = file_name ext = file_name.strip().split('.')[-1].lower() dm = muxer.Demuxer(ext) fin = open(file_name, 'rb') if not fin: raise "cannot find file %s" % file_name s = fin.read(3000000) r = dm.parse(s) print dm.streams self.decoder = None for aindex in xrange( len( dm.streams )): if dm.streams[ aindex ] and dm.streams[ aindex ][ 'type' ]== muxer.CODEC_TYPE_AUDIO: self.decoder = acodec.Decoder( dm.streams[ aindex ] ) self.aindex = aindex break if not self.decoder: raise "no audio track found in given media file!" self.resampler = sound.Resampler( (dm.streams[ aindex ][ 'sample_rate' ], dm.streams[ aindex ][ 'channels' ]), (constants.AUDIO_SAMPLE_RATE , 1) ) self.ostream = data_stream(constants.AUDIO_SAMPLE_RATE, data_format = {'dtype':np.int16}) self.odtype = np.int16 self.demuxer = dm self.frames = r self.fin = fin
def play(self): self.stopFlag = True self.mp3 = [] self.i = 0 #dm = muxer.Demuxer(str.split(self.file_name, '.')[-1].lower()) dm = muxer.Demuxer('mp3') #f = open(self.file_name, 'rb') snd = dec = None header = { #'Referer': 'http://www.xiami.com/', 'User-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36', } request = urllib2.Request(self.file_name, headers=header) self.f = urllib2.urlopen(request) print 'Player Init Time:%s' % (time.time() - TIME) #s = self.f.read(32000) s = self.f.read(10000) #thread.start_new_thread(self.download,()) self.tcpFlag = True #self.TcpThread = tcpThread(self) #self.TcpThread.start() #self.downloadthread = downloadThread(self.f, self.mp3) #self.downloadthread.start() while self.stopFlag: pass print 'first read long:%s' % (len(s)) while len(s) and self.tcpFlag: frames = dm.parse(s) if frames: for fr in frames: if dec == None: dec = acodec.Decoder(dm.streams[fr[0]]) r = dec.decode(fr[1]) if r and r.data: if snd == None: snd = sound.Output(int(r.sample_rate), r.channels, sound.AFMT_S16_LE) data = r.data try: snd.play(data) except Exception, e: print e #sys.exit(0) ''' if self.i<len(self.mp3): s = self.mp3[self.i] else: s = [] self.i = self.i + 1 ''' s = self.f.read(2000)
def recodeAudio(fName, fOutput, type, bitrate=None): # ------------------------------------ import pymedia.audio.acodec as acodec import pymedia.muxer as muxer # Open demuxer dm = muxer.Demuxer(fName.split('.')[-1].lower()) f = open(fName, 'rb') s = f.read(90000) dec = enc = mx = None print 'Recoding %s into %s' % (fName, fOutput) while len(s): frames = dm.parse(s) if frames: for fr in frames: # Assume for now only audio streams if dec == None: # Open decoder dec = acodec.Decoder(dm.streams[fr[0]]) print 'Decoder params:', dm.streams[fr[0]] # Decode audio frame r = dec.decode(fr[1]) if r: if bitrate == None: bitrate = r.bitrate # Open muxer and encoder if enc == None: params = { 'id': acodec.getCodecID(type), 'bitrate': bitrate, 'sample_rate': r.sample_rate, 'channels': r.channels } print 'Encoder params:', params mx = muxer.Muxer(type) stId = mx.addStream(muxer.CODEC_TYPE_AUDIO, params) enc = acodec.Encoder(params) fw = open(fOutput, 'wb') ss = mx.start() fw.write(ss) enc_frames = enc.encode(r.data) if enc_frames: for efr in enc_frames: ss = mx.write(stId, efr) if ss: fw.write(ss) s = f.read(100000) f.close() if fw: if mx: ss = mx.end() if ss: fw.write(ss) fw.close()
def aplayer(name, card, rate, tt): import pymedia.muxer as muxer, pymedia.audio.acodec as acodec, pymedia.audio.sound as sound import time dm = muxer.Demuxer(str.split(name, '.')[-1].lower()) snds = sound.getODevices() if card not in range(len(snds)): raise 'Cannot play sound to non existent device %d out of %d' % ( card + 1, len(snds)) f = open(name, 'rb') snd = resampler = dec = None s = f.read(32000) t = 0 while len(s): frames = dm.parse(s) if frames: for fr in frames: # Assume for now only audio streams if dec == None: print dm.getInfo(), dm.streams dec = acodec.Decoder(dm.streams[fr[0]]) r = dec.decode(fr[1]) if r and r.data: if snd == None: print 'Opening sound with %d channels -> %s' % ( r.channels, snds[card]['name']) snd = sound.Output(int(r.sample_rate * rate), r.channels, sound.AFMT_S16_LE, card) if rate < 1 or rate > 1: resampler = sound.Resampler( (r.sample_rate, r.channels), (int(r.sample_rate / rate), r.channels)) print 'Sound resampling %d->%d' % ( r.sample_rate, r.sample_rate / rate) data = r.data if resampler: data = resampler.resample(data) if EMULATE: # Calc delay we should wait to emulate snd.play() d = len(data) / float(r.sample_rate * r.channels * 2) time.sleep(d) if int(t + d) != int(t): print 'playing: %d sec\r' % (t + d), t += d else: snd.play(data) if tt > 0: if snd and snd.getPosition() > tt: break s = f.read(512) while snd.isPlaying(): time.sleep(.05)
def demuxVideo( inFile ): dm= muxer.Demuxer( inFile.split( '.' )[ -1 ].lower() ) f= open( inFile, 'rb' ) s= f.read( 400000 ) r= dm.parse( s ) while len( s )> 0: print len( r ), s= f.read( 40000 ) r= dm.parse( s )
def run(self): logging.info('play started on ' + self.filename) dm = muxer.Demuxer(str.split(self.filename, '.')[-1].lower()) snds = sound.getODevices() if 0 not in range(len(snds)): print 'Cannot play sound to non existent device %d out of %d' % ( 1, len(snds)) self.endfunc() return f = open(self.filename, 'rb') snd = resampler = dec = None s = f.read(32000) t = 0 while len(s): frames = dm.parse(s) if frames: for fr in frames: # Assume for now only audio streams if dec == None: print dm.getInfo(), dm.streams dec = acodec.Decoder(dm.streams[fr[0]]) r = dec.decode(fr[1]) if r and r.data: if snd == None: print 'Opening sound with %d channels -> %s' % ( r.channels, snds[0]['name']) snd = sound.Output(int(r.sample_rate), r.channels, sound.AFMT_S16_LE, 0) data = r.data while (self.state == PAUSE): time.sleep(.05) if (self.state == STOP): self.endfunc() return snd.play(data) s = f.read(BUFFER_SIZE) count = 0 while snd.isPlaying(): count = count + 1 print "playing: ", str(count) time.sleep(.05) while (self.state == PAUSE): time.sleep(.05) if (self.state == STOP): self.endfunc() return self.endfunc()
def videoDecodeBenchmark( inFile, opt ): dm= muxer.Demuxer( inFile.split( '.' )[ -1 ] ) f= open( inFile, 'rb' ) s= f.read( 400000 ) r= dm.parse( s ) v= filter( lambda x: x[ 'type' ]== muxer.CODEC_TYPE_VIDEO, dm.streams ) if len( v )== 0: raise 'There is no video stream in a file %s' % inFile v_id= v[ 0 ][ 'index' ] print 'Assume video stream at %d index: ' % v_id a= filter( lambda x: x[ 'type' ]== muxer.CODEC_TYPE_AUDIO, dm.streams ) if len( a )== 0: print 'There is no audio stream in a file %s. Ignoring audio.' % inFile opt= 'noaudio' else: a_id= a[ 0 ][ 'index' ] t= time.time() vc= vcodec.Decoder( dm.streams[ v_id ] ) print dm.streams[ v_id ] if opt!= 'noaudio': import pymedia.audio.acodec as acodec import pymedia.audio.sound as sound ac= acodec.Decoder( dm.streams[ a_id ] ) resampler= None frames= 0 while len( s )> 0: for fr in r: if fr[ 0 ]== v_id: d= vc.decode( fr[ 1 ] ) if fr[ 3 ]> 0: print 'Video PTS', fr[ 3 ] if d and d.data: frames+= 1 #ff= open( 'c:\\test', 'wb' ) #ff.write( d.data[ 0 ] ) #ff.close() elif opt!= 'noaudio' and fr[ 0 ]== a_id: d= ac.decode( fr[ 1 ] ) if resampler== None: if d and d.channels> 2: resampler= sound.Resampler( (d.sample_rate,d.channels), (d.sample_rate,2) ) else: data= resampler.resample( d.data ) s= f.read( 400000 ) r= dm.parse( s ) tt= time.time()- t print '%d frames in %d secs( %.02f fps )' % ( frames, tt, float(frames)/tt )
def initVideo(self): dm = muxer.Demuxer(self.format) #try to get multiple streams of a multiplexed file junk = dm.parse(self.rawData[30000]) if len(dm.streams) == 0: #set bitrate if self.codec == 'mpeg1video': bitrate = 2700000 else: bitrate = 9800000 self.params= { \ 'type': 0, 'gop_size': 12, 'frame_rate_base': 125, 'max_b_frames': 0, 'width': 800, 'height': 600, 'frame_rate': 3125, 'deinterlace': 0, 'bitrate': bitrate, 'id': vcodec.getCodecID( self.codec ) } elif len(dm.streams) == 1: self.params = dm.streams[0] else: #loop through to find the first video stream in the file for vindex in xrange(len(dm.streams)): if dm.streams[vindex]['type'] == muxer.CODEC_TYPE_VIDEO: self.params = dm.streams[vindex] break print self.params try: # Set the initial sound delay to 0 for now # It defines initial offset from video in the beginning of the stream self.initADelta = -1 self.seekADelta = 0 # Setting up the HW video codec self.vc = ext_codecs.Decoder(self.params) except: self.vc = vcodec.Decoder(self.params) try: # Fall back to SW video codec self.vc = vcodec.Decoder(self.params) except: traceback.print_exc() self.err.append(sys.exc_info()[1])
def demuxer_test(name): import pymedia.muxer as muxer try: dm = muxer.Demuxer(str.split(name, '.')[-1].lower()) f = open(name, 'rb') s = f.read(300000) r = dm.parse(s) print dm.streams if dm.hasHeader(): print dm.getInfo() print 'Passed' except: traceback.print_exc() print '!!!!!!!!!!!!!!!!!!!!!Failed'
def play_by_pymedia(sound_file): file_type = str.split( sound_file, '.' )[ -1 ].lower() #1.二进制方法读取前 10000 个字节,保证能读到第一帧音频数据 f = open( sound_file, 'rb' ) data= f.read(4096) #data= f.read() #2.创建合成器对象,解析出最初的几帧音频数据 import pymedia.muxer as muxer dm = muxer.Demuxer(file_type) frames = dm.parse( data ) #print len(frames) #3.根据解析出来的 Mp3 编码信息,创建解码器对象 import pymedia.audio.acodec as acodec #dec = acodec.Decoder( dm.streams[ 0 ] ) #像下面这样也行 params = {'id': acodec.getCodecID(file_type), 'bitrate': 128000, 'sample_rate': 44100, 'ext': 'mp3', 'channels': 2} dec= acodec.Decoder(params) if len(frames) > 1: #4.解码第一帧音频数据 frame = frames[0] #音频数据在 frame 数组的第二个元素中 r= dec.decode( frame[ 1 ] ) print "sample_rate:%s , channels:%s " % (r.sample_rate,r.channels) #注意:这一步可以直接解码 r=dec.decode( data),而不用读出第一帧音频数据 #但是开始会有一下噪音,如果是网络流纯音频数据,不包含标签信息,则不会出现杂音 else: r=dec.decode(data) #5.创建音频输出对象 import pymedia.audio.sound as sound snd = sound.Output( r.sample_rate, r.channels, sound.AFMT_S16_LE ) #6.播放 if r: snd.play_all(r.data) #7.继续读取、解码、播放 while True: data = f.read(512) if len(data)>0: r = dec.decode( data ) if r: snd.play_all(r.data) else: break #8.延时,直到播放完毕 import time while snd.isPlaying(): time.sleep( .5 )
def demuxBench( inFile ): dm= muxer.Demuxer( inFile.split( '.' )[ -1 ].lower() ) f= open( inFile, 'rb' ) s= f.read( 400000 ) i= len( s ) t= 0 r= dm.parse( s ) while len( s )> 0: s= f.read( 400000 ) tt= time.time() r= dm.parse( s ) t+= time.time()- tt i+= len( s ) print 'File %s ( %d bytes ) was demuxed in %2f secs' % ( inFile, i, t )
def main(self): dm = muxer.Demuxer(self.extension) shutdown = False decoder = None while self.anyReady() or not shutdown: while self.dataReady("inbox"): data = self.recv("inbox") frames = dm.parse(data) for frame in frames: if not decoder: # first time we get data from the demuxer # we create the decoder stream_index = frame[0] decoder = acodec.Decoder(dm.streams[stream_index]) # decode our first frame decoded = decoder.decode(frame[1]) # output the format of the audio format = { 'channels': decoded.channels, 'sample_rate': decoded.sample_rate, 'format': pyMediaFormat2format[sound.AFMT_S16_LE], } self.send(format, "format") else: # otherwise we just decode a frame decoded = decoder.decode(frame[1]) self.send(str(decoded.data), "outbox") self.send(4096, "needData") while self.dataReady("control"): msg = self.recv("control") if isinstance(msg, (producerFinished, shutdownMicroprocess)): shutdown = True self.send(msg, "signal") if not shutdown: self.pause() yield 1
def aplayer( name ): import pymedia.audio.acodec as acodec import pymedia.audio.sound as sound import pymedia.muxer as muxer import time dm= muxer.Demuxer( name.split( '.' )[ -1 ].lower() ) f= open( name, 'rb' ) s= f.read( 90000 ) frames= dm.parse( s ) dec= acodec.Decoder( dm.streams[ frames[ 0 ] [ 0 ] ] ) # dec= acodec.Decoder( str.split( name, '.' )[ -1 ].lower() ) br= None snd= None f.seek(0) s= f.read( 50000 ) while len( s ): r= dec.decode( s ) if snd== None: print 'Opening sound with %d channels( %d bitrate )' % ( r.channels, r.bitrate ) snd= sound.Output( r.sample_rate, r.channels, sound.AFMT_S16_LE ) br= r.bitrate if r: snd.play( r.data ) ev= pygame.event.get() s= f.read( 512 ) for e in ev: if e.type== pygame.KEYDOWN: if e.key== pygame.K_RIGHT: # Seek forward f.seek( SEEK_SEC* br/ 8, 1 ) dec.reset() if e.key== pygame.K_LEFT: # Seek forward if f.tell()> SEEK_SEC* br/ 8: f.seek( -SEEK_SEC* br/ 8, 1 ) dec.reset() if e.key== pygame.K_ESCAPE: s= '' break while snd.isPlaying(): time.sleep( .05 )
def demuxVideo(inFile, outFile): dm = muxer.Demuxer(inFile.split('.')[-1].lower()) f = open(inFile, 'rb') fw = open(outFile, 'wb') s = f.read(400000) r = dm.parse(s) v = filter(lambda x: x['type'] == muxer.CODEC_TYPE_AUDIO, dm.streams) if len(v) == 0: raise 'There is no audio stream in a file %s' % inFile a_id = v[0]['index'] print 'Assume audio stream at %d index: ' % a_id while len(s) > 0: for fr in r: if fr[0] == a_id: fw.write(fr[1]) s = f.read(400000) r = dm.parse(s)
def playCash(self, temp): try: d = None dns = 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=ikmdb;Data Source=%s;Persist Security Info=False;Jet OLEDB:System database=%s' % (self._insiderdb, self._sysdb) sql = 'SELECT TOP 1 iif ( IsNull(SCardType), "", SCardType ) AS SCardType, iif ( IsNull(InsiderMoney), "", InsiderMoney ) AS InsiderMoney FROM [InsiderInfo] WHERE InsiderNumber = "%s"' % temp['InsiderNumber'] conn = win32com.client.Dispatch(r'ADODB.Connection') conn.Open(dns) rs = win32com.client.Dispatch('ADODB.Recordset') rs.Open(sql, conn, 1, 3) while not rs.EOF: d = { } d['InsiderMoney'] = string.atof(str(rs('InsiderMoney')).strip()) d['SCardType'] = string.atoi(str(rs('SCardType')).strip()) rs.MoveNext() rs.Close() conn.Close() if d: d['type'] = 'cash' d['level'] = config.memtype[d['SCardType']] + 'CASH' temp = d else: return None tt = [] if self.queue.qsize() == 0: tt.append(temp['level']) if int(temp['InsiderMoney']) > config.switch_money: tt.append(str(int(temp['InsiderMoney']))) suffix = '.mp3' prefix = config.src for tem in tt: f = open((prefix + tem + suffix).encode('gbk'), 'rb') data = f.read() dm = muxer.Demuxer('mp3') frames = dm.parse(data) dec = acodec.Decoder(dm.streams[0]) r = dec.decode(data) snd = sound.Output(r.sample_rate, r.channels, 32, config.cashSpeaker) snd.play(r.data) while snd.isPlaying(): time.sleep(0.1) except BaseException: config.logger.error(traceback.format_exc())
def dumpVideo(inFile, outFilePattern, fmt): dm = muxer.Demuxer(inFile.split('.')[-1]) i = 1 f = open(inFile, 'rb') s = f.read(400000) r = dm.parse(s) v = filter(lambda x: x['type'] == muxer.CODEC_TYPE_VIDEO, dm.streams) if len(v) == 0: raise 'There is no video stream in a file %s' % inFile v_id = v[0]['index'] print 'Assume video stream at %d index: ' % v_id, dm.streams[v_id] c = vcodec.Decoder(dm.streams[v_id]) print 'Decoder created' t = time.time() while len(s) > 0: for fr in r: if (i % 100) == 0: print '%d frames in %.2f secs (%.2f fps)' % (i, time.time() - t, i / (time.time() - t)) if fr[0] == v_id: d = c.decode(fr[1]) # Save file as RGB BMP or YUV if d and d.data: if fmt == 2: dd = d.convert(fmt) img = pygame.image.fromstring(dd.data, dd.size, "RGB") pygame.image.save(img, outFilePattern % i) elif fmt == 0: f = open(outFilePattern % i, 'wb') f.write(d.data[0]) f.write(d.data[1]) f.write(d.data[2]) f.close() i += 1 s = f.read(400000) r = dm.parse(s) print 'Saved %d frames' % (i - 1)
def run(self): f = open(self.addr, 'rb') data = f.read(10000) dm = muxer.Demuxer(self.codec) frames = dm.parse(data) print len(frames) dec = acodec.Decoder(dm.streams[0]) frame = frames[0] r = dec.decode(frame[1]) #音频数据在 frame 数组的第二个元素中 print "sample_rate:%s , channels:%s " % (r.sample_rate, r.channels) snd = sound.Output(r.sample_rate, r.channels, sound.AFMT_S16_LE) if r: snd.play(r.data) while True: if not self.playing: break data = f.read(512) if len(data) > 0: r = dec.decode(data) if r: snd.play(r.data) else: while snd.isPlaying(): time.sleep(.5) break
def main(self): dm = muxer.Demuxer(self.extension) shutdown = False decoder = None while self.anyReady() or not shutdown: while self.dataReady("inbox"): data = self.recv("inbox") frames = dm.parse(data) for frame in frames: if not decoder: stream_index = frame[0] decoder = acodec.Decoder(dm.streams[stream_index]) raw = decoder.decode(frame[1]) data = {} data['type'] = 'audio' data['audio'] = str(raw.data) data['channels'] = raw.channels data['sample_rate'] = raw.sample_rate data['format'] = mapping_format_from_pymedia[ sound.AFMT_S16_LE] self.send(data, "outbox") while self.dataReady("control"): msg = self.recv("control") if isinstance(msg, (producerFinished, shutdownMicroprocess)): shutdown = True self.send(msg, "signal") if not shutdown: self.pause() yield 1
def recodeVideo( inFile, outFile, outCodec ): dm= muxer.Demuxer( inFile.split( '.' )[ -1 ] ) f= open( inFile, 'rb' ) fw= open( outFile, 'wb' ) s= f.read( 400000 ) r= dm.parse( s ) v= filter( lambda x: x[ 'type' ]== muxer.CODEC_TYPE_VIDEO, dm.streams ) if len( v )== 0: raise 'There is no video stream in a file %s' % inFile v_id= v[ 0 ][ 'index' ] print 'Assume video stream at %d index: ' % v_id c= vcodec.Decoder( dm.streams[ v_id ] ) e= None while len( s )> 0: for fr in r: if fr[ 0 ]== v_id: d= c.decode( fr[ 1 ] ) if e== None and d: params= c.getParams() params[ 'id' ]= vcodec.getCodecID( outCodec ) # Just try to achive max quality( 2.7 MB/sec mpeg1 and 9.8 for mpeg2 ) if outCodec== 'mpeg1video': params[ 'bitrate' ]= 2700000 else: params[ 'bitrate' ]= 9800000 # It should be some logic to work with frame rates and such. # I'm not aware of what it would be... print 'Setting codec to ', params e= vcodec.Encoder( params ) if e and d: dw= e.encode( d ) #print 'Frame size ', len( dw ) fw.write( dw ) s= f.read( 400000 ) r= dm.parse( s )