私は、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
すべてのwavファイルのヘッダー(最初の44バイト)にbit_depthがあります...すべてのwavライブラリはヘッダーを解析する必要があります...このヘッダーを実行するのはかなり簡単です –
チュートリアルを使用して、既にヘッダーを解析することはできましたが、ビット深度は必ずしも明確ではありませんでした。 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であることを示す赤いフラグ - ファイルが壊れているかライブラリが間違っています... wavファイルが圧縮されていても(私はwavファイルで圧縮を見たことがない)圧縮されています...ここでは簡潔なwav仕様のサマリーですhttp://soundfile.sapp.org/doc/WaveFormat/ ...ヘッダフィールドとデータセクションの両方のエンディアンに特に注意を払って独自のヘッダーパーサーを書く場合...コードの2ページに独自のwavパーサーを書くことができます –