オーディオ ファイル (*.wav) を録音し、自動的にタグ付けして名前を付けるアプリケーションを C# で作成しています。Wave ファイルは、波形データ チャンクに加えてメタ データ チャンクを含むことができる RIFF ファイル (AVI など) です。だから今、私はRIFFメタデータを記録されたwaveファイルに読み書きする方法を理解しようとしています.
私はファイルの記録に NAudio を使用しており、RIFF タグを読み書きする方法について、フォーラムやSOで質問しました。多くの良い回答を受け取りましたが、RIFF チャンクの読み取りと書き込みを希望するほど簡単に行えるソリューションはありませんでした。
しかし、もっと重要なことは、バイト レベルでファイルを扱った経験がほとんどないことです。これは、学ぶ良い機会になると思います。だから今、私はRIFFファイルを読み込んで、ファイルからメタデータを読み書きできる独自のクラスを書きたいと思っています。
私は C# でストリームを使用しましたが、常にストリーム全体を一度に使用します。そのため、ファイルをバイトごとに検討する必要があることに少し戸惑っています。具体的には、ファイルの途中でバイトを削除または挿入するにはどうすればよいですか? 以下のコードに示すように、FileStream を介してファイルをバイト配列 (byte[]) に読み取ろうとしました。
System.IO.FileStream waveFileStream = System.IO.File.OpenRead(@"C:\sound.wav");
byte[] waveBytes = new byte[waveFileStream.Length];
waveFileStream.Read(waveBytes, 0, waveBytes.Length);
そして、Visual Studio デバッガーを通して、最初の 4 バイトがファイルの RIFF ヘッダーであることを確認できました。
しかし、配列は、値の挿入や削除などのサイズを変更する操作を実行するときに対処するのが面倒です。だから私は、このように byte[] を List にできると思っていました。
List<byte> list = waveBytes.ToList<byte>();
これにより、ファイルのバイト単位の操作が非常に簡単になりますが、System.IO名前空間にクラスのようなものが欠けているのではないかと心配しています。私は正しい軌道に乗っていますか、それともこれを行うためのより良い方法はありますか? また、私はパフォーマンスにあまり関心がなく、ポインターやthis guyのような安全でないコード ブロックを処理したくないことも言及しておく必要があります。
RIFF/WAV ファイル形式に関する良い記事が参考になる場合は、こちらをご覧ください。