Вопрос по audio – Продолжительность MP3 / WAV аудио файла

5

Как узнать продолжительность (в минутах и секундах) аудиофайла MP3 / wav в Delphi?

Какой API вы используете для воспроизведения файла MP3? TMediaPlayer? J. Polfer
нет, я не играю в файл, мне просто нужна информация из файла. Attilah

Ваш Ответ

9   ответов
2

текст ссылки.

Включен класс-обертка Delphi. Например

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

Другое решение DSPack текст ссылки

size := FilterGraph.Duration;
2

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

BASS - это аудиотека, которая предоставляет разработчикам мощные функции потоковой передачи (MP3 .. OGG ..). Все в крошечной DLL, размером до 100 КБ.

это очень легко использовать

   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;
Разве это не бесплатно? Vassilis
это для некоммерческого использования. Смотрите "лицензирование" на www.un4seen.com PA.
1

вы получите много информации из раздела форума. ;)

0

используя ffmpeg для фонового обхода в проекте ruby.

http: //blog.ncodedev.co

-1

Пытаться

FileSize(var aFile)
Это даст размер в байтах, а не в минутах и секундах. Charlie Salts
@ Charlie Salts - это было опубликовано до того, как OP объяснил, что им нужны минуты / секунды. Я бы дал Секко передохнуть. Кроме того, FileSize () может быть полезным и используется в формуле Брюса, о которой я писал. J. Polfer
Вопрос был в том, «Как узнать длину аудиофайла MP3 / wav в Delphi?». Secko
Я бы предположил, что постер означал длину во времени. Если бы они попросили длинулюбо файл, я бы предположил размер файла. Получение размера файла любого файла обычно тривиально, получение длины MP3 иногда не тривиально, поэтому возникает вопрос. Charlie Salts
Я согласен, но мой мозг каким-то образом только что прислал мне изображение функции FileSize. Secko
7

разделив размер файла на скорость передачи данных. Вы можете получить битрейт от одного из заголовков кадра. Конечно, это не будет работать для MP3 с переменной скоростью, где у вас может быть разная скорость для каждого кадра.

Используя Макет заголовка (всего четыре байта):

Откройте MP3 в потоке

Найдите начало заголовка первого кадра, читая, пока не найдете заголовок синхронизации, в котором 11 последовательных битов установлены в 1. Раньше это было 12, но оно было настроено для MPEG версии 2.5.

Определите идентификатор версии MPEG. В целях определения скорости передачи данных V2.5 совпадает с V2

Определить описание слоя

Читай индекс скорости передачи

Используя версию MPEG, описание уровня и индекс скорости передачи данных, определите фактическую скорость передачи данных из таблицы индекса скорости передачи данных в ссылке на связанный заголово

Разделите размер файла в килобитах ((8 * размер в байтах) / 1000) на скорость передачи в битах, чтобы получить длительность в секундах

Я не смог найти образец Delphi, но вот C # реализация который использует эту технику для справочных целей. Смотрите метод getLengthInSeconds.

Downvoted: ответ только для ссылок, если связанная статья исчезла с момента ее написания. Jules
+ 1, код для вычисления длины в секундах идентичен тому, что я нашел. J. Polfer
@ Жюль: я ценю причину отрицательного голосования, которая была действительной. Я исправил ссылку и добавил сводку необходимых шагов и ссылку на ссылку на заголовок. Bruce McGee
3

MP3 делятся на кадры, как это

Тебе нужно посчитать количество кадров

+ 1 для информации о кадрах. J. Polfer
это не так просто, как сказать. В mp3-файле много информации до начала кадров ... Tom Brito
2

форум пост. Я бы сравнил результаты с чем-то вроде winamp, чтобы убедиться, что он работает.

Точно для CBR (постоянная скорость передачи битов), вероятно, неточно для VBR (переменная скорость передачи битов). В случаях, когда требуется только приблизительное время, это хорошая иде Charlie Salts
Хотя этот метод предполагает, что вы знаете битрейт! Charlie Salts
@ Charlie Salts - Вы правы, формула не будет работать в случаях VBR, а в сообщении на форуме не указано, как определить битрейт. Ответ Брюса МакГи более полный, и я бы порекомендовал его мне. J. Polfer
2

MP3.

Это огромный взлом, но, похоже, работает.

Райан.

//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;

Похожие вопросы