非圧縮の状況では、wavヘッダーを読み取り、チャネル数、ビット、およびサンプルレートを引き出して、そこから処理する必要があることを知っています。(チャネル)*(ビット)*(サンプル/秒)*(秒) =(ファイルサイズ)
より簡単な方法はありますか-無料のライブラリ、またはおそらく.netフレームワークの何かですか?
.wavファイルが(たとえば、mpegコーデックで)圧縮されている場合、どうすればよいですか?
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;
}
}
}
リンクからNAudio.dllをダウンロード http://naudio.codeplex.com/
そして、この関数を使用します
public static TimeSpan GetWavFileDuration(string fileName)
{
WaveFileReader wf = new WaveFileReader(fileName);
return wf.TotalTime;
}
あなたは期間を取得します
すでに受け入れられている答えから何も奪うことはありませんが、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 クラスのリファレンスです。
上記の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();
}
}
}
.netフレームワークには、mediaplayerクラスがあります。
http://msdn.Microsoft.com/en-us/library/system.windows.media.mediaplayer_members.aspx
次に例を示します。
http://forums.Microsoft.com/MSDN/ShowPost.aspx?PostID=2667714&SiteID=1&pageid=0#2685871
はい、オーディオファイルの継続時間を取得するために使用できる無料のライブラリがあります。このライブラリは、さらに多くの機能を提供します。
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;
}
以下のコードを試してください C#で.wavファイルの長さを確認する方法
string path = @"c:\test.wav";
WaveReader wr = new WaveReader(File.OpenRead(path));
int durationInMS = wr.GetDurationInMS();
wr.Close();
私は MediaInfo と言わなければなりません。私が取り組んでいるオーディオ/ビデオエンコーディングアプリケーションで1年以上使用しています。それはほとんどすべての他のフォーマットと一緒にwavファイルのすべての情報を提供します。
MediaInfoDll 機能させる方法に関するサンプルC#コードが付属しています。
XNAライブラリ は、そのルートを進んで進んでいく場合、WAVなどでの作業をある程度サポートしていることがあります。ゲームプログラミング用にC#で動作するように設計されているため、必要なものだけを処理する場合があります。
CodeProject にチュートリアル(少し-おそらく-活用できる実用的なコード)があります。
WAVファイルが複数のチャンクで構成されていることは完全に「正常」であることは、少し注意する必要がある唯一のことです。そのため、すべてのチャンクが考慮されるように、ファイル全体をスクートする必要があります。
あなたのアプリケーションは圧縮されたWAVで正確に何をしていますか?圧縮されたWAVファイルは常にトリッキーです。この場合は、OGGファイルやWMAファイルなどの代替コンテナ形式を常に使用してみます。 XNAライブラリは特定の形式で動作するように設計されている傾向がありますが、XACT内でより一般的なwav再生方法を見つけることができます。可能な代替策はSDL C#ポートを調べることですが、これを使用して圧縮されていないWAVを再生したことはありません。一度開いたら、サンプル数をクエリして長さを確認できます。
ブローコードが失敗することをテストしたところ、ファイル形式は「\\ 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;
}
}`
.WAVファイルの構造にある程度慣れていると想定します。このファイルにはWAVEFORMATEXヘッダー構造体が含まれ、その後にさまざまな種類の情報を含む他の構造体(または「チャンク」)がいくつか続きます。ファイル形式の詳細については Wikipedia を参照してください。
最初に、.wavファイルを反復処理して、「データ」チャンクのパディングされていない長さを合計します(「データ」チャンクには、ファイルのオーディオデータが含まれています。通常、これらの1つしかありませんが、複数の)。これで、オーディオデータの合計サイズ(バイト単位)がわかりました。
次に、ファイルのWAVEFORMATEXヘッダー構造体の「平均バイト/秒」メンバーを取得します。
最後に、オーディオデータの合計サイズを1秒あたりの平均バイト数で割ります。これにより、ファイルの継続時間が秒単位でわかります。
これは、圧縮されていないファイルや圧縮されたファイルに適度に機能します。
時間= FileLength /(サンプルレート*チャネル*サンプルあたりのビット/ 8)