2009-06-30 21 views
5

DelphiでMP3/wavオーディオファイルの長さ(分と秒)を取得するにはどうすればよいですか?MP3/wavオーディオファイルの長さ

+0

MP3ファイルの再生に使用しているAPIはありますか? TMediaPlayer? –

+0

いいえ、私はファイルを再生していない、私はちょうどファイルからの情報が必要です。 – Attilah

答えて

6

の数をカウントする必要があります。フレームヘッダーの1つからビットレートを取得できます。もちろん、これは、フレームごとに異なるレートを持つことができる可変レートのMP3の場合は機能しません。

使用Header Layout(それだけで4バイトです):

  1. 開きます同期ヘッダを見つける まで読み取ることでストリーム

  2. 最初のフレームヘッダの先頭を検索でMP3、これは11の連続ビットが1に設定されています。この は12でしたが、MPEGバージョン2.5が可能になるように修正されました。

  3. MPEGバージョンIDを決定します。ビットレートを見つける目的のために、V2.5は、V2と同じである

  4. 層説明

  5. ビットレートインデックス

  6. MPEGバージョンを使用して、層の説明及びビットを読むを決定レートインデックス、リンクされたヘッダー参照のビットレートインデックステーブルからの実際のビットレートを決定する

  7. ファイルサイズをビットレートでキロビット((8 *サイズ/バイト)/ 1000)で分けて秒

デルファイのサンプルは見つかりませんでしたが、参照用にこの手法を使用しているC# implementationがあります。 getLengthInSecondsメソッドを参照してください。

+0

+1、長さを秒単位で計算するコードは、私が見つけたものと同じです。 –

+0

Downvoted:リンクされた記事が書かれてから消えてしまった、リンクのみの回答。 – Jules

+0

@Jules:私はダウン投票の理由を認めており、これは有効でした。私はリンクを修正し、必要なステップの要約とヘッダー参照へのリンクを追加しました。 –

-1

私はDephiとプレイして以来、長い時間が経ちました。

は、

FileSize(var aFile) 
+0

これは、分と秒ではなく、バイト単位のサイズを与えます。 –

+1

@Charlie Salts - これは、OPが数分/秒を望んでいた前に投稿されました。私はSeckoに休憩を与えるだろう。また、Bruceと私が公表した公式にFileSize()が役に立つかもしれません。 –

+0

質問は「どのようにDelphiでMP3/wavオーディオファイルの長さを取得するのですか?」でした。 – Secko

3

Mp3 are divided into frames like this

を試してみてください、あなたはビットレートによってファイルのサイズを分割することにより、期間を計算することができ、フレーム

+0

+1フレームに関する情報。 –

+0

は言うほど簡単ではありません。 mp3ファイルは、フレームが始まる前に多くの情報を持っています... –

2

これはうまくいきますが、これはforum postです。 winampのようなものと結果を比較して、動作することを確認します。

+1

CBR(固定ビットレート)の正確さ.VBR(可変ビットレート)で不正確な可能性があります。おおよその時間が必要な場合には、これは良い考えです。 –

+1

この方法では、ビットレートを知っていることを前提にしていますが、 –

+0

@Charlie Salts - あなたの正しい、式はVBRのケースでは機能しません。フォーラムの投稿にはビットレートの決定方法が示されていません。ブルース・マギーの答えはより完全で、私はそれを私の上に勧めています。 –

1

www.un4seen.comにアクセスし、低音ライブラリをダウンロードすると、フォーラムのセクションから多くの情報が得られます。 ;)

2

Windowsでは、MP3ファイルの長さを判断するのに合理的に効果的な方法があります。

これは大きなハックですが、うまくいくようです。 Ryan。

//add MPlayer to the uses clause; 
// 
//add the MP3PlayLength function to an existing form and 
//place a button on the form, linking the button click method to see how it works. 

uses MPlayer; 

function TForm1.MP3PlayLength(aMP3FileName:string):string; 
var 
    wMP : TMediaPlayer; 
    wLen : Cardinal; 
begin 
    Try 
    wMP := TMediaPlayer.Create(self); 
    try 
     wMP.Visible := false; 
     wMP.parent := self; 
     wMP.FileName := aMP3FileName; 
     wMP.TimeFormat := tfMilliseconds; 
     wMP.DeviceType := dtAutoSelect; 
     wMP.Open; 
     try 
      wLen := trunc(wMP.Length/1000); 
      result := inttostr(wLen div 60)+':'+inttostr(wLen mod 60); 
     finally 
      wMP.Close; 
     end; 
    finally 
     wMP.free; 
    end; 
    except 
    result := '(err)'; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if OpenDialog1.Execute then 
     showmessage(MP3PlayLength(OpenDialog1.FileName)); 
end; 
2

または、MediaInfo.dll link textを試してください。

Delphiラッパークラスが含まれています。たとえば :

MediaInfo_Get(Handle, Stream_General, 0, 'Duration', Info_Text, Info_Name) 

その他のソリューションDSPack link text

size := FilterGraph.Duration; 
2

私は強力なを開発者に提供するために、..あなたはBASSオーディオライブラリであるBASS

http://www.un4seen.com/bass.html

を使用することをお勧めしますストリーム(MP3 .. OGG ..)機能。小さなDLLの中で、100KB未満のサイズ。

それはRubyプロジェクト内の背景の回避策のためのffmpegを使用して、このブログ

uses BASS; 

    var 
     playingChannel: HSTREAM; 
     playingLength: Double; 
     mp3filename: String; 

    begin 
     BASS_Init(-1,44100,0,Application.Handle,nil); 
     playingChannel:=BASS_StreamCreateFile(FALSE,pchar(mp3filename),0,0,0); 
     playingLength:=BASS_ChannelBytes2Seconds(playingChannel, 
     BASS_ChannelGetLength(playingChannel,BASS_POS_BYTE)); 
    end; 
+0

無料ですが、そうですか? – Vassilis

+0

それは非商業的使用のためである。 www.un4seen.comの「ライセンス」を参照してください。 –

関連する問題