web-dev-qa-db-ja.com

C#で.wavファイルの長さ(つまり、期間)を確認するにはどうすればよいですか?

非圧縮の状況では、wavヘッダーを読み取り、チャネル数、ビット、およびサンプルレートを引き出して、そこから処理する必要があることを知っています。(チャネル)*(ビット)*(サンプル/秒)*(秒) =(ファイルサイズ)

より簡単な方法はありますか-無料のライブラリ、またはおそらく.netフレームワークの何かですか?

.wavファイルが(たとえば、mpegコーデックで)圧縮されている場合、どうすればよいですか?

27
John Sibly

MciSendString(...)関数の使用を検討してください(明確にするためにエラーチェックは省略されています)。

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace Sound
{
    public static class SoundInfo
    {
        [DllImport("winmm.dll")]
        private static extern uint mciSendString(
            string command,
            StringBuilder returnValue,
            int returnLength,
            IntPtr winHandle);

        public static int GetSoundLength(string fileName)
        {
            StringBuilder lengthBuf = new StringBuilder(32);

            mciSendString(string.Format("open \"{0}\" type waveaudio alias wave", fileName), null, 0, IntPtr.Zero);
            mciSendString("status wave length", lengthBuf, lengthBuf.Capacity, IntPtr.Zero);
            mciSendString("close wave", null, 0, IntPtr.Zero);

            int length = 0;
            int.TryParse(lengthBuf.ToString(), out length);

            return length;
        }
    }
}
20
Jan Zich

リンクからNAudio.dllをダウンロード http://naudio.codeplex.com/

そして、この関数を使用します

public static TimeSpan GetWavFileDuration(string fileName)       
{     
    WaveFileReader wf = new WaveFileReader(fileName);
    return wf.TotalTime; 
}

あなたは期間を取得します

33
Monti Pal

すでに受け入れられている答えから何も奪うことはありませんが、Microsoft.DirectX.AudioVideoPlayBack名前空間。これは DirectX 9.0 for Managed Code の一部です。これへの参照を追加すると、コードが次のように簡単になります...

Public Shared Function GetDuration(ByVal Path As String) As Integer
    If File.Exists(Path) Then
        Return CInt(New Audio(Path, False).Duration)
    Else
        Throw New FileNotFoundException("Audio File Not Found: " & Path)
    End If
End Function

そして、それもかなり速いです!これが Audio クラスのリファレンスです。

5
Josh Stodola

上記のMediaPlayerクラスの例に問題がありました。プレーヤーがファイルを開くまでに時間がかかる場合があります。 「現実の世界」では、MediaOpenedイベントに登録する必要があります。イベントが発生した後、NaturalDurationが有効になります。コンソールアプリでは、開いてから数秒待つだけです。

using System;
using System.Text;
using System.Windows.Media;
using System.Windows;

namespace ConsoleApplication2
{
  class Program
  {
    static void Main(string[] args)
    {
      if (args.Length == 0)
        return;
      Console.Write(args[0] + ": ");
      MediaPlayer player = new MediaPlayer();
      Uri path = new Uri(args[0]);
      player.Open(path);
      TimeSpan maxWaitTime = TimeSpan.FromSeconds(10);
      DateTime end = DateTime.Now + maxWaitTime;
      while (DateTime.Now < end)
      {
        System.Threading.Thread.Sleep(100);
        Duration duration = player.NaturalDuration;
        if (duration.HasTimeSpan)
        {
          Console.WriteLine(duration.TimeSpan.ToString());
          break;
        }
      }
      player.Close();
    }
  }
}
4
Lars
3
Cetra

はい、オーディオファイルの継続時間を取得するために使用できる無料のライブラリがあります。このライブラリは、さらに多くの機能を提供します。

TagLib

TagLibは、GNU Lesser General Public License(LGPL)およびMozilla Public License(MPL)の下で配布されています。

秒単位で継続時間を返す以下のコードを実装しました。

using TagLib.Mpeg;

