2017-02-26 2 views
0

入力に挿入されたfile.wavを分析するためのプログラムを作成しました。元のファイルから時間間隔を削除できるかどうかを知りたい.wav。 私は一定の時間内にある分析のために不要な音の部分をカットしました。サウンドのこれらの部分を除去した後、私は除去されないサウンドのすべてのパーティを一緒にマージする新しい連続的なサウンドを得るでしょう。 可能ですか? 私を助けることができますか?サウンドのセグメントを削除する方法は?

+0

あなたの試みはこれまでのところです – gpasch

答えて

1

WAV形式のファイルを読み込み、ヘッダーを解析し、オーディオカーブデータポイントをいくつかのデータ構造に格納したら、2つの選択肢があります。代わりに

  • 更新(トリッキー実装する)

  • は、新たなデータ構造に良好なデータポイントをコピー(これを行うことができます)

WAV形式のニースの態様は、そのPCMですオーディオ曲線がその曲線上の離散点として表されることを意味します。ヘッダーで使用可能なビット深度を確認してください。典型的なビット深度は16ビットで、各サンプルはメモリバッファ内の2バイトのデータを消費します。 100個程度のサンプル値を印刷して、サンプルを正しいフォーマットで手元に置いていることを確認します。 16ビットの場合、可能な値の範囲は2^16の別個の整数値にマップされます。これらのサンプル値を調べるときは、署名しているか署名していないかが重要です。

踏み台として、私はまずWAVファイルを読み込んで各バイトを出力ファイルにコピーするいくつかのコードを作成しました。この新しい出力WAVファイルを再生できることを確認します。次に、ヘッダーを解析し、サンプルレートフィールドを特定し、その値を例えば44100から22050に更新する以外は同様のコードを書いて、ヘッダーの直後のWAVファイルに表示されるオーディオデータバイトが続くこの更新でヘッダーを出力します。このWAVファイルを再生しますか?スピードアップしたか、オーディオトラックを遅くしましたか?

入力WAVファイルを開いて各バイトを読み込むと、ヘッダーバイトの後に2バイトを1つの16ビット整数変数に結合する機能が得られます(ヘッダーに16ビットのサンプルがあるとした場合)。各オーディオサンプルは複数のバイトを消費します(8ビットオーディオは恐ろしいものです)。したがって、24ビットのオーディオを使用している場合、特定のチャンネルの各オーディオサンプルは、ファイルの3バイトにまたがります。大小エンディアンの概念を理解してください(2バイトは左から右または右から左に表示されます)。簡単にするために、最初にモノラルチャンネル入力WAVファイルを操作してください。ステレオ(2チャンネル)またはXチャンネルはWAV形式でも可能ですが、モノラルは簡単です。

は、我々は10個のサンプル(各16ビット整数)

  • 0持っていると言うことができます - 3良い
  • 4から7悪い(我々はこれらを廃棄します)
  • 8から9良い

出力ファイルには、不良サンプル4〜7を無視して残っているものだけが含まれるので、わずか6サンプルしかありません。全てのサンプルを横切っ

ループ - >現在のサンプルが良好であるかどうかを識別 - >のみ、このコードで

int out_index = 0; 

int bit_depth = 16; // get this 16 from header, could be 24 for example 

// how many bytes in bit depth, 2 if 16 bit, 3 if 24 bit 
int incr_index = bit_depth/8; 

for (int in_index = 0; in_index < size; in_index += incr_index) { 

    if (is_sample_good(in_index)) { // is this sample good or bad 

     output_data[out_index]  = input_data[in_index]; 
     output_data[out_index + 1] = input_data[in_index + 1]; 

     out_index += incr_index; 
    } 
} 

注意入出力データ構造それぞれが独自のインデックスを有する出力データ構造に良好なサンプルをコピー.. 。重要なのは、良いサンプルの出力インデックスのみを進めるからです。

WAVファイルのヘッダーは、常にWAVファイルの最初のXバイト数です(正しく覚えていれば32バイトです)。このヘッダーには、合計データサイズのインジケータがあります。出力WAVファイルのヘッダーセクションに挿入するこのデータ長ヘッダータグの値を駆動する良いサンプルの数を記録します。入力ファイルを反復して出力データ構造(メモリバッファ)を生成した後、新しい出力ファイルを開き、長さタグの更新された値で新しいヘッダを書き込み、新しいメモリバッファを書き、ファイルを閉じ、それを再生する。ここで

は、いくつかのWAVフォーマットは

http://unusedino.de/ec64/technical/formats/wav.html

https://www.gamedev.net/resources/_/technical/game-programming/loading-a-wave-file-r709

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

http://www.topherlee.com/software/pcm-tut-wavformat.html

http://www.labbookpages.co.uk/audio/javaWavFiles.html

リンクあり

http://www.drdobbs.com/database/inside-the-riff-specification/184409308

+0

ありがとう、私は理解しています。あなたはまだこの目的に役立ついくつかのリンクを示すかもしれませんか? – Margherita

関連する問題