1

まず、独自のライブラリを使用せずにこれを実行しようとしています。これにより、移植性が向上し、ここで何が起こっているのかをよりよく理解できます。反復的な機能 (ヘッダーの解析など) を処理するために、独自のクラスとライブラリを作成しても問題ありません。

そのため、オーディオ ファイルに関する情報 (つまり、ファイル内のオーディオの長さ、サンプル数、フレーム数など) を計算するために、ストリームを介してWAV/RIFFファイルを読み取る方法を知りたいと思っています。そして、他の機能のためにそれらのフレームまたはサンプルを繰り返します。

RIFF仕様fstreamで指定されているように、バイナリファイルとして読み込んでヘッダーを許可する(そしてヘッダーからいくつかの情報を取得する)ことは知っていますが、フレームまたはサンプルへのバイト、および長さへのバイトをどのように識別しますか?

他の言語でこれを扱う問題を見つけることができますが、C++ で直接関連するものは見たことがありません。

4

2 に答える 2

2

WAV ファイルを読み取ることは、ビットマップなどのバイナリ ファイルを読み取ることと同じだと思います。基本的な考え方は、最初にファイルのヘッダーを読み取り、次にヘッダーに示されている情報に従ってデータを読み取ることです。通常、ヘッダーは C データ構造に入力でき、情報を直接使用できます。

struct wavfile
{
    char   id[4];            // should always contain "RIFF"
    int    totallength;      // total file length minus 8
    char   wavefmt[8];       // should be "WAVEfmt "
    int    format;           // 16 for PCM format
    short  pcm;              // 1 for PCM format
    short  channels;         // channels
    int    frequency;        // sampling frequency
    int    bytes_per_second;
    short  bytes_by_capture;
    short  bits_per_sample;
    char   data[4];          // should always contain "data"
    int    bytes_in_data;
};

FILE * fp = fopen("file.wav", "rb");
wavfile info;
if (fp) {
    fread(&info, 1, sizeof(wavfile), fp);
    // try to read data here
}

WAV ファイルにフレームはないと思います。各サンプル ポイントの長さを確認してwavinfo.bits_per_sample / 8ください。short値が 2 の場合、サンプルとして aを読み取ることができます。

ここにブログがあります。他にもサンプル コードがありますが、まだデバッグが必要だと思います。

于 2014-09-03T01:09:03.203 に答える
0

WAV/RIFF ヘッダーは、サンプリング サイズ (8 ビット、16 ビットなど) を示します。また、エンディアンと、各サンプルを符号付きまたは符号なしのどちらとして解釈するか (16 ビット以上の場合) も示します。チャンネル数も。

他に何が必要なのかわからない。ファイルをかみ砕くために必要なことは、これでほとんどすべてです。引用されたリンクを読むと、すべての質問にほぼ答えているようです。

これはたまたま、ラジオに接続したサウンド カードからオーディオを取得するための簡単なハックをまとめたときに参照として使用したリンクと同じものです。前述のハックでは、オーディオをオンザフライで分析してサイレント スポットを見つけ、サイレント スポットでオーディオ ストリームを個別のファイルに分割しました。結果として得られたデータは、.wav ファイルが私の .mp3 エンコーダーに受け入れられるのに十分であり、mp3 プレーヤーにダンプできる .mp3 ファイルを生成したので、後でお気に入りのラジオ番組を聞くことができました。

于 2014-09-03T00:35:11.460 に答える