Реально ли "на лету" создать предпрослушивание mp3 файла?

  • Автор темы Guest111
  • Дата начала

Guest111

Guest
Реально ли "на лету" создать предпрослушивание mp3 файла?

подскажите можно ли на лету создать предпрослушивание мп3 файла..?
если да, то куда идти, что читать..?
 

Guest111

Guest
но по каким хотя бы словам искать? искал по "mp3", "на лету"
абсолютно ни к чему не привело:(
если можете как-нибудь уточните где и как я могу найти это...
 

SiMM

Новичок
Ну до чего же надо быть ленивым... тут и поиска-то не нужно. Нужно всего-то зайти в раздел Вопрос-Ответ.
 

Нечто

Психолог РНРClub
lol
После портала "мейлру" и портала знакомств человек решил сделать mp3 архив =)
 

Guest111

Guest
Нечто
ну а че, остальное ведь уже готово ;)

лан не будем здесь флэйм распускать, ещё такой вопрос по теме. Как обрезать первые 20-30 секунд этой сгенерированной превьюшки?
хотя сгенерированной думаю не получится, может через lame можно сгенерировать начальный кусок?
 

Groove

Новичок
Может быть не самый корректный вариант, но все-таки:
1) ты можешь считать из mp3 длину трека?
2) можешь измерить объем файла оригинала?
3) можешь рассчитать сколько тебе надо отрезать в килобайтах из этой пропорции?
4) можешь прочитать из оригинала сколько тебе надо и сохранить в другой файл?

Я сперва это сделал в командере - разбить файл на части, проиграл первую часть - то, что надо! Файл не битый, играет ровно 20 секунд, хотя и не совсем корректно обрезал наверное...
Ну а на пхп вообще не составляет сложно все это повторить...

Удачи!
 

Guest111

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

Скажи, зачем считать длину трека?
Не понятно про какую ты пропорцию говоришь? Мне надо первые 30 сек?
Или ты имеешь ввиду соотношение какого-то кол-ва байт приходящихся на секунду в зависимости от качества?

я пробовал несколько попыток подобного среза ни одна не заработала:)
 

Groove

Новичок
Автор оригинала: Guest111
Groove
погоди расскажи подробнее сколько именно байт отрезать нужно? как это рассчитать?
Вот смотри, у меня знакомый из ID3 класса переписал
извините что тут все выкладываю...
PHP:
<?php

class MP3_Crop {

    /**
    * mp3/mpeg file name
    * @var boolean
    */
    var $file = false;      

    /**
    * version of bitrate
    * @var integer
    */        
    var $bitrate = 0;
    var $layer;
    
    /**
    * Bytes in file 
    * @var integer
    */

    var $filesize = -1;
    /**
    * Byte at which the first mpeg header was found
    * @var integer
    */                            
    
    var $frameoffset = -1;
    /**
    * length of mp3 format hh:ss
    * @var string
    */

    /**
    * length of mp3 in seconds
    * @var string
    */                            
    var $length = false;


    /*
     * creates a new id3 object
     * and loads a tag from a file.
     *
     */
    function MP3_Crop()
    {
    }

    /**
    * reads the given file and parse it
    *
    * @param    string  $file the name of the file to parse
    * @return   mixed   PEAR_Error on error
    * @access   public
    */
    function read($file)
    {
        $this->file = $file;

        return $this->_readframe();
    }


    /**
     * update the id3v1 tags on the file.
     * Note: If/when ID3v2 is implemented this method will probably get another
     *       parameters.
     *     
     * @param boolean $v1   if true update/create an id3v1 tag on the file. (defaults to true)
     * 
     * @access public
     */
    function write($cropFile, $length = 20)
    {
        $size = ($length * $this->bitrate * 1000) / 8;
        
        $f = fopen($this->file, 'rb');
        if (!$f)
        {
            return false;
        }

        $content = fread($f, $size);
        fclose($f);

        $f = fopen($cropFile, 'wb');
        if (!$f)
        {
            return false;
        }
        
        fwrite($f, $content);
        fclose($f);

        return true;
    }


    /**
    * reads a frame from the file
    *
    * @return mixed PEAR_Error when fails
    * @access private
    */
    function _readframe()
    {
        $file = $this->file;

        if (! ($f = fopen($file, 'rb')) )
        {
            return false;
        }

        $this->filesize = filesize($file);

        do
        {
            while (fread($f,1) != Chr(255))
            { 
                // Find the first frame
                if (feof($f))
                {
                    return false;
                }
            }
            fseek($f, ftell($f) - 1); // back up one byte

            $frameoffset = ftell($f);

            $r = fread($f, 4);
            // Binary to Hex to a binary sting. ugly but best I can think of.
            $bits = unpack('H*bits', $r);
            $bits =  base_convert($bits['bits'],16,2);
        
        } while (!$bits[8] and !$bits[9] and !$bits[10]); // 1st 8 bits true from the while

        $this->frameoffset = $frameoffset;

        fclose($f);

        if ($bits[11] == 0) {
            $bitrates = array(
                '1' => array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0),
                '2' => array(0,  8, 16, 24, 32, 40, 48,  56,  64,  80,  96, 112, 128, 144, 160, 0),
                '3' => array(0,  8, 16, 24, 32, 40, 48,  56,  64,  80,  96, 112, 128, 144, 160, 0),
                     );
        } else if ($bits[12] == 0) {
            $bitrates = array(
                '1' => array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0),
                '2' => array(0,  8, 16, 24, 32, 40, 48,  56,  64,  80,  96, 112, 128, 144, 160, 0),
                '3' => array(0,  8, 16, 24, 32, 40, 48,  56,  64,  80,  96, 112, 128, 144, 160, 0),
                     );
        } else {
            $bitrates = array(
                '1' => array(0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0),
                '2' => array(0, 32, 48, 56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384, 0),
                '3' => array(0, 32, 40, 48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 0),
                     );
        }

        $layer = array(
            array(0,3),
            array(2,1),
                  );
        $this->layer = $layer[$bits[13]][$bits[14]];

        $bitrate = 0;
        if ($bits[16] == 1) $bitrate += 8;
        if ($bits[17] == 1) $bitrate += 4;
        if ($bits[18] == 1) $bitrate += 2;
        if ($bits[19] == 1) $bitrate += 1;
        $this->bitrate = $bitrates[$this->layer][$bitrate];

        if ($this->bitrate == 0)
        {
            $this->length = -1;
            return false;
        }

        $s = ((8 * filesize($this->file)) / 1000) / $this->bitrate;
        $this->length = (int)$s;

        return true;
    }
};

?>
Используется так:
PHP:
<?
 
 include('mp3crop.php');
 
 $c = new MP3_Crop();
 
 $c->read('One.mp3');
 $c->write('Two.mp3');
 
?>
Я проверял, вроде бы корректно отрезает, музон льется... :D

-~{}~ 07.06.05 12:17:

Да, забыл сказать еще: если заполнен тэг ID3v2 тогда режет не ровно 20, с погрешностью +-.
Ну да это мелочи, главное в принципе работает...
 

AltOFF

Новичок
Скрипт рабочий, спасибо! Но как сделать так что бы он вырезал не первые 20 секунд а начиная с 1 минуты или со 2 ??
 

boombick

boombick.org
Но как сделать так что бы он вырезал не первые 20 секунд а начиная с 1 минуты или со 2 ??
Вспомнить математику (ну или с нуля выучить), почитать книжку про PHP и внимательно прочитать вышеприведенный код.
 
Сверху