4

フレームワーク内または P/Invoke を使用して、MemoryStream に保持されている wav ファイルの期間を決定する方法はありますか?

私はすでにManaged DirectXと別の同様の質問を見てきましたが、ストリームを渡す方法を提供するのではなく、すべてがパスで機能するようです。私が参照した質問のリンクの 1 つ ( A simple C# Wave editor ....)は、wav ファイルの長さを解析するために解析できることを明確に示しています。MemoryStream理想的には、車輪の再発明をしたくありません。

4

3 に答える 3

6

私はアレックスに同意します。時間をかけて、wav ファイルの長さを出力する 3 行のコードを含む小さなプログラムを作成しました。

        var stream=new MemoryStream(File.ReadAllBytes("test.wav"));
        var wave = new WaveFileReader(stream);
        Console.WriteLine(wave.TotalTime); // wave.TotalTime -> TimeSpan

NAudioライブラリをダウンロードします。パッケージに NAudio.dll があります。

プロジェクトで NAudio.dll を参照するだけです。

執筆時点ではリリース 1.3 です。

著者がブログで述べているように、WaveFileReader はStreamも受け入れます。ファイルパスだけではありません。

バージョン 1.3 は x86 用にビルドされていることに注意してください。x64 で動作させたい場合は、プロジェクトを強制的に x86 にする必要があります。(私のように) x64 用の NAudio.dll が必要な場合は、「any cpu」で再コンパイルする必要があります。私にとって、両方のソリューションが魅力のように機能しました。

于 2010-11-09T16:51:00.860 に答える
0

次の計算を試してください

streamSize == headerSizeIfAny +playTime*サンプリング*singleSampleSize->

playTime =(streamSize[バイト単位]-headerSizeIfAny)/(サンプリング[1秒あたりのサンプル数] * singleSampleSize [バイト])

于 2010-09-01T14:38:29.687 に答える
0

これをチェックしてください:

http://www.sonicspot.com/guide/wavefiles.html

この

typedef struct {
  WORD wFormatTag; 
  WORD nChannels; 
  DWORD nSamplesPerSec; 
  DWORD nAvgBytesPerSec; 
  WORD nBlockAlign; 
  WORD wBitsPerSample; 
  WORD cbSize;} WAVEFORMATEX; 

これでメモリストリームができました...0x10(Riffヘッダーをスキップするため)+ 0x08(フォーマットヘッダー用)=24にシークします

そして、あなたは上の構造にいます。

stream.ReadInt16()およびを使用しstream.ReadInt32()て、必要な構造体メンバーを読み取ります。

次に、54をシークし、1つを読み取りDWORDます。その数のバイトが、サンプルデータです。

次に、この変数から期間を計算します。

注:これは、メモリストリームに保存されている最も単純なPCMウェーブファイルに対してのみ機能します。その他の場合は、ヘッダーを尊重して適切に解析し、データチャンクを見つけて、そのサイズに応じて期間を計算する必要があります。

于 2010-10-20T16:24:31.857 に答える