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

Форум PHP

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

 

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

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

тема: Warning: fread(): Length parameter must be greater than 0
 
 автор: JIEXA   (23.02.2006 в 16:38)   письмо автору
 
 

Нашел class, который обрезает mp3 и уменьшает битрейт. Вот он:

<?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($fftell($f) - 1); // back up one byte 

            
$frameoffset ftell($f); 

            
$r fread($f4); 
            
// 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(03248566480961121281441601761922242560), 
                
'2' => array(0,  81624324048,  56,  64,  80,  961121281441600), 
                
'3' => array(0,  81624324048,  56,  64,  80,  961121281441600), 
                     ); 
        } else if (
$bits[12] == 0) { 
            
$bitrates = array( 
                
'1' => array(03248566480961121281441601761922242560), 
                
'2' => array(0,  81624324048,  56,  64,  80,  961121281441600), 
                
'3' => array(0,  81624324048,  56,  64,  80,  961121281441600), 
                     ); 
        } else { 
            
$bitrates = array( 
                
'1' => array(03264961281601922242562883203523844164480), 
                
'2' => array(0324856,  64,  80,  961121281601922242563203840), 
                
'3' => array(0324048,  56,  64,  80,  961121281601922242563200), 
                     ); 
        } 

        
$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 = ((filesize($this->file)) / 1000) / $this->bitrate
        
$this->length = (int)$s

        return 
true
    } 
}; 

?>


Запускается так:

<?
 
include('mp3.preview.class.php'); 
  
 
$c = new MP3_Crop(); 
  
 
$c->read('One.mp3'); # Исходная мп3
 
$c->write('Two.mp3'); # Имя будущей урезаной мп3
?>

при запуске выводит ошибку:

Warning: fread(): Length parameter must be greater than 0. in z:\home\test.ru\www\mp3.preview.class.php on line 85


Что значит эта ошибка, и как её можно исправить?

   
 
 автор: cheops   (23.02.2006 в 22:07)   письмо автору
 
   для: JIEXA   (23.02.2006 в 16:38)
 

Вы бы не могли проверить в методе write чему равно значение $this->bitrate?
<?php
  
echo $this->bitrate;
?>

PS Такие здоровые файлы лучше прикреплять в виде архива.

   
 
 автор: JIEXA   (24.02.2006 в 10:29)   письмо автору
 
   для: cheops   (23.02.2006 в 22:07)
 

Оно равно "0"(нулю). выводил значение в этом куске кода

<?
      
echo $this->bitrate;
      exit(); 
        
$size = ($length $this->bitrate 1000) / 8
?>

   
 
 автор: cheops   (24.02.2006 в 13:41)   письмо автору
 
   для: JIEXA   (24.02.2006 в 10:29)
 

Хм... а я что-то не вижу где он у вас устанавливается, выставите его в начале файла
<?php
   
var $bitrate 0// Здесь нужно поставить что-то большее нуля
?>

   
 
 автор: JIEXA   (24.02.2006 в 13:57)   письмо автору
 
   для: cheops   (24.02.2006 в 13:41)
 

Устанавливается в самом начале:

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

ща попробую выставить значение большее нуля

   
 
 автор: JIEXA   (24.02.2006 в 14:08)   письмо автору
4.9 Кб
 
   для: cheops   (24.02.2006 в 13:41)
 

Странно. выставляю значение 16, но все равно код

<?
print $this->bitrate;
?>

выводит 0

   
 
 автор: cernos   (24.02.2006 в 15:07)   письмо автору
 
   для: JIEXA   (24.02.2006 в 14:08)
 

Да, я тоже заметил это! Походу дела гдета что то недописали!

   
 
 автор: JIEXA   (25.02.2006 в 10:37)   письмо автору
 
   для: JIEXA   (24.02.2006 в 14:08)
 

подниму тему, чтобы не забыли :)

   
 
 автор: cheops   (25.02.2006 в 14:14)   письмо автору
 
   для: JIEXA   (25.02.2006 в 10:37)
 

Наверное вот этот блок подсуропил
<?php
        $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;
?>

Попробуйте проверку после этого блока поставить.

   
 
 автор: JIEXA   (25.02.2006 в 14:37)   письмо автору
 
   для: cheops   (25.02.2006 в 14:14)
 

После этого блока с кодом значение bitrate равно нулю.

   
 
 автор: Loki   (25.02.2006 в 15:13)   письмо автору
 
   для: JIEXA   (25.02.2006 в 14:37)
 

Ну тогда на каждом этапе проверяйте значение $bits, пока не найдете в какой момент оно теряется.

   
Rambler's Top100
вверх

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