public static double GetSoundLength(string FilePath)
{
    AudioFile ObjAF = new AudioFile(FilePath);
    return ObjAF.Properties.Duration.TotalSeconds;
}
2
Manish Nayak

以下のコードを試してください C#で.wavファイルの長さを確認する方法

    string path = @"c:\test.wav";
    WaveReader wr = new WaveReader(File.OpenRead(path));
    int durationInMS = wr.GetDurationInMS();
    wr.Close();
2
Aleks

私は MediaInfo と言わなければなりません。私が取り組んでいるオーディオ/ビデオエンコーディングアプリケーションで1年以上使用しています。それはほとんどすべての他のフォーマットと一緒にwavファイルのすべての情報を提供します。

MediaInfoDll 機能させる方法に関するサンプルC#コードが付属しています。

1
sieben

XNAライブラリ は、そのルートを進んで進んでいく場合、WAVなどでの作業をある程度サポートしていることがあります。ゲームプログラミング用にC#で動作するように設計されているため、必要なものだけを処理する場合があります。

1
xan

CodeProject にチュートリアル(少し-おそらく-活用できる実用的なコード)があります。

WAVファイルが複数のチャンクで構成されていることは完全に「正常」であることは、少し注意する必要がある唯一のことです。そのため、すべてのチャンクが考慮されるように、ファイル全体をスクートする必要があります。

1
moobaa

あなたのアプリケーションは圧縮されたWAVで正確に何をしていますか?圧縮されたWAVファイルは常にトリッキーです。この場合は、OGGファイルやWMAファイルなどの代替コンテナ形式を常に使用してみます。 XNAライブラリは特定の形式で動作するように設計されている傾向がありますが、XACT内でより一般的なwav再生方法を見つけることができます。可能な代替策はSDL C#ポートを調べることですが、これを使用して圧縮されていないWAVを再生したことはありません。一度開いたら、サンプル数をクエリして長さを確認できます。

1
Bubba

ブローコードが失敗することをテストしたところ、ファイル形式は「\\ ip\dir\*。wav」のようになりました。

 public static class SoundInfo
   {
     [DllImport("winmm.dll")]
     private static extern uint mciSendString
     (
        string command,
        StringBuilder returnValue,
        int returnLength,
        IntPtr winHandle
     );

     public static int GetSoundLength(string fileName)
      {
        StringBuilder lengthBuf = new StringBuilder(32);

        mciSendString(string.Format("open \"{0}\" type waveaudio alias wave", fileName), null, 0, IntPtr.Zero);
        mciSendString("status wave length", lengthBuf, lengthBuf.Capacity, IntPtr.Zero);
        mciSendString("close wave", null, 0, IntPtr.Zero);

        int length = 0;
        int.TryParse(lengthBuf.ToString(), out length);

        return length;
    }
}

naudioが動作している間

    public static int GetSoundLength(string fileName)
     {
        using (WaveFileReader wf = new WaveFileReader(fileName))
        {
            return (int)wf.TotalTime.TotalMilliseconds;
        }
     }`
0
item.wu

.WAVファイルの構造にある程度慣れていると想定します。このファイルにはWAVEFORMATEXヘッダー構造体が含まれ、その後にさまざまな種類の情報を含む他の構造体(または「チャンク」)がいくつか続きます。ファイル形式の詳細については Wikipedia を参照してください。

最初に、.wavファイルを反復処理して、「データ」チャンクのパディングされていない長さを合計します(「データ」チャンクには、ファイルのオーディオデータが含まれています。通常、これらの1つしかありませんが、複数の)。これで、オーディオデータの合計サイズ(バイト単位)がわかりました。

次に、ファイルのWAVEFORMATEXヘッダー構造体の「平均バイト/秒」メンバーを取得します。

最後に、オーディオデータの合計サイズを1秒あたりの平均バイト数で割ります。これにより、ファイルの継続時間が秒単位でわかります。

これは、圧縮されていないファイルや圧縮されたファイルに適度に機能します。

0
GogglesPisano

時間= FileLength /(サンプルレート*チャネル*サンプルあたりのビット/ 8)

0
Martin Abilev