Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Info remote MP3 files, id3 etc.
 
 автор: SnooPI   (26.04.2008 в 04:57)   письмо автору
 
 

Здравствуйте..
Необходимо узнать информацию MP3 файла на удаленном сервере при этом чтобы все работало на сервере мастерхост (т.е. PECL не подойдет т.к. там его не поставят)
+ Ко всему не предлагать загружать на свой сервер файл и смотреть т.к. файлов куча и пользователей..
вообщем такой вариант отпадает

   
 
 автор: SnooPI   (26.04.2008 в 07:42)   письмо автору
 
   для: SnooPI   (26.04.2008 в 04:57)
 

да и PECL битрейт не возвращает ((

   
 
 автор: sim5   (26.04.2008 в 16:00)   письмо автору
 
   для: SnooPI   (26.04.2008 в 07:42)
 

Надо заголовок mp3 файла брать и разбирать самому.

   
 
 автор: morkovkin   (26.04.2008 в 20:48)   письмо автору
 
   для: SnooPI   (26.04.2008 в 04:57)
 

Интересная задачка, тоже интересует.

   
 
 автор: sim5   (26.04.2008 в 20:50)   письмо автору
 
   для: morkovkin   (26.04.2008 в 20:48)
 

Когда-то давно рассматиривали эту тему: http://softtime.ru/forum/read.php?id_forum=1&id_theme=47304, правда не так как требуется автору, а исключительно о RIFF заголовках.

   
 
 автор: morkovkin   (26.04.2008 в 21:07)   письмо автору
 
   для: sim5   (26.04.2008 в 20:50)
 

Ну как дополнительная информация, эта тема сгодится. Но в данном случае - совершенно не поможет :) Т.к. всё равно надо искать инфу, о том, как считать заголовки у мп3 :)

   
 
 автор: sim5   (26.04.2008 в 21:20)   письмо автору
 
   для: morkovkin   (26.04.2008 в 21:07)
 

Просто надо найти полное описание заголовка(ов), а считать дело не хитрое.)

   
 
 автор: morkovkin   (27.04.2008 в 13:41)   письмо автору
 
   для: sim5   (26.04.2008 в 21:20)
 

Вот описание, но с чего начать, что-то затруднительно:
http://www.compdoc.ru/comp/audio/mpegstruct/

   
 
 автор: sim5   (27.04.2008 в 15:34)   письмо автору
 
   для: morkovkin   (27.04.2008 в 13:41)
 

К сожалению это не полное описание. Возьмите любых два mp3 файла и просмотрите их HEX-редактором. Будет видно, что сперва идет заголовок начинающийся с ID3, далее может быть информация кем создан файл и прочее. А вот заголовок фрейма может быть расположен по разному смещению, например, на двух просмотренных мною файлах, это были 400 и 1024 (в шестнадцатеричном представлении). Следовательно, в заголовке файла, нужно найти указатель на смещение заголовка фрейма, а далее считывать по этому смещению то, что вам требуется, как - тем же способом как и в примере с RIFF.
А лучше было бы найти всю информацию о заголовках.

   
 
 автор: morkovkin   (27.04.2008 в 21:04)   письмо автору
 
   для: sim5   (27.04.2008 в 15:34)
 

Посмотрел я файлики разные. Разобрался в том, что для разных версий id3v1 и id3v2 заголовки в разных местах.
Допустим для id3v1 вся информация записана в конце, занимает она всегда 128 байт.
Для id3v2 находится в начале файла, и занимает всегда по разному, т.к. информации во вторую версию можно ввести больше. Также понял, что во второй версии сначала идёт спецобозначение, а потом информация для него.

ID3    dTRCK      TENC   @  TCOP      TOPE      TCOM      COMM          TYER      2008TALB   
   Новый альбомTPE1      БьянкаTIT2      СнегWXXX       TCON      (13)Pop


Это можно разобрать на части, но у меня не получается чем-то заменить эти квадратики в тексте. Кто знает, что под этим квадратиком скрывается, чтобы эту строку можно было распарсить...

Но к сожалению, определить время и битрейт - очень сложно. Готовые библиотеки определяют, но вот смысл я пока найти не могу, как они это делают. Допустим время можно определить, зная битрейт и азмер файла. Но битрейт настолько разнообразен, и когда он в VBR, то почти все скрипты не могут вычислить битрейт правильно. От этого идут и все дальнейшие ошибки...

   
 
 автор: sim5   (28.04.2008 в 02:14)   письмо автору
 
   для: morkovkin   (27.04.2008 в 21:04)
 

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

   
 
 автор: morkovkin   (28.04.2008 в 02:30)   письмо автору
 
   для: sim5   (28.04.2008 в 02:14)
 

Не :) Просто скрипты не могут опеределить, что файл в VBR. И указывают битрейт от балды. А для каждого файла в VBR есть такой средний битрейт, который даёт правильное значение, если размер файла поделить на битрейт, то получаются секунды. А так как битрейт в VBR скриптами опеределяется вообще от балды, то и время проигрывая файла указывается неправильно.

   
 
 автор: sim5   (28.04.2008 в 02:40)   письмо автору
 
   для: morkovkin   (28.04.2008 в 02:30)
 

WinAMP вроде бы показывает битрейты каждого фрагмента, если VBR, значит проблема в том, что не верно считывается значение битрейта каждого заголовка.

   
 
 автор: waptanet   (27.04.2008 в 21:41)   письмо автору
 
   для: SnooPI   (26.04.2008 в 04:57)
 


