ユーザーがMP3ファイルをリストボックスにドラッグアンドドロップできるWPFアプリケーションを構築しました。プレイリストの合計時間を計算する方法が必要です。
使用すべきライブラリはありますか? それとも、.NET フレームワークのみを使用して可能ですか?
多くの理論化を行った結果、mp3 ファイルの長さを正確かつ明白に計算する方法を見つけました。
上記の標準的な方法がうまくいかない理由を最初に繰り返しましょう。
ID3 メソッド: すべてのファイルに id3 タグがあるわけではありません。また、ある場合でも、duration フィールドが設定されていない可能性があります。
1 フレームの読み取りによる推定 * ファイル サイズ: VBR ファイルでは機能しません。
Xing ヘッダー: すべてのファイルにあるわけではありません。
PCM サイズによるデコードと決定: 3 GB 以上のファイルがあり、デコードされるまで待つつもりはありません。
私はどこでも読んで、すべてがNAudioにつながります。マーク、良い努力ときれいなソースに感謝します! ただし、NAudio で最も推奨される方法は、Mp3FileReader を使用してファイルを読み取り、すべてのフレームを取得することです。問題: Mp3FileReader は最初に TOC を作成しますが、たった 1 日しかない小さなファイルであっても、それには永遠に時間がかかります :)
Mark は、ソースが利用可能であるため、TOC の作成を削除することを提案しました。そうしているうちに、はるかに簡単な方法を見つけました。ここにあります; それはそれ自体で語っています:
double GetMediaDuration(string MediaFilename)
{
double duration = 0.0;
using (FileStream fs = File.OpenRead(MediaFilename))
{
Mp3Frame frame = Mp3Frame.LoadFromStream(fs);
if (frame != null)
{
_sampleFrequency = (uint)frame.SampleRate;
}
while (frame != null)
{
if (frame.ChannelMode == ChannelMode.Mono)
{
duration += (double)frame.SampleCount * 2.0 / (double)frame.SampleRate;
}
else
{
duration += (double)frame.SampleCount * 4.0 / (double)frame.SampleRate;
}
frame = Mp3Frame.LoadFromStream(fs);
}
}
return duration;
}
mp3 デコーダー ライブラリをラップし、.net 開発者が利用できるようにしました。ここで見つけることができます:
http://sourceforge.net/projects/mpg123net/
mp3 ファイルを PCM に変換し、ID3 タグを読み取るサンプルが含まれています。
mp3ファイルの長さを正しく計算するために使用できると思います。
私は数年前にこの目的のために自分自身を書くことになりました。フラッシュを使用して、クライアント側で効果的なものを作成できます。私が覚えている重要なポイントは次のとおりです。
編集:.Netでこれをやりたいと思っていたことは承知していますが、実際にはファイルをサーバーにアップロードする前にクライアント側を知っておくと便利かもしれません.ファイルの長さに制限を課したい場合は、はるかに早くそれを行うことができます.過程の中で。
【私なりの解決法】
リストボックス内の各 mp3 ファイルを開き、NaturalDuration を取得するために使用する 2 つ目の mediaelement コントロールを追加しました。リスト内の各ファイルを開いて閉じ、すべての値の合計を作成します。
他の人が述べたように、mp3 ヘッダーは正確ではありません。メディア要素は正しい期間を提供します。
おそらく最速の方法ではありませんが、私の場合は最も簡単です(他のライブラリに依存しません)。