0

私はプログラミングの観点から音楽編集を始めたばかりで、波形やその性質に関する多くのアイデアを理解していますが、サウンドファイルから単一のサンプルを.バイト配列。

質問への回答に役立つ場合は、Alvas.Audio ライブラリ ( http://www.alvas.net/alvas.audio.aspx ) と C# を使用しています。

ファイル形式によってデータの保存方法が異なることは理解していますが、私の主な問題は、データの保存方法をプログラムで決定し、一度に 1 つのサンプルずつファイルを反復処理する方法に関連しています。おそらくすべてのファイルを (Alvas ライブラリを使用して) .wav 形式に変換する予定なので、wav 形式に特化した回答で十分ですが、ファイルがステレオの場合にサンプルを反復処理することにまだ興味があります。私が理解していることから、ステレオ データを含むファイルには並列サンプルが連続して格納されます。

私の最終目標は、曲の特定の期間 (曲のどこかで数秒) からサンプルを取得し、それらに対していくつかの数学やその他の処理を実行できるようにすることですが、私が読んだのは、実際には正しいデータです。

4

3 に答える 3

3

「 PCM 形式とは」も参照してください。

PCM (パルス符号変調) は非圧縮オーディオ形式です。PCM データを保持 (保持) する Wav ファイルを取得します。やり方を見る Wavファイルとは?メソッド AudioCompressionManager.GetWaveFormat は、オーディオ形式の調査に役立ちます。

  • FormatTag = 1 は PCM です。
  • チャネル = シングルチャネル (モノラル)、2 チャネル (ステレオ)、7.1 サラウンド サウンド用に 8 (左、右、中央、左サラウンド、右サラウンド、左後方、右後方位置)。7.1 システムには、低域用の 1 つのチャネルもあります。通常サブウーファーに送られる周波数効果 (LFE))。
  • SamplesPerSec = 1 秒あたりのデジタル化された数量値 (またはサンプリング)。何でもかまいませんが、標準値: 8000 Hz、11025 Hz、12000 Hz、16000 Hz、22050 Hz、24000 Hz、32000 Hz、44100 Hz、48000 Hz。
  • BitsPerSample - 最も一般的には、8 ビット (1 バイト) と 16 ビット (2 バイト) を使用します。まれに、24 ビット (3 バイト)、32 ビット (4 バイト)、および 64 ビット (4 バイト)。16ビットを基本と考えると、8ビットは圧縮形式と見なすことができます。サイズは 2 分の 1 になりますが、値のバリエーションは、16 ビットの 216 = 65536 ではなく、28 = 256 しかありません。そのため、8 ビットの音質は 16 ビットに比べて大幅に低下します。
  • BlockAlign = Channels * BitsPerSample / 8. ここで、8 は 1 バイトあたりのビット数です。
  • AvgBytesPerSec (ビットレート) = Channels * SamplesPerSec * BitsPerSample / 8.

以下のコードを使用して、PCM オーディオ形式をより詳細に分析できます。

    private void WhatIsPcmFormat(string fileName)
    {
        WaveReader wr = new WaveReader(File.OpenRead(fileName));
        IntPtr format = wr.ReadFormat();
        wr.Close();
        WaveFormat wf = AudioCompressionManager.GetWaveFormat(format);
        if (wf.wFormatTag == AudioCompressionManager.PcmFormatTag)
        {
            int bitsPerByte = 8;
            Console.WriteLine("Channels: {0}, SamplesPerSec: {1}, BitsPerSample: {2}, BlockAlignIsEqual: {3}, BytesPerSecIsEqual: {4}", 
            wf.nChannels, wf.nSamplesPerSec, wf.wBitsPerSample, 
            (wf.nChannels * wf.wBitsPerSample) / bitsPerByte == wf.nBlockAlign, 
            (int)(wf.nChannels * wf.nSamplesPerSec * wf.wBitsPerSample) / bitsPerByte == wf.nAvgBytesPerSec);
        }
    }
于 2014-02-11T21:49:19.340 に答える
2

ファイルを開いてそこからデータを読み取る方法を知っていると仮定すると、データ ファイル形式を参照する必要があります。WAV ファイルの場合、データの編成方法とアクセス方法については、こちらを参照してください。

ここに画像の説明を入力

Offset  Size  Name             Description

The canonical WAVE format starts with the RIFF header:

0         4   ChunkID          Contains the letters "RIFF" in ASCII form
                               (0x52494646 big-endian form).
4         4   ChunkSize        36 + SubChunk2Size, or more precisely:
                               4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
                               This is the size of the rest of the chunk 
                               following this number.  This is the size of the 
                               entire file in bytes minus 8 bytes for the
                               two fields not included in this count:
                               ChunkID and ChunkSize.
8         4   Format           Contains the letters "WAVE"
                               (0x57415645 big-endian form).

The "WAVE" format consists of two subchunks: "fmt " and "data":
The "fmt " subchunk describes the sound data's format:

12        4   Subchunk1ID      Contains the letters "fmt "
                               (0x666d7420 big-endian form).
16        4   Subchunk1Size    16 for PCM.  This is the size of the
                               rest of the Subchunk which follows this number.
20        2   AudioFormat      PCM = 1 (i.e. Linear quantization)
                               Values other than 1 indicate some 
                               form of compression.
22        2   NumChannels      Mono = 1, Stereo = 2, etc.
24        4   SampleRate       8000, 44100, etc.
28        4   ByteRate         == SampleRate * NumChannels * BitsPerSample/8
32        2   BlockAlign       == NumChannels * BitsPerSample/8
                               The number of bytes for one sample including
                               all channels. I wonder what happens when
                               this number isn't an integer?
34        2   BitsPerSample    8 bits = 8, 16 bits = 16, etc.
          2   ExtraParamSize   if PCM, then doesn't exist
          X   ExtraParams      space for extra parameters

The "data" subchunk contains the size of the data and the actual sound:

36        4   Subchunk2ID      Contains the letters "data"
                               (0x64617461 big-endian form).
40        4   Subchunk2Size    == NumSamples * NumChannels * BitsPerSample/8
                               This is the number of bytes in the data.
                               You can also think of this as the size
                               of the read of the subchunk following this 
                               number.
44        *   Data             The actual sound data.

更新:データをインラインで追加しました。

于 2013-03-18T21:51:37.043 に答える
1

オーディオ データを「圧縮」する最も一般的な方法は PCM で、圧縮されていない WAV ファイルで使用されます。各サンプルは短い整数値 ( ) に「パック」されshortており、PCM を提供できるライブラリがあれば、それらをshort値の配列として扱うことでデータを取得できます。

チャネルの数に応じて、shortサンプルごとにその量の s が得られます。それぞれshortが 2byte秒であるため、通常、ステレオ オーディオのサンプルあたり 4 バイトになります。

たとえば、オーディオ ファイルの 1.0 秒の位置にあるオーディオ データにアクセスするには、オーディオが 44100 (最も一般的なサンプリング レート - CD からのもの) でサンプリングされていると仮定して、44100*4 バイトをスキップする必要があります。

于 2013-03-18T21:59:05.353 に答える