From 4f6036df206d9307c86287e29d8d625c67c99034 Mon Sep 17 00:00:00 2001 From: James Sinton Date: Fri, 21 Oct 2016 22:37:56 -0500 Subject: [PATCH 1/3] Use compressed audio in ffdec --- audioread/__init__.py | 50 +++++++++++++++++----------------- audioread/__init__.pyc | Bin 0 -> 2425 bytes audioread/ffdec.py | 60 ++++++++++++++++++++++++++++++++--------- audioread/ffdec.pyc | Bin 0 -> 8901 bytes audioread/gstdec.pyc | Bin 0 -> 12694 bytes audioread/rawread.pyc | Bin 0 -> 4114 bytes decode.py | 4 ++- 7 files changed, 76 insertions(+), 38 deletions(-) create mode 100644 audioread/__init__.pyc create mode 100644 audioread/ffdec.pyc create mode 100644 audioread/gstdec.pyc create mode 100644 audioread/rawread.pyc mode change 100644 => 100755 decode.py diff --git a/audioread/__init__.py b/audioread/__init__.py index eecce32..325438d 100644 --- a/audioread/__init__.py +++ b/audioread/__init__.py @@ -68,45 +68,45 @@ def _mad_available(): return True -def audio_open(path): +def audio_open(path=None, audio=None): """Open an audio file using a library that is available on this system. """ # Standard-library WAV and AIFF readers. - from . import rawread - try: - return rawread.RawAudioFile(path) - except DecodeError: - pass + #from . import rawread + #try: + # return rawread.RawAudioFile(path) + #except DecodeError: + # pass # Core Audio. - if _ca_available(): - from . import macca - try: - return macca.ExtAudioFile(path) - except DecodeError: - pass + #if _ca_available(): + # from . import macca + # try: + # return macca.ExtAudioFile(path) + # except DecodeError: + # pass # GStreamer. - if _gst_available(): - from . import gstdec - try: - return gstdec.GstAudioFile(path) - except DecodeError: - pass + #if _gst_available(): + # from . import gstdec + # try: + # return gstdec.GstAudioFile(path) + # except DecodeError: + # pass # MAD. - if _mad_available(): - from . import maddec - try: - return maddec.MadAudioFile(path) - except DecodeError: - pass + #if _mad_available(): + # from . import maddec + # try: + # return maddec.MadAudioFile(path) + # except DecodeError: + # pass # FFmpeg. from . import ffdec try: - return ffdec.FFmpegAudioFile(path) + return ffdec.FFmpegAudioFile(path,audio) except DecodeError: pass diff --git a/audioread/__init__.pyc b/audioread/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a007a341416cf3ece9c57f8f0f3ed378c66e8e6 GIT binary patch literal 2425 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 literal 0 HcmV?d00001 diff --git a/audioread/rawread.pyc b/audioread/rawread.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d81ab236f152ff1cf3427e4e9ccc1a96ee322b7f GIT binary patch literal 4114 zcmb_fU2hxL5uM$oNRgI5;^w0+TxZi7DUI4xQxxe#jG&4fCjnByT`5sQq*yI?FU6(E zU1sm4X$E!+)O{=p^bhoZ~ zIsOUo|L^eFe?Vj+eMnC-UnZXPq13uBeSf6~(hpX8L;8)Cz9#)O$*|OrNmHgR>9@qo zFuN{UQ%p;Su+@^kiaZzjvfq|$or8WyvbLB@y4*Qg-k=Y=-Ai=s1BlP8v7vQIktJ1j zZ;}tHq*{j4GMi7Z;L5NvNfvH>^6=qZmG`#qhS(hLZ+#vPbL{Em|HIEt?!j1>!qN5v zla`tJu&T-`_c?hD;L1n`V#G`N&5@TKg8F<+=hk8 z-N;n%LLCZ=68echy)Gl~)*<4!NTw!^T}KD?nJ{eWFe}qI?n0Gsh3#RuIVz`SbBtH* zCgQP~%(J{?6i#VXvfxZ_wv6cePw-eCv+1QAuTjObjmQ2S!ihXZel+i|BLPRg*qh=! z`HLrqBF{W|@|8G1!9TP0c_0t|_<=n0`Sw#t17*#}<6Ely)%w@csbzaVxO$qZQ@na~tjo)m?#HY|raGgvxfU0xi9 z_HMWs<>@G#&aDdvhM`ZYDp__y{9wBsA*nX(zVq(ALGD7E9~LGH^TL@!Q`tMcaBqaf z;oqz(2gzWv3;`S)n&B`{b5l6A<3=#cw@2lClHoHwomTkd@U@Qc{gDRx{SiWn)G^Np zg~$YEh@LHLP37{kP=q;VqDqQGY+I8vk)W}$-%AxSN1(2qz zymN4nX@XiT3tX5ykd4t8zW-?T$^Ft))ix*8C=SA+~_*eAxE`)g3 z{lL57UGrb{+g{^XzXt95qm%`{dK5yeJ%T`SfOsk*fDzyZ1Ju*5p2m{(w_vy-s;VOss_1+Ek4iXx(;zV^u`pc3U#Xar zmCbQZT&4;1<0Rz*Ka_Xr51*8aINlkgp=WtACFxdwTFnQ?{Rg@i^eXl@@~BWw0M%lQ z-Ucj-j)%*LQcJ4Gt2fsfJrv$iz)1)GM6ZKJClFYG{<-({b@VuFYySGtCBH1#$d zOv>~~+nPt)zYnv-A*3bBm9Sy!qvcw2Q@Lhb{+aPbp1DzU6HD4o@(!zGuI;3z zt(>Vo$%|j((W`oIEBffey?FnV2YVk!Kjq83C6TbSoX*^GW}+WqteI6pa0I;i8`m(i zIIKuH$zpXtz2pfl#2jjqCx~fkh!0p+l=xS{kJr&|G=kT>TmID-5DN2+?9}+(sl6cM zT%69-sW`^HWU4q`z-A3NFJ0k`-`VCo`yxU_|Kjn`k*(Ze@kO^O-h?<6R$|#aNn?gw zlf=Q}WTG9QE(|UfQGNi4fL9mz0M0lNO+xizw%sT_%2pnX7%D;)L{OZ4ly?3 zbqTOY9v2>Uc0Kl8?Us3_FC<+`pJtq`Y}aF!77hf9ud1g-h>jpL!rTBVQG5H!PulO gqWz2es}Z_i|0(%CJE7WdZ{y_mn%@jwZ?v!cAClr*ng9R* literal 0 HcmV?d00001 diff --git a/decode.py b/decode.py old mode 100644 new mode 100755 index 40d369a..b20c115 --- a/decode.py +++ b/decode.py @@ -1,3 +1,5 @@ +#!/usr/bin/python + # This file is part of audioread. # Copyright 2011, Adrian Sampson. # @@ -28,7 +30,7 @@ def decode(filename): sys.exit(1) try: - with audioread.audio_open(filename) as f: + with audioread.audio_open(audio=open(filename,"r")) as f: print('Input file: %i channels at %i Hz; %.1f seconds.' % (f.channels, f.samplerate, f.duration), file=sys.stderr) From 045e26223e2d06c99f37d888f827bd7c89213325 Mon Sep 17 00:00:00 2001 From: James Sinton Date: Sat, 22 Oct 2016 12:20:21 -0500 Subject: [PATCH 2/3] Updates to handling compressed audio in ffdec --- audioread/ffdec.py | 39 +++++++++++++++++++++------------------ audioread/ffdec.pyc | Bin 8901 -> 8980 bytes 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/audioread/ffdec.py b/audioread/ffdec.py index 0dfdf3e..a9c322d 100644 --- a/audioread/ffdec.py +++ b/audioread/ffdec.py @@ -104,8 +104,9 @@ def popen_multiple(commands, command_args, *args, **kwargs): class FFmpegAudioFile(object): """An audio file decoded by the ffmpeg command-line utility.""" def __init__(self, filename=None, audio=None, block_size=4096): - self.filename=filename - self.audio = audio + self.openFile = True if filename is not None else False + self.readAudio = True if audio is not None else False + # On Windows, we need to disable the subprocess's crash dialog # in case it dies. Passing SEM_NOGPFAULTERRORBOX to SetErrorMode # disables this behavior. @@ -121,9 +122,9 @@ def __init__(self, filename=None, audio=None, block_size=4096): ctypes.windll.kernel32.SetErrorMode( previous_error_mode | SEM_NOGPFAULTERRORBOX ) - + try: - if filename is not None: + if self.openFile: self.devnull = open(os.devnull) self.proc = popen_multiple( COMMANDS, @@ -132,7 +133,7 @@ def __init__(self, filename=None, audio=None, block_size=4096): stderr=subprocess.PIPE, stdin=self.devnull, ) - elif audio is not None: + elif self.readAudio: self.devnull = open(os.devnull) self.proc = popen_multiple( COMMANDS, @@ -160,18 +161,17 @@ def __init__(self, filename=None, audio=None, block_size=4096): # Start another thread to consume the standard output of the # process, which contains raw audio data. - if filename is not None: + if self.openFile: self.stdout_reader = QueueReaderThread(self.proc.stdout, block_size) - elif audio is not None: + self.stdout_reader.start() + elif self.readAudio: o, e = self.proc.communicate(input=audio.read()) print e self.output = StringIO(o) self.error = StringIO(e) - self.stdout_reader = QueueReaderThread(self.output, block_size) else: raise NoInputError() - self.stdout_reader.start() # Read relevant information from stderr. self._get_info() @@ -179,13 +179,9 @@ def __init__(self, filename=None, audio=None, block_size=4096): # Start a separate thread to read the rest of the data from # stderr. This (a) avoids filling up the OS buffer and (b) # collects the error output for diagnosis. - if filename is not None: + if self.openFile: self.stderr_reader = QueueReaderThread(self.proc.stderr) - elif audio is not None: - self.stderr_reader = QueueReaderThread(self.error, block_size) - else: - raise NoInputError() - self.stderr_reader.start() + self.stderr_reader.start() def read_data(self, timeout=10.0): """Read blocks of raw PCM data from the file.""" @@ -196,7 +192,12 @@ def read_data(self, timeout=10.0): # Wait for data to be available or a timeout. data = None try: - data = self.stdout_reader.queue.get(timeout=timeout) + if self.openFile: + data = self.stdout_reader.queue.get(timeout=timeout) + elif self.readAudio: + data = self.output.read() + else: + raise NoInputError() if data: yield data else: @@ -223,10 +224,12 @@ def _get_info(self): """ out_parts = [] while True: - if self.filename is not None: + if self.openFile: line = self.proc.stderr.readline() - else: + elif self.readAudio: line = self.error.readline() + else: + raise NoInputError() if not line: # EOF and data not found. diff --git a/audioread/ffdec.pyc b/audioread/ffdec.pyc index fefd1c6e39424a46b55e665571b22e04ad6375e7..2ce0c4bac807c2c22ccd9a62b04678f63c63c357 100644 GIT binary patch delta 1675 zcmah}OKcle6g_Y3u`{;wv*S2U+$3(2QdMnL5fr2#L@1)9EUL=1N%#aSWSlgUWZH}e z(G(j)g1Ug^>jtR{5L;BK$^z64uwadZ#HNS^g-ED~RRt0&IQQA^X90NRtM}f0_jm5O z@0;hZor*{9btZ0KPu`4gb~PFnP*ZS$bq7Hjp@JVlXrTs_BdA$z)v-raQG_93Dje#(I5#g1+Nn|n`RBvZa!d`@FxQxvj7%K)hj#Vx?5N6=@!FAe;gz-aLDR{VtnEsd|xSePd`0^Aqs z%GkeS6_=8g+!c892Hph%w9vxlt_lZDeOY)zs6|+%L8xF33-AsY6aQtiXSiugEVB)G z!*G+*XKzHV>_WZ9wsoNHpyuF(*>DuKjyB*$$d=u0;(rkSLxqaNF%zbh)Z5mBq{iDe z6DEU+Rz^|jvL5ZN961D_logQ{ae#uQ0v9h;{8MWimC)fPs4Th9>g&Dl>xp#Tv3XJr zmx54#l0Kn-NFUD`ixuAXmo_UTD6sUVyLM4$GM^^i;0|g?4cYpuOkb~~(kj9)s~mo5 z%hCIpk%prNR1fz>WvgyEjV5e|cUHw17@t|@yg(ewf0_U4?-U_R7wk~CaQU`OO7N?& zvL3RUD0A(X84dBswCT5Z9y<`x=BI=M=efc7Cgy z%%ZoXA=fVua^25_GZ8^`U&zJo4lvldjo^EPDR3}3fNlg{mkGz2q8H9%-i$K4%V1kS zi75+Wl&yVzug_CG`t@v1P3o;|wy*RA>n_cT$cso(=&RXDbxz;PZWeBFTRlvHXi7O& zj7U2Kzlroy{f{*cDS)Wf6)xu`>!7HFHbm~2$%!d4zi1287D6mw)@b>T+*c7Gjz<$9 z3)L0jP4i7+6{HuLLjVLs3&975>PhJD`ZI-;m=TF)uBp3?O~l1)ho}Cm)={+^{Xe(6O%KCGn7rHPs-{!5ho}N zgN5cBYksAP@oCYe^o@Z{^@=X!-GLu@P(4b4XpD#oKMk&X*YbZ_D$pMm2Gv{oM(i2; z0`L62ceij!*?j46M3;wWR6~C}d`>;C{}`T9i(H@XlsPMx*TPCrE>G#5ksURy?a^u8 zoEd#bJ*~eSJvzR~JEa#zh|`j|E4?e?JrO%1uIldMoP9Pm<{Z>s@p#_`56#$y7o?&! Sf3-BHKPyhD^ZMuFoqqtS_BU_< delta 1663 zcmZ`(O>7%g5dLP@yUsdxoH%yu{4|N1NG-oX4F%B)6;LP~5ZXpbq##0sosdnkYBpP` zEq0BPUJ-)Fi7P@vsH#+jNFW44NQg5xgmQuloH$fMLU7=lb(|&zVtX<(Z{GZTZ)QGt z{<{ll`))2XwV%0@-soxFvVex50W6ZS5=IbP2y6r?)C4<%W(tiIqAQ3U1TJ;}saa?` zsM)9i>uEGyG+YE-2s{KCG@RsG`nZy!gJ)sa3g+oZiC9Gu-EeQYOfrFD!Fh9qDiq(g5ed7P&No$Fswu)%El|VXA zROavD@vX#_q^5oZgJ{^;X}``8!p$R8UNTlK++dfS1#$|veV(?i3<3m4-P zXmoXu9fgWsM{JGZAlB&dKu5~fC_@OwlT=lxwzI4l~GTVJO9lu1@xP_*9r!eKIek)#zV)JET zD&tR6^dDCP>Hnw|kb!vOr3&IohQDm8Bw6XPZP@%@5SyQpT1dgVPquSbPWoJz7Fj7< z`BYYh$yLRXJU6003keL14Pd$ofY=kD|4H9c411#Q5*3yXd@mv=D^t4+S5*C zM^xx!%|Y}r&cnHUv^~s%O2mnqgR<9qipUOuM|Act(m8ktZvl( z0+|GQ|AKM@s<%m2>ap1?O^a`SD{U0Nrec%5q+Xdh|7jxC=#A-or9xq5OX;tTR`>PXYDKd`bcbBQ>-d^$lcAxU>?`})r+d5k3K@~FO4TVD<9{zda=Wkcr8%3!Uy z&(p2bBuKgJ&%BhZ{O&JBny;Z%;`KWF0RJ)XmN3xXWR0mnHfJv>vzX*$T`zfeRy(#HvUUW)UmHF x{ToVJO5Rp-)4W!lb!M`o-njXq`e;#yjNp^JsdcP|EB=i6tNMgoGG|Wy{0}Z8Dk1;? From efbbb3795d87c401624883eb4d827d69544418c3 Mon Sep 17 00:00:00 2001 From: James Sinton Date: Tue, 25 Oct 2016 21:26:31 -0500 Subject: [PATCH 3/3] Use compressed audio in ffdec --- audioread/ffdec.py | 55 ++++++++++++++++++++++---------------------- audioread/ffdec.pyc | Bin 8980 -> 9401 bytes 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/audioread/ffdec.py b/audioread/ffdec.py index a9c322d..837ef9f 100644 --- a/audioread/ffdec.py +++ b/audioread/ffdec.py @@ -58,7 +58,7 @@ class NoInputError(FFmpegError): class QueueReaderThread(threading.Thread): """A thread that consumes data from a filehandle and sends the data over a Queue. - """ + """ def __init__(self, fh, blocksize=1024, discard=False): super(QueueReaderThread, self).__init__() self.fh = fh @@ -70,12 +70,25 @@ def __init__(self, fh, blocksize=1024, discard=False): def run(self): while True: data = self.fh.read(self.blocksize) + #print data if not self.discard: self.queue.put(data) if not data: # Stream closed (EOF). break +class WriterThread(threading.Thread): + """A thread that writes data to a filehandle + """ + def __init__(self, fh, audio=None): + super(WriterThread, self).__init__() + self.fh = fh + self.audio = audio + self.daemon = True + + def run(self): + self.fh.write(self.audio.read()) + self.fh.close() def popen_multiple(commands, command_args, *args, **kwargs): """Like `subprocess.Popen`, but can try multiple commands in case @@ -159,29 +172,24 @@ def __init__(self, filename=None, audio=None, block_size=4096): finally: windows_error_mode_lock.release() + # Start a thread to write the compressed audio to Popen.stdin + if self.readAudio: + self.stdin_writer = WriterThread(self.proc.stdin,audio) + self.stdin_writer.start() + # Start another thread to consume the standard output of the # process, which contains raw audio data. - if self.openFile: - self.stdout_reader = QueueReaderThread(self.proc.stdout, block_size) - self.stdout_reader.start() - elif self.readAudio: - o, e = self.proc.communicate(input=audio.read()) - print e - self.output = StringIO(o) - self.error = StringIO(e) - else: - raise NoInputError() - - + self.stdout_reader = QueueReaderThread(self.proc.stdout, block_size) + self.stdout_reader.start() + # Read relevant information from stderr. self._get_info() # Start a separate thread to read the rest of the data from # stderr. This (a) avoids filling up the OS buffer and (b) # collects the error output for diagnosis. - if self.openFile: - self.stderr_reader = QueueReaderThread(self.proc.stderr) - self.stderr_reader.start() + self.stderr_reader = QueueReaderThread(self.proc.stderr) + self.stderr_reader.start() def read_data(self, timeout=10.0): """Read blocks of raw PCM data from the file.""" @@ -192,12 +200,8 @@ def read_data(self, timeout=10.0): # Wait for data to be available or a timeout. data = None try: - if self.openFile: - data = self.stdout_reader.queue.get(timeout=timeout) - elif self.readAudio: - data = self.output.read() - else: - raise NoInputError() + data = self.stdout_reader.queue.get(timeout=timeout) + if data: yield data else: @@ -224,12 +228,7 @@ def _get_info(self): """ out_parts = [] while True: - if self.openFile: - line = self.proc.stderr.readline() - elif self.readAudio: - line = self.error.readline() - else: - raise NoInputError() + line = self.proc.stderr.readline() if not line: # EOF and data not found. diff --git a/audioread/ffdec.pyc b/audioread/ffdec.pyc index 2ce0c4bac807c2c22ccd9a62b04678f63c63c357..6a002ca1e387c549eca7ec324c0a082d0731aa0d 100644 GIT binary patch delta 1902 zcmYjST}&KR6h3!mc3_rWim(g2><`0_&9rDMRT`_9{y?#`6v+iG(CBpC8DIz4g_&7f z6X+(TiRqKp>${1uFUF8GNTM+sV@ynZ($~J3#)tZ1j7g)3F`jd`TgvYJ_S|#NJ@-53 zo_qLc{HuwK`d2*KooJgY!lS;E_8#F1~(&3yC0io!BJqw%IQM1!D&7z8X8e^2491}k_4V}Z&W-NyDDXR&Qw-V$D z4iK~`=0c8qUnoU`{$o1yL zQ1omE1vX8KI)bj~ET-??ivFgsH$^4>cPr60a7dOXcdM=6v6=?{?=0+=Jd@yMU{ir@ zg{F2^Dzo6_B-t|Z$T#eIU=u^C+nG{nHtZDkdct2?<-06wwvr<_1D@9I4$DbyMk^x<>@2dmMQgRCWElxhdho;{CP4W35_b%(Dui%d|f}JG}%jTXqU>175>5#R<7^c zRO7C15ldMlk}s8Hxv=KSYZI*Fc=i?AM&-2byYG}L)xgHh72jT~IIg&>k3^}UuHp#h z#GQ`GxN5KzYtvFJu0|uGIgzVPqZAE@~%Eq2BlHQ>fVosM9mM|sqVI^_K&l7Z#UPZtR zi@oGP+a$`Cd;;>#aq%Fzmi!)-fr$WGj2T$XDoZIM=sZ|^h`J?A2!m@6C_nz6k{ScA z@zjtDMiLw+4wx2XiZrQ$Bcu;?s$GA9WKV{O@u3EHp$#dUsem!!dfGADs9e#(e-FYa z3}e~WJ#HA_=#90HA#9-yln~T6HS}N8t#~o9)s;!aNQrx8ABclvfY-YFc~>VpNR4I6 zl3ht=YaHkG!lN>yid!v}UGZR)jL0|=n$*o)eC@24LsY+c;TcC#w= ztjHp+{U=W3?xo1#l&o3#R+bAvAq;&!E(Y_5^-)~pz2cAjIi2^Sd`Rr%Pcc%=vLW$H zPgY#%>1LO4J`pEAwoTpMwuf=;20I~U&6m*nee*gS5v{$?3|uCE#E=sK>5^}ebe*6^ zuq}>gV{aWrv5F%|Am~hI?H6J_M$Q;Cnhgy~nFFNm?)i4+%$%7s z-^{%qO}_hd+V@vOc>le~jRG8f{PaIctFm!B{XQmde{y&DEr9uUaCC4JuuF0hY*JIO zgkUFtth9M^J`J`8v$<6L1N_{NbFvhiuYVbw(-37Qyi*@*IM8rL=3@UehAF&3Yn;>6 z>cb~K#TFlUzoJM%6~K*yn}(`SVoRcSQ|;*Bjc7-vF0dm|)xhoMyt{xeYOo!GZ3C(X zJToDBpc;Z*9t&q3Z|=A+Sn4ge)&bqSEmO^7a=b0xhq#LOkbQeyLm?^n3D>V+iD!HBJ!RP5t0h!_4Tb%v5*&znPewgAOZyCEkQX|cE|I|o?t$$ zWk*=W(o)$x!+spLB5bl-o|C8l920LQ*v27?!11{;6Mfpd3s$DlQfiW~NgMMtnX3fyUegox1TW9Te4o`flso2)w);>@W z?-#Ij*!IDzFDN>R?XjcIx_)p2U{gPkyGcH!tTF|`TTns>TxuckaqeH3W$qsZ5scTd zgfKI=*#x?9C|U$o!{Gf4i1_d(I(t?Qph|)U2}-u=2k$!&QJ!130c;<*jVfOg@SXfT z0f#?Iw)qpEqyFt>f*EIcl;ILX8-efzyByUda)F9z{b7ppV#2(;}`>E++bG{nVdj;soJVlFRfm zYK)2MAyov`L~Gs(3{%BAS6zef85a;j$(Yw|(&M1yj)EZbSLth2J5>5vb4QnqOrr>`%kv9kgnNx2SIxf1gn1HYooH3Ib-5i87Lv9xSn z=l%2YPTwODX5Qpif_Xvi_nqw?U~eA&sd8b}e1bLgURrdWf-nc=nd~(jmV4PD-H1nh F{{h4_J$C>A