0

DirectShow でメディア ファイルの長さを取得しようとしています。次のコード (C#) を使用します。

var seekingParser = filter as IMediaSeeking;
if (seekingParser != null)
{
   long duration;
   if (seekingParser.SetTimeFormat(TimeFormat.MediaTime) == 0
       && seekingParser.GetDuration(out duration) == 0)
       track.Duration = duration / 10000000f;
}

メディアファイルの長さを秒単位で取得します。ただし、3 ~ 4 分の MP3 ファイルを開こうとすると、track.Duration が 11 ~ 12 分になります。複数のファイルを試しましたが、効果は常に同じです。その理由は何ですか?

4

3 に答える 3

2

通常、アプリケーション側からIMediaPosition(の代わりに)インターフェイスを使用します。IMediaSeeking期間は常に秒単位で報告されます。ただし、これによって違いが生じる可能性は低く、代わりにWindows Media API、ID3タグサポートを使用してID3タグから継続時間を読み取る可能性があります。

DirectShow APIを使用してメディアファイルの正確な期間を取得するためのより信頼性の高い方法はありますか?

Windows Media Playerは、DirectShow以外のAPIであるMedia Foundationを介してMP3ファイルを再生するため、DirectShowからまったく同じことを期待または実行するオプションはありません。

于 2012-03-01T16:30:05.177 に答える
2

ドキュメントから:

ソース形式によっては、期間が正確でない場合があります。たとえば、ソースに可変ビット レート (VBR) ストリームが含まれている場合、メソッドは推定時間を返すことがあります。

ひょっとして、VBR ストリームを使用していませんか?

于 2012-03-01T13:14:00.040 に答える
0

クリーンなWindowsインストールでも同じことを試すことができます。バグのあるコーデック(パック)がインストールされている可能性があります。

于 2012-03-01T19:04:29.203 に答える