Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Вниз

Как узнать длительность времени mp3?   Найти похожие ветки 

 
Shrek   (2003-01-05 20:32) [0]

Как узнать длительность времени mp3?
Есть у меня один способ но слишком маразматичен.


 
Kair   (2003-01-06 09:34) [1]

У меня тоже есть слишком маразматичный способ.
Раскажи о своём. Может мой способ ещё более маразматичный.


 
Дмитрий К.К.   (2003-01-06 13:35) [2]

А MediaPlayer не поможет? ;)


 
Kair   (2003-01-06 13:39) [3]

>Дмитрий К.К. © (06.01.03 13:35)
>А MediaPlayer не поможет? ;)

MediaPlayer1.Length что-ли?


 
Mihey   (2003-01-06 22:34) [4]

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


 
Дмитрий К.К.   (2003-01-08 07:30) [5]


> Kair (06.01.03 13:39)
> MediaPlayer1.Length что-ли?


А тя ето сильно смущает?


 
Shrek   (2003-01-09 22:21) [6]

на то шоб загрузить файл в MediaPlayer1 уходить время, с одним файлом нет проблем но если список из 200 файлов юзера это нервирует, надо побыстрие, вот допустим винамп, это делает без проблем.


 
Mihey   (2003-01-09 22:43) [7]

Хех, так интересно, в заголовочной части файла есть информация о длительности???


 
Shrek   (2003-01-09 22:54) [8]

я такого не писал:

вот што там:
TId3v1Tag = packed record
Identifier: array[0..2] of Char;
SongName: array[1..30] of Char;
Artist: array[1..30] of Char;
Album: array[1..30] of Char;
Year: array[0..3] of Char;
Comment: array[1..30] of Char;
Genre: TGenre;
end;


 
Дмитрий К.К.   (2003-01-10 06:32) [9]

Дык тогда дели размер файла на битрэйт. Будет те продолжительность.


 
nejest   (2003-01-10 15:32) [10]

>Дмитрий К.К. © (10.01.03 06:32)
>Дык тогда дели размер файла на битрэйт. Будет те >продолжительность.

бывают файлы с переменным битрейтом, и этот способ для них не подходит, и вроде в ID3v1 тэгах битрейт не фигурирует. Этот способ не всегда будет работать


 
Shrek   (2003-01-10 18:03) [11]

икал компонент ActiveMP3 только для бейсика и есть, а для делфи нету, может кто подскажет линк, или может кинуть.


 
Mihey   (2003-01-10 21:26) [12]

ActiveMP3 - это ActiveX, он работает на VB точно так же, как и на Delphi. Если не найдёшь - сообщи, я тебе перешлю.


 
Shrek   (2003-01-11 01:54) [13]

как используя ActiveMP3 достать хоть какуюто длину mp3?


 
Mihey   (2003-01-11 18:26) [14]

Метод GetLength - возвращает в миллисекундах.


 
99   (2003-01-12 06:29) [15]

мой совет- воспользуйся библиотекой bass.
если возникнут по ней вопросы-помогу (очень просто,быстро определить время звучания). А делить длинну на битрейт- глупо- а если битрейт переменный?


 
Mihey   (2003-01-12 17:29) [16]


> если возникнут по ней вопросы-помогу (очень просто,быстро
> определить время звучания).

Bass - это действительно хороший плеер. Только у него слишком разобранный интерфейс, а потому придётся вычислять длину из количества фреймов, хотя это и очень просто. Там есть неплохой пример (имею ввиду заголовочник к Bass - TBassPlayer).


 
99   (2003-01-13 06:41) [17]

вычисление длинны в секундах с помощью bass занимает 5 строк.


 
Дмитрий К.К.   (2003-01-13 06:59) [18]


> 99 (12.01.03 06:29)
> мой совет- воспользуйся библиотекой bass.
> если возникнут по ней вопросы-помогу (очень просто,быстро
> определить время звучания). А делить длинну на битрейт-
> глупо- а если битрейт переменный?


Я подсказал самое простое решение. Знаю про переменность битрэйта. А каков процент таких файлов от общего количества ты знаешь, умник?

З.Ы. Басс, кстати, стал платным. Эт те на будущее.


 
99   (2003-01-14 06:41) [19]

у меня 30% мр3 - с переменным битрейтом, ну а чтобы узнать длину мр3 не обязательно платить сумашедшие деньги. Кстати, умник, я неделю назад скачал новую версию bass совсем бесплатно.


 
Shrek   (2003-01-15 13:32) [20]

спасибо всем за заботу. я не могу использовать никаких библиотек и програм, это должно быть програмно. Это наверное реальный способ GetLength.


 
Garrett   (2003-01-16 16:58) [21]