class ID3v1x {
  var $file_name;
  var $tag;
  var $title;
  var $artist;
  var $album;
  var $year;
  var $comm;
  var $track;
  var $genre;

  function ID3v1x($inputfile) {
    $this->file_name = $inputfile;
  }

  function read_tag() {
    $file = fopen($this->file_name, "rb");
    if($file == false) {
      return false;
    }
    else {
      fseek($file, -128, SEEK_END);
      $this->tag = fgets($file, 4);
      if($this->tag == 'TAG') {
        $this->title = fgets($file, 31);
        $this->artist = fgets($file, 31);
        $this->album = fgets($file, 31);
        $this->year = fgets($file, 5);
        $this->comm = fgets($file, 29);
        $this->temp = fgets($file, 2);
        $this->track = fgets($file, 2);
        $this->track = hexdec(bin2hex($this->track));
        $this->genre = fgets($file, 2);
        $this->genre = hexdec(bin2hex($this->genre));
        $genre_list = array("Blues","ClassicRock","Country","Dance","Disco","Funk","Grunge","HipHop","Jazz",
          "Metal","NewAge","Oldies","Other","Pop","R&B","Rap","Reggae","Rock","Techno",
          "Industrial","Alternative","Ska","DeathMetal","Pranks","Soundtrack","Euro-Techno",
          "Ambient","TripHop","Vocal","Jazz-Funk","Fusion","Trance","Classical","Instrumental",
          "Acid", "House", "Game", "SoundClip", "Gospel", "Noise", "Alt.Rock", "Bass", "Soul", "Punk",
          "Space", "Meditative", "InstrumentalPop", "InstrumentalRock", "Ethnic", "Gothic", "Darkwave",
          "Techno-Industrial", "Electronic", "Pop/Folk", "Eurodance", "Dream", "SouthernRock", "Comedy",
          "Cult", "GangstaRap", "Top40", "ChristianRap", "Pop/Funk", "Jungle", "NativeAmerican", "Cabaret",
          "NewWave", "Psychedelic", "Rave", "Showtunes", "Trailer", "Lo-fi", "Tribal", "AcidPunk",
          "AcidJazz", "Polka", "Retro", "Musical", "Rock'n'Roll", "HardRock", "Folk", "Folk/Rock",
          "NationalFolk","Swing", "FastFusion", "Bebob", "Latin", "Revival", "Celtic", "BlueGrass",
          "AvantGarde", "GothicRock", "ProgressiveRock", "PsychedelicRock", "SymphonicRock",
          "SlowRock", "BigBand", "Chorus", "EasyListening", "Acoustic", "Humour", "Speech", "Chanson",
          "Opera", "ChamberMusic", "Sonata", "Symphony", "BootyBass", "Primus", "PornGroove", "Satire",
          "SlowJam", "Club", "Tango", "Samba", "Folklore", "Ballad", "PowerBallad", "RhythmicSoul",
          "Freestyle", "Duet", "PunkRock", "DrumSolo", "Euro-House", "DanceHall", "Goa", "Drum&Bass",
          "Club-House", "Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "PolskPunk", "Beat",
          "ChristianGangstaRap", "HeavyMetal", "BlackMetal", "Crossover", "ContemporaryChristian",
          "ChristianRock", "Merengue", "Salsa", "ThrashMetal","Anime","JPop","SynthPop");
        $this->genre = @$genre_list[$this->genre];
        return true;
      }
      else {
        $this->tag = 'Not found tag informations!';
        return true;
      }
    }
    fclose($file);
  }

}

//--- пример ---//

$mp3_file = "098 Yu. Antonov - Krysha Doma Tvoego.mp3";
$ID3 = new ID3v1x($mp3_file);
echo "<hr size=\"1\">";
if($ID3->read_tag() == true) {
  echo "File : $mp3_file<br>";
  echo "ID3v1 : $ID3->tag<br>";
  echo "Title : $ID3->title<br>";
  echo "Artist : $ID3->artist<br>";
  echo "Album : $ID3->album<br>";
  echo "Year : $ID3->year<br>";
  echo "Comment : $ID3->comm<br>";
  echo "Track : $ID3->track<br>";
  echo "Genre : $ID3->genre<br>";
}
else {
  echo "Error!";
}
//--- пример ---//

   
 
 автор: waptanet   (27.04.2008 в 21:54)   письмо автору
6 Кб
 
   для: SnooPI   (26.04.2008 в 04:57)
 

вот ещё класс прикрепил ...

   
 
 автор: SnooPI   (28.04.2008 в 12:41)   письмо автору
 
   для: waptanet   (27.04.2008 в 21:54)
 

Кончено все хорошо, но нужно для удаленного файла

   
 
 автор: SnooPI   (29.04.2008 в 02:30)   письмо автору
 
   для: SnooPI   (26.04.2008 в 04:57)
 

Както дохнет форум :(

   
 
 автор: sim5   (29.04.2008 в 02:33)   письмо автору
 
   для: SnooPI   (29.04.2008 в 02:30)
 

Почему? Ну как вы сможете разобрать заголовок не получив его из файла? Либо на удаленном уже готовое должно быть, или берите заголовки, по другому то ведь не получится.

   
 
 автор: morkovkin   (29.04.2008 в 17:10)   письмо автору
 
   для: SnooPI   (29.04.2008 в 02:30)
 

Если у файла прописаны id3v2, то можно считать первые 200-400кб и узнать всю инфу, кроме времени и битрейта.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования