2

オーディオ ファイル (*.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 ファイル形式に関する良い記事が参考になる場合は、こちらをご覧ください。

4

1 に答える 1

1

私は C# で書いたわけではありませんが、私の観点から悪い点をいくつか挙げることができます。

1) ファイルが独自のファイルであり、故意にサイズが小さい場合を除き、メモリ内の WAV ファイル全体を読み取らないでください。

2) データをメモリに挿入する必要はありません。たとえば、次のことを簡単に実行できます。ソースファイルを分析し、チャンクのオフセットを保存し、メタデータをメモリに読み取ります。ダイアログで編集するためのメタデータを提示します。RIFF-WAV ヘッダーの書き込み、fmt チャンクの保存中、ソース ファイルからのオーディオ データの転送 (ブロックの読み取りと書き込みによる)、メタデータの追加。RIFF-WAV ヘッダーを更新します。

3) ファイルの末尾にメタデータを保存してみてください。これにより、ファイル全体の再書き込みを必要としないタグのみが交互に表示されます。

C# での RIFF ファイルの操作に関するいくつかのソースがここにあるようです。

于 2010-04-11T23:04:54.083 に答える