Ejemplo n.º 1
0
 /**
  * Read media file information.
  *
  * @param string filename
  * @return Info
  */
 function info($filename)
 {
     $i = new Info($filename);
     $cmd = new ShellCmd($this->command);
     $cmd->addOption('-i', $filename);
     $infoText = $cmd->exec(true);
     // need to suppress errors due to ffmpeg producing error in case no output file is specified
     if (!preg_match('~Input\\s#0,\\s([^,]+)~m', $infoText, $matches1) || !preg_match('~\\s+Duration\\:\\s+(\\d{2}\\:\\d{2}\\:\\-?\\d{1,2}\\.\\d{1,2})(?:,\\s+start\\:\\s+\\d+\\.\\d+)?,\\s+bitrate\\:\\s+\\-?(\\d+|N/A)(?:\\s+kb/s)?\\s*~m', $infoText, $matches2)) {
         throw new Exception("Unable to read movie info from {$infoText}");
     }
     $i->setFormat($matches1[1]);
     $i->setDuration($matches2[1]);
     $bitrate = (int) $matches2[2];
     if (!$bitrate) {
         $bitrate = 200;
     }
     $i->setBitrate($bitrate);
     if (preg_match('~.+Audio\\:\\s+([a-zA-Z0-9\\-\\_]+),\\s+(\\d+)\\s+Hz(?:,\\s+(?:stereo|mono))(?:,\\s+[a-zA-Z0-9_\\-])?,\\s+(\\d+)\\s+kb/s~m', $infoText, $matches)) {
         $i->setHasAudio(true);
         $i->setAudioCodec($matches[1]);
         $i->setSamplingRate($matches[2]);
         $i->setAudioBitrate($matches[3]);
     }
     if (preg_match('~\\n([^\\n]+Video\\:\\s+(\\S+)[^\\n]+)\\n~m', $infoText, $matches)) {
         $videoInfo = $matches[1];
         $i->setHasVideo(true);
         $i->setVideoCodec($matches[2]);
         if (preg_match('~(\\d{2,})x(\\d+)~', $videoInfo, $matches)) {
             $i->setPixelSize($matches[1], $matches[2]);
         }
         if (preg_match('~(\\d+\\.\\d+)\\s+fps\\(r\\)~', $videoInfo, $matches)) {
             $i->setFps($matches[1]);
         }
     }
     return $i;
 }
Ejemplo n.º 2
0
 /**
  * Read media file information.
  *
  * @param string filename
  * @return Info
  */
 function info($filename)
 {
     $i = new Info($filename);
     $cmd = new ShellCmd($this->command);
     $cmd->addOption('-identify');
     $cmd->addOption('-frames', 0);
     $cmd->addOption('-ao', 'null');
     $cmd->addOption('-vo', 'null');
     $cmd->setTarget($filename);
     $infoText = $cmd->exec();
     $w = $h = 0;
     foreach (preg_split("/\r\n|\r|\n/", $infoText) as $line) {
         if (preg_match('/^ID_([^\\=]+)=(.+)$/', $line, $matches)) {
             $key = $matches[1];
             $value = $matches[2];
             if (0 === strpos($key, 'VIDEO')) {
                 $i->setHasVideo(true);
             } elseif (0 === strpos($key, 'AUDIO')) {
                 $i->setHasAudio(true);
             }
             switch ($key) {
                 case "VIDEO_WIDTH":
                     $w = (int) $value;
                     break;
                 case "VIDEO_HEIGHT":
                     $h = (int) $value;
                     break;
                 case "VIDEO_FPS":
                     $i->setFps($value);
                     break;
                 case "AUDIO_BITRATE":
                     $i->setAudioBitrate($value / 1000);
                     break;
                 case "AUDIO_RATE":
                     $i->setSamplingRate($value);
                     break;
                 case "LENGTH":
                     $i->setDuration($value);
                     break;
                 case "AUDIO_CODEC":
                     $i->setAudioCodec($value);
                     break;
                 case "VIDEO_CODEC":
                     $i->setVideoCodec($value);
                     break;
                 default:
                     break;
             }
         } elseif (preg_match('/^([^\\s]+) file format detected/', $line, $matches)) {
             $i->setFormat($matches[1]);
         }
     }
     if ($i->hasVideo()) {
         $i->setPixelSize($w, $h);
         $duration = $i->getDuration();
         if (0 == $duration) {
             // experimentally it has been found that 5 seconds will be ok here...
             $duration = 5;
         }
         $i->setBitrate(filesize($filename) / 1024 * 8 / $duration);
     }
     return $i;
 }