3

私はメディア プレゼンテーション プログラムを作成しており、ほぼ完成していますが、何らかの理由で mp3 ファイルの長さが正しくありません。私は Microsoft.DirectX.AudioVideoPlayback.Audio クラスを使用してオーディオ ファイルを再生します。このクラスは wav ファイルに適しています。Google 検索から、可変ビット レートを使用して mp3 がエンコードされている場合に問題があるように見えることがわかりますが、メディアのビット レート設定に関係なく、プログラムが正確にレポートする必要があります。コードは次のとおりです。

Media_Audio aud = (Media_Audio)item.MediaFile;
TimeSpan total = aud.EndTime - aud.StartTime;
if (aud.EndTime.TotalSeconds == 0)
{
    total = TimeSpan.FromSeconds(aud.Player.Duration)-aud.StartTime;
}
TimeSpan now = TimeSpan.FromSeconds(aud.Player.CurrentPosition) - aud.StartTime;
string nows = now.Hours.ToString() + ":" + now.Minutes.ToString() + ":" + now.Seconds.ToString();
string tots = total.Hours.ToString() + ":" + total.Minutes.ToString() + ":" + total.Seconds.ToString();
item.currentPosition.Text = nows + "/" + tots;

キーラインは次のとおりです。

total = TimeSpan.FromSeconds(aud.Player.Duration)-aud.StartTime;

aud.Player は、Microsoft.DirectX.AudioVideoPlayback.Audio のインスタンスです。

実際には 5:49 秒の長さの曲の場合、長さとして 39:13 と報告されます。Windows Explorer や VLC Player と同じ長さです。また、K-Lite Mega Codec パックをインストールしてください。そのため、干渉する可能性があります。私はこの質問を認識しています: .NET で MP3 の期間を取得するにはどうすればよいですか? しかし、私のプログラムのこの段階では、オーディオ ファイルを再生する現在の方法から新しい方法に切り替える時間がないので、DirectX のみを使用してデュレーションを決定する他のオプションはありますか? または、BASS.NET または TagLib Sharp に頼る必要がありますか? (メタデータには、VBR でエンコードされた mp3 の正確な情報も含まれていますか?)

4

2 に答える 2

3

@anantolineにコメントとして投稿したかったのですが、長すぎました…そうです!

VBRファイルの長さをまったく見積もることができません。その中のすべてのmp3フレームは異なるビットレートを持つ可能性があるため、ファイルの任意の部分を読み取ることから、ファイルの他の部分でのデータの密度を知ることはできません。VBR mp3の正確な長さを決定する唯一の方法は、全体をデコードするか、(方法を知っている場合は)フレームのすべてのヘッダーを1つずつ読み取り、デコードされたDURATIONを収集することです。

後で使用する方法は、使用するCPUが保存する必要のある貴重なリソースである場合にのみ使用します。それ以外の場合は、ファイル全体をデコードすると、期間が決まります。

あなたはmpg123の私のポートを使って仕事をすることができます:http ://sourceforge.net/projects/mpg123net/

詳細:多くのmp3ファイルにはid3タグとして「もの」が追加されており、すべてのファイルを調べないと、期間の計算でそのタグを誤って使用する可能性があります。

于 2012-06-20T22:20:20.207 に答える
1

私の知る限り、ファイル全体を一度実行しないと、VBR でエンコードされた MP3 ファイルの正しい長さを判断することはできません (提示されていなくても、何らかのデコード/再生が必要です)。

ID3 タグを読み取って長さを取得することができます (最初にトラックをエンコード/トラックを一度デコードしたアプリによって書き込まれます。ただし、提供された MP3 ファイルに ID3 タグがないか、さらに悪いことに、 ID3タグ。

于 2012-06-20T21:59:31.153 に答える