как известно, mp3-файл состоит из фреймов, каждый фрейм имеет два байта заголовочной информации (хотя, может, и больше, я точно не помню), которая содержит, в частности битрейт именно этого фрейма и частоту дискретизации. таким образом зная длину фрейма, битрейт и частоту дискретизации легко рассчитать длительность звучания фрейма.
Далее два способа - умножать длительность первого фрейма на их количество, либо же у каждого фрейма вычислять длительность и сложить длительности всех фреймов.


 
Garrett   (2003-01-18 03:06) [22]

Вот функция, разбирающая заголовок mp3-фрейма (длительность в секундах не считает, думаю, сможете рассчитать самостоятельно):


//Маски для определения полей в MP3 файле
VerMask = 1572864; //Версия MPEG 1, 2 или 2.5
LayMask = 393216; //Версия слоя 1, 2 или 3
CRCMask = 65536; //Есть ли CRC
BitMask = 61440; //kbps
SmpMask = 3072; //SampleRate
PadMask = 512; //Padding
PrvMask = 256; //Private
ModMask = 192; //Mode
MexMask = 48; //Mode extension
CopMask = 8; //Copyrighted
OrgMask = 4; //Original
EmpMask = 3; //Emphasis

TMPEGBitRates : Array [1..4, 1..14] of Word = (
(32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384),
(32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320),
(32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256),
(8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160));

type
TMPEGAudioFormat = record
Version : Byte; // Версия MPEG
Layer : Byte; // Номер лэйера
Bitrate : Word; // Битность - параметр кодирования
SampleRate : Word; // Частота дискретизации
Mode : Byte; // Канальность
ModeEx : Byte; // Доп. информация о режиме
Emphasis : Byte; // Параметр кодирования ??
Padding : Boolean; // Выравнивание
FPrivate : Boolean; //
FCopyright : Boolean; // Права
FOriginal : Boolean; // Оригинальность
FCRC : Boolean; // Есть ли CRC
Offset : DWord; // Адрес первого байта фрейма
Size : Word; // Размер фрейма включая заголовок и CRC
end;

function SC_ConvertMP3Format (W : DWord): TMPEGAudioFormat;
var X : Integer;
begin
With Result do
begin
//Read values
Version := (W and VerMask) div 524288;
Layer := (W and LayMask) div 131072;
FCRC := ((W and CRCMask) div 32768) = 0;
BitRate := (W and BitMask) div 4096;
SampleRate := (W and SmpMask) div 1024;
Padding := (W and PadMask) <> 0;
FPrivate := (W and PrvMask) <> 0;
Mode := (W and ModMask) div 64;
ModeEx := (W and MexMask) div 16;
FCopyright := (W and CopMask) <> 0;
FOriginal := (W and OrgMask) <> 0;
Emphasis := W and EmpMask;
//Convert values
Case Version of
0 : Version := 3;
2 : Version := 2;
3 : Version := 1;
else Version := 0;
end;
Layer := 4 -Layer;
If BitRate = 15 then Exit;
If BitRate = 0 then Exit;
If (Version = 1) and (Layer = 1) then BitRate := 32 +16*BitRate
else
begin
X := 4;
If (Version =1) and (Layer =2) then X := 1;
If (Version =1) and (Layer =3) then X := 2;
If (Version >1) and (Layer =1) then X := 3;
BitRate := TMPEGBitRates[X, BitRate];
end;
Case Version of
1 : Case SampleRate of
0 : SampleRate := 44100;
1 : SampleRate := 48000;
2 : SampleRate := 32000;
else Exit;
end;
2 : Case SampleRate of
0 : SampleRate := 22025;
1 : SampleRate := 24000;
2 : SampleRate := 16000;
else Exit;
end;
3 : Case SampleRate of
0 : SampleRate := 11025;
1 : SampleRate := 12000;
2 : SampleRate := 8000;
else Exit;
end;
else Exit;
end;
If Layer = 1 then
begin
Size := ((12000*Bitrate) div SampleRate +Integer(Padding))*4;
end
else
begin
Size := (144000*Bitrate) div SampleRate + Integer (Padding);

end;
end;
end;



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.007 c
1-54646
OlegM
2003-04-08 09:47
2003.04.17
Как картинку сохранить в текстовый файл


1-54703
Z_man7777
2003-04-04 07:50
2003.04.17
Как из БД InterBase 6.x картинку затолкать в TImageList?


3-54416
Z_man7777
2003-04-01 08:47
2003.04.17
Есть вопросик по InterBase 6.x


6-54781
Malamba
2003-02-21 09:59
2003.04.17
запуск команд операционной системы из своей проги


3-54479
Gonzalez
2003-03-30 10:58
2003.04.17
Many-to-many





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский