2016-11-17 5 views
1

現在、私はPythonだけを使ってwaveファイルに関するいくつかの小さな研究を行っています。 私が今解決できない1つの問題は、wavデータを分割することです。 24ビットの音の深さで正しくフォーマットすることができます。splititng純粋なpythonの間隔で24ビット深さのWAVサウンド

したがって、基本的な考えはt1 - startとt2 -endを指定しており、私はsliceを取得する必要がありますが、これはかなり明確です。

def split_in_interval(self, start, end): 
    start *= ONE_SEC_MS 
    end *= ONE_SEC_MS 
    header = self.wav_header.header_description 
    infile = open(self.file_name, 'rb') 

    rate = header['sample_rate'] 
    frames_per_m_sec = rate // 1000 
    length = (end - start) * frames_per_m_sec 
    start_ms = start * frames_per_m_sec 

    name_str = self._naming_fragment(start, end) 
    out_file = open(name_str, 'wb') 

    # as the size changes - need to recalculate only last part of header, 
    # it takes 4 last bytes of header 
    out_file.write(infile.read(WAV_HEADER - 4)) 

    size = length * header['block_align'] 
    # header['num_channels'] * width 
    packed_size = struct.pack('<L', size) 
    out_file.write(packed_size) 

    anchor = infile.tell() 
    infile.seek(anchor + start_ms) 

    out_file.write(infile.read(size)) 
    out_file.close() 
    infile.close() 

私のコードはかなり単純ですが、16ビットと8ビットの深度の音でうまく動作すると思いますが、24回試してみると失敗します。

私はレートをとり、ミリ秒に変換します。私の開始パラメータと終了パラメータもmsに変換されます。 そして、この計算に基づいて、彼らが正しいと仮定して、ソースオーディオにstart_pointを見つけて、この点から最後まで書きます。 どうすればいいですか? この問題を解決するには、のみ外部ライブラリのないPython。

ありがとうございます。

+0

これはあなたの問題に直接関係しているのかどうかは分かりませんが、 'frames_per_m_sec = rate // 1000'は整数の除算のために問題があります。サンプルレートが例えば44.1kHzで、これは珍しくない場合、 'frames_per_m_sec = 44'となり、フレームオフセットへの時間の変換は数パーセントだけオフになります。 – wildwilhelm

+0

24ビットファイルでコードがどのように「失敗」するのかを具体的に記述できますか?あなたの問題はどのように現れますか? – wildwilhelm

+0

精度についてのあなたの注意は、絶対にノーサイズのサウンドには役立つかもしれないと思うが、私は16ビットのコンポジションでそれをすべてうまく使っている。ただし、24ビットの試行では、結果ファイルにノイズがなく、元のサウンドが得られません – Lescott

答えて

0

外部ライブラリを使用できる場合は、すぐに使用できる24ビットファイルを処理するsoundfileモジュールをお勧めします。

本当に純粋なPythonを使用したい場合は、少なくとも内蔵のwaveモジュールを使用する必要があります。これは、少なくともあなたのためのヘッダを処理します。まだ生のバイトを意味のあるものに変換する必要があります。

あなたのコードの一部しか表示していないため、あなたのケースで何がうまくいかないのか分かりにくいです。あなたは、16ビットと8ビットで動作するコードを表示する必要があり、24では動作しません。私はあなたのコードでビット深度の言及を見ません。

私のtutorial about the wave moduleを見ていると役に立つでしょう。

関連する問題