Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2009, 17:32   #11
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Сразу скажу для ясности, MP3 файл заголовка не имеет и состоит из фреймов. Также может содержать внутри себя ID3 теги.

Цитата:
достаточно редкий случай...
У меня полно таких файлов.
Цитата:
мне попадались и FF F3
Нет, значит это был не заголовок mp3 фрейма.
Смотрим здесь:
http://upload.wikimedia.org/wikipedi...estructure.svg
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 04.11.2009, 11:03   #12
Gerzs
Форумчанин
 
Аватар для Gerzs
 
Регистрация: 23.07.2009
Сообщений: 185
По умолчанию

Mutabor,
1. Вы показываете как найти заголовок фрейма, а как найти сам фрейм?
2. Вы показали какая структуру MPEG-1 Layer 3, а что в MPEG-2/2.5 Layer 3?
Gerzs вне форума Ответить с цитированием
Старый 04.11.2009, 11:11   #13
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Gerzs, вопрос: для чего необходимо определение что файл - mp3 (вы список составляете, плейлист в плеер, тощо...), возможно есть альтернативно более простое решение
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.11.2009, 11:15   #14
Gerzs
Форумчанин
 
Аватар для Gerzs
 
Регистрация: 23.07.2009
Сообщений: 185
По умолчанию

raxp, нет, я хочу из браузерного кэша MP3 вытащить.
Можете предложить более простое решение?

Последний раз редактировалось Gerzs; 04.11.2009 в 11:18.
Gerzs вне форума Ответить с цитированием
Старый 04.11.2009, 11:22   #15
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

гм... а они там разве не с расширением mp3 уже, хотя от сервака зависит...
...вот что спрошу еще раз, вы смотрели hex редактором начало этих файлов?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.11.2009, 11:29   #16
Gerzs
Форумчанин
 
Аватар для Gerzs
 
Регистрация: 23.07.2009
Сообщений: 185
По умолчанию

raxp, смотрел эти файлы в текстовом редакторе. В большинстве случаев ID3 тег стоит. В своей программе это и использую. Хочется использовать метод надежнее этого.
Gerzs вне форума Ответить с цитированием
Старый 04.11.2009, 15:40   #17
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Структура заголовка MPEG фрейма
Структура ID3v2 фрейма
s.Creator вне форума Ответить с цитированием
Старый 05.11.2009, 22:51   #18
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Mutabor,
1. Вы показываете как найти заголовок фрейма, а как найти сам фрейм?
2. Вы показали какая структуру MPEG-1 Layer 3, а что в MPEG-2/2.5 Layer 3?
Фрейм состоит из заголовка и блока с данными, т.е. со звуком. Файл состоит из множества таких фреймов. Если найден заголовок, то соответственно найден и фрейм.

MP3, тот к-рый популярный, и всем известный это именно MPEG-1 Layer 3, все остальное это уже не MP3.

Я находил в сети описание формата, но рекомендаций как правильно читать данные в mp3 файле мне не встречались. Так что я напишу, как я это понимаю. Вот к примеру мы прочесываем файл, первое что встречается это ID3 тег. Я не помню точно или его встраивают в другие форматы, вроде бы нет, и он для MP3 специально разработан, если это так, то с вероятностью 100% можно утверждать что это файл MP3. Но тега может и не быть, в этом случае ищем (именно ищем, он не всегда в самом начале, даже если нет тега) заголовок первого фрейма, допустим нашли, что это означает? Это означает одно из двух, либо мы нашли MP3 файл, либо это просто совпадение. Тогда нужно высчитать длину фрейма (формула есть в теме на к-рую была дана ссылка), пропустить это кол-во байт, и поискать там заголовок следующего фрейма, если там таки заголовок, то теперь можно с уверенностью сказать что это MP3.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 05.11.2009, 23:40   #19
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

ID3 встречается не только в MP3
Цитата:
ID3v2/file identifier "ID3"
ID3v2 version $04 00
ID3v2 flags %abcd0000
ID3v2 size 4 * %0xxxxxxx
Заголовок MP3 фрейма 4 байта "AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM"
Думаю для идентификации можно ограничиться 2 байтами.
Цитата:
A 11 (31-21) Frame sync (all bits must be set) все биты установлены
Цитата:
B 2 (20,19) MPEG Audio version ID
00 - MPEG Version 2.5 (later extension of MPEG 2)
01 - reserved
10 - MPEG Version 2 (ISO/IEC 13818-3)
11 - MPEG Version 1 (ISO/IEC 11172-3)
Цитата:
C 2 (18,17) Layer description
00 - reserved
01 - Layer III
10 - Layer II
11 - Layer I
Цитата:
D 1 (16) Protection bit
0 - Protected by CRC (16bit CRC follows header) 16 битная контрольная сумма после заголовка
1 - Not protected
Остальное все подробно описано в приведенных мной выше ссылках.
(Мне хватило Гугле-переводчика )
s.Creator вне форума Ответить с цитированием
Старый 10.11.2009, 11:30   #20
Gerzs
Форумчанин
 
Аватар для Gerzs
 
Регистрация: 23.07.2009
Сообщений: 185
По умолчанию

Всем спасибо за помощь!
Вот что в итоге вышло. В примере используются исходники mutabor из mp3 frame
Код:
var
  FS:TFileStream;
  buf:array of byte;
  i,Length:integer;

  function IsXBitNull(n, x: byte): boolean;
  var
    j: byte;
  begin
    j:=1;
    j:=j shl x;
    j:=j and n;
    if j = 0 then result:=true else result:=false;
  end;


  function GetBitRate(b: byte): cardinal;
  begin
    b:=b shr 4;
    case b of
      1: result:=32000;
      2: result:=40000;
      3: result:=48000;
      4: result:=56000;
      5: result:=64000;
      6: result:=80000;
      7: result:=96000;
      8: result:=112000;
      9: result:=128000;
      10: result:=160000;
      11: result:=192000;
      12: result:=224000;
      13: result:=256000;
      14: result:=320000;
    end;
  end;

  function GetSampleRate(b: byte): cardinal;
  begin
    b:=b shl 4;
    b:=b shr 6;
    case b of
      0: result:=44100;
      1: result:=48000;
      2: result:=32000;
    end;
  end;

  function GetPad(b: byte): byte;
  begin
  if IsXBitNull(b,1) then result:=0 else result:=1;
  end;

  function GetFrameSize(b: byte): cardinal;
  begin
   result:=Trunc(144*GetBitRate(b)/GetSampleRate(b)+GetPad(b));
  end;

  function CheckingTitle(pos:integer):boolean;
  begin
   result:=false;
   if ((buf[pos]=$FF) and ((buf[pos+1]=$FB) or (buf[pos+1]=$FA))) then result:=true;
  end;

  function Checking(pos:integer):boolean;
  var
    framePos:integer;

    function CheckingNextframe(pos:integer):boolean;
    var
      frameSize:integer;
    begin
     result:=false;
     frameSize:=GetFrameSize(buf[pos+2]);
     if frameSize>0 then
     begin
      framePos:=pos+frameSize;
      if CheckingTitle(framePos) then result:=true;
     end;
    end;

  begin
   result:=false;
   if not CheckingNextframe(pos) then Exit;
   if not CheckingNextframe(framePos) then Exit;
   if CheckingNextframe(framePos) then result:=true;
  end;

begin
 if MainForm.OpenDialog1.Execute then
 begin
  FS:=TFileStream.Create(MainForm.OpenDialog1.FileName, fmOpenReadWrite);
  if FS.Size<10000001 then Length:=FS.Size else Length:=10000000;
  Length:=FS.Size;
  SetLength(buf, Length);
  FS.Read(buf[0], Length);
  FS.Free;

  i:=0;
  for i:=0 to Length do
  begin
   if CheckingTitle(i) then
   begin
    if Checking(i) then
    begin
     ShowMessage(MainForm.OpenDialog1.FileName+' - '+'mp3!');
     Exit;
    end;
   end;
  end;
  ShowMessage(MainForm.OpenDialog1.FileName+' - '+'not mp3!');
 end;
end;
З.Ы. Пишите если что надо поправить

Последний раз редактировалось Gerzs; 10.11.2009 в 11:55.
Gerzs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Mp3 Lexakazanskij Мультимедиа в Delphi 7 17.06.2009 15:57
Проигрователь mp3 на c++ Palach Общие вопросы C/C++ 3 30.03.2009 20:02
mp3 krok PHP 2 29.04.2008 11:21
MediaPlayer - как сделать последовательное воспроизведение mp3 файлов (именно mp3) Kashp Компоненты Delphi 13 28.09.2007 08:38