生の ADPCM 圧縮オーディオ ストリームがいくつかあり、それらを pygame で再生したいのですが、私の知る限り、これは pygame では不可能です。Python でそれらを通常の PCM ストリーム (または pygame で再生できるもの) に解凍し、pygame で再生するにはどうすればよいですか?
ADPCM を線形ストリームに変換するものがあるため、すでに audioop モジュールを試しましたが、線形ストリームとは何か、それらを変換する関数の使用方法もわかりません。
ADPCM を線形ストリームに変換するものがあるため、すでに audioop モジュールを試しましたが、線形ストリームとは何か、それらを変換する関数の使用方法もわかりません。
短いバージョン: "線形" が必要です。* つまり、必要な機能はadpcm2lin
.
どうやって使うんですか?
のほとんどすべてがaudioop
同じように機能します。フレームをループし、各フレームで関数を呼び出します。(外部ライブラリを使用して) MP3 ファイルから読み取るときのように、入力データに固有のフレーム サイズがある場合、または出力ライブラリが特定のフレーム サイズを要求する場合、フレームの決定方法に少し制約があります。しかし、生の PCM 形式を扱っている場合、フレームは 1 つのサンプルからファイル全体まで、任意のサイズになります。**
簡単にするために、最初にファイル全体を実行しましょう。
with open('spam.adpcm', 'rb') as f:
adpcm = f.read()
pcm, _ = audioop.adpcm2lin(adpcm, 2, None)
ファイルadpcm
が大きすぎてメモリに読み込んで一度に処理できない場合は、次のように を追跡する必要がありますstate
。
with open('spam.adpcm', 'rb') as f:
state = None
while True:
adpcm = f.read(BLOCKSIZE)
if not adpcm:
return
pcm, state = audioop.adpcm2lin(adpcm, 2, state)
yield pcm
もちろん、サンプルレートを変換したり、他に何もする必要はないと仮定しています。その場合、そのような変換は ADPCM 解凍後に行われます。***
* 長いバージョン: 「線形」は、サンプルが別のアルゴリズムによってマッピングされるのではなく、直接エンコードされることを意味します。たとえば、16 ビットの A-to-D があり、オーディオを 8 ビットのリニア PCM ファイルに保存すると、各サンプルの上位 8 ビットだけが保存されます。これにより、非常にダイナミックな範囲が得られるため、静かな音はノイズの中で失われます。同じビット数ではるかに広いダイナミックレンジを提供するさまざまな圧伸アルゴリズムがあります (もちろん、他の場所で他の情報を失うという犠牲を払って)。それらがどのように機能するかの詳細については、μ-law アルゴリズムを参照してください。ただし、16 ビットにとどまることができる場合は、線形で問題ありません。
** 実際には、4 ビットの raw ADPCM では、1 つのサンプルを実行することはできませんが、2 つのサンプルを実行することはできます。これは十分に近いです。
*** 本当にうるさいなら、最初に 32 ビットに変換してから作業を行い、それから 16 ビットに戻して損失が蓄積しないようにすることをお勧めします。しかし、4 ビットの ADPCM から始める場合、ここでオーディオファンのサウンドを求めることはありません。