2017-09-13 15 views
1

私は、wavファイルのビット深度を決定するために、高速、好ましくは標準ライブラリ機構を探しています。 '16ビット 'または'24ビット'wavファイルのビット深度を決定する

Soxのサブプロセス呼び出しを使用して、多数のオーディオメタデータを取得していますが、サブプロセス呼び出しが非常に遅く、Soxから信頼できるだけの情報しか得ることができません。

組み込みのwaveモジュールには "getbitdepth()"のような機能はなく、24bit wavファイルとの互換性もありません - waveモジュールを使用してファイルメタデータにアクセスするために 'try except'代わりにsoxを呼び出すことを除いて(soxが正確にビット深度を記録するために解析を実行する)以外はオンにします。私の心配は、このアプローチが推測の仕事のように感じるということです。 8ビットファイルを読み込むとどうなりますか?私は16ビットを手動で割り当てていません。

SciPy.io.wavefileも24ビットオーディオと互換性がないので、同様の問題が発生します。

このtutorialは本当に興味深いもので、wavファイルのヘッダーから情報を抽出するためのスクリプト例がいくつか含まれています(残念ながら、これらのスクリプトは16ビットオーディオでは機能しません)。

私は確認しているwavファイルのビット深度を判断する方法はありますか?

次のように私が使用している波ヘッダーパーサスクリプトは次のとおりです。

import struct 
import os 

def print_wave_header(f): 
    ''' 
    Function takes an audio file path as a parameter and 
    returns a dictionary of metadata parsed from the header 
    ''' 
    r = {} #the results of the header parse 
    r['path'] = f 
    fin = open(f,"rb") # Read wav file, "r flag" - read, "b flag" - binary 
    ChunkID=fin.read(4) # First four bytes are ChunkID which must be "RIFF" in ASCII 
    r["ChunkID"]=ChunkID 
    ChunkSizeString=fin.read(4) # Total Size of File in Bytes - 8 Bytes 
    ChunkSize=struct.unpack('I',ChunkSizeString) # 'I' Format is to to treat the 4 bytes as unsigned 32-bit inter 
    TotalSize=ChunkSize[0]+8 # The subscript is used because struct unpack returns everything as tuple 
    r["TotalSize"]=TotalSize 
    DataSize=TotalSize-44 # This is the number of bytes of data 
    r["DataSize"]=DataSize 
    Format=fin.read(4) # "WAVE" in ASCII 
    r["Format"]=Format 
    SubChunk1ID=fin.read(4) # "fmt " in ASCII 
    r["SubChunk1ID"]=SubChunk1ID 
    SubChunk1SizeString=fin.read(4) # Should be 16 (PCM, Pulse Code Modulation) 
    SubChunk1Size=struct.unpack("I",SubChunk1SizeString) # 'I' format to treat as unsigned 32-bit integer 
    r["SubChunk1Size"]=SubChunk1Size 
    AudioFormatString=fin.read(2) # Should be 1 (PCM) 
    AudioFormat=struct.unpack("H",AudioFormatString) ## 'H' format to treat as unsigned 16-bit integer 
    r["AudioFormat"]=AudioFormat[0] 
    NumChannelsString=fin.read(2) # Should be 1 for mono, 2 for stereo 
    NumChannels=struct.unpack("H",NumChannelsString) # 'H' unsigned 16-bit integer 
    r["NumChannels"]=NumChannels[0] 
    SampleRateString=fin.read(4) # Should be 44100 (CD sampling rate) 
    SampleRate=struct.unpack("I",SampleRateString) 
    r["SampleRate"]=SampleRate[0] 
    ByteRateString=fin.read(4) # 44100*NumChan*2 (88200 - Mono, 176400 - Stereo) 
    ByteRate=struct.unpack("I",ByteRateString) # 'I' unsigned 32 bit integer 
    r["ByteRate"]=ByteRate[0] 
    BlockAlignString=fin.read(2) # NumChan*2 (2 - Mono, 4 - Stereo) 
    BlockAlign=struct.unpack("H",BlockAlignString) # 'H' unsigned 16-bit integer 
    r["BlockAlign"]=BlockAlign[0] 
    BitsPerSampleString=fin.read(2) # 16 (CD has 16-bits per sample for each channel) 
    BitsPerSample=struct.unpack("H",BitsPerSampleString) # 'H' unsigned 16-bit integer 
    r["BitsPerSample"]=BitsPerSample[0] 
    SubChunk2ID=fin.read(4) # "data" in ASCII 
    r["SubChunk2ID"]=SubChunk2ID 
    SubChunk2SizeString=fin.read(4) # Number of Data Bytes, Same as DataSize 
    SubChunk2Size=struct.unpack("I",SubChunk2SizeString) 
    r["SubChunk2Size"]=SubChunk2Size[0] 
    S1String=fin.read(2) # Read first data, number between -32768 and 32767 
    S1=struct.unpack("h",S1String) 
    r["S1"]=S1[0] 
    S2String=fin.read(2) # Read second data, number between -32768 and 32767 
    S2=struct.unpack("h",S2String) 
    r["S2"]=S2[0] 
    S3String=fin.read(2) # Read second data, number between -32768 and 32767 
    S3=struct.unpack("h",S3String) 
    r["S3"]=S3[0] 
    S4String=fin.read(2) # Read second data, number between -32768 and 32767 
    S4=struct.unpack("h",S4String) 
    r["S4"]=S4[0] 
    S5String=fin.read(2) # Read second data, number between -32768 and 32767 
    S5=struct.unpack("h",S5String) 
    r["S5"]=S5[0] 
    fin.close() 
    return r 
+0

すべてのwavファイルのヘッダー(最初の44バイト)にbit_depthがあります...すべてのwavライブラリはヘッダーを解析する必要があります...このヘッダーを実行するのはかなり簡単です –

+0

チュートリアルを使用して、既にヘッダーを解析することはできましたが、ビット深度は必ずしも明確ではありませんでした。 ChunkID = b'RIFF ' TotalSize = 602914 データサイズ= 602870 形式= b'WAVE' SubChunk1ID = b'JUNK」 SubChunk1Size = 92 のAudioFormat = 0 NUMCHANNELS = 0 のSampleRate = 0 ByteRate = 0 BlockAlign = 0 は、bitsPerSample = 0 SubChunk2ID = B '\ X00 \ X00 \ X00 \ X00' SubChunk2Size = 0 S1 = 0 S2 = 0 S3 = 0 S4 = 0 S5 = 0 に応じファイル 圧縮はヘッダが読み込み可能であるかどうかはわかりませんが、変換処理を行わずにファイルフォーマット/圧縮に関係なく読み込めます。 – user3535074

+0

そのすべてのヘッダー設定が0であることを示す赤いフラグ - ファイルが壊れているかライブラリが間違っています... wavファイルが圧縮されていても(私はwavファイルで圧縮を見たことがない)圧縮されています...ここでは簡潔なwav仕様のサマリーですhttp://soundfile.sapp.org/doc/WaveFormat/ ...ヘッダフィールドとデータセクションの両方のエンディアンに特に注意を払って独自のヘッダーパーサーを書く場合...コードの2ページに独自のwavパーサーを書くことができます –

答えて

1

私は非常に(私はそれの大部分を書いたので、私は非常にバイアスだけど、あなたを気)soundfileモジュールをお勧めします。

soundfile.SoundFileオブジェクトとしてファイルを開くことができます。このオブジェクトには、探している情報を保持するsubtype属性が含まれています。

おそらく'PCM_16'または'PCM_24'になります。

+0

私はこれを試してみます。サウンドファイルオブジェクトを非同期でインスタンス化できるかどうか知っていますか? – user3535074

+0

「非同期」の意味を明確にすることはできますか?もしあなたが何らかの関数(コンストラクタについて話していると思います)が ''待てます ''ことができたら、いいえ。それをサポートするサウンドファイルモジュールはありますか? – Matthias

+0

あなたは正しく理解しています。サウンドファイルが十分に速いと、私は非同期で作業しようとする可能性があるので、私は待っている利用可能なオーディオモジュールを認識していません。 – user3535074

関連する問題