| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-13 14:34:53 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |  * This file is part of PHP-FFmpeg. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * (c) Alchemy <info@alchemy.fr> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * For the full copyright and license information, please view the LICENSE | 
					
						
							|  |  |  |  * file that was distributed with this source code. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  | namespace FFMpeg; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  | use FFMpeg\Exception\InvalidArgumentException; | 
					
						
							|  |  |  | use FFMpeg\Exception\RuntimeException; | 
					
						
							|  |  |  | use Symfony\Component\Process\Process; | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  | use Symfony\Component\Process\ProcessBuilder; | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * FFProbe driver | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @author Romain Neutron imprec@gmail.com | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  | class FFProbe extends Binary | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Probe the format of a given file | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2012-05-31 16:16:35 +02:00
										 |  |  |      * @param  string $pathfile | 
					
						
							|  |  |  |      * @return string A Json object containing the key/values of the probe output | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |      * @throws InvalidArgumentException | 
					
						
							|  |  |  |      * @throws RuntimeException | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |     public function probeFormat($pathfile) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-05-11 00:30:02 +02:00
										 |  |  |         if ( ! is_file($pathfile)) { | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |             throw new InvalidArgumentException($pathfile); | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |         $builder = ProcessBuilder::create(array( | 
					
						
							|  |  |  |             $this->binary, $pathfile, '-show_format' | 
					
						
							|  |  |  |         )); | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |         $output = $this->executeProbe($builder->getProcess()); | 
					
						
							| 
									
										
										
										
											2012-05-31 15:54:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $ret = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (explode("\n", $output) as $line) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (in_array($line, array('[FORMAT]', '[/FORMAT]'))) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $chunks = explode('=', $line); | 
					
						
							|  |  |  |             $key = array_shift($chunks); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ('' === trim($key)) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $value = trim(implode('=', $chunks)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (ctype_digit($value)) { | 
					
						
							|  |  |  |                 $value = (int) $value; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $ret[$key] = $value; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return json_encode($ret); | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Probe the streams contained in a given file | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2012-05-31 16:16:35 +02:00
										 |  |  |      * @param  string $pathfile | 
					
						
							|  |  |  |      * @return array  An array of streams array | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |      * @throws InvalidArgumentException | 
					
						
							|  |  |  |      * @throws RuntimeException | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |     public function probeStreams($pathfile) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-05-11 00:30:02 +02:00
										 |  |  |         if ( ! is_file($pathfile)) { | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |             throw new InvalidArgumentException($pathfile); | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |         $builder = ProcessBuilder::create(array( | 
					
						
							|  |  |  |             $this->binary, $pathfile, '-show_streams' | 
					
						
							|  |  |  |         )); | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |         $output = explode("\n", $this->executeProbe($builder->getProcess())); | 
					
						
							| 
									
										
										
										
											2012-05-28 19:46:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $ret = array(); | 
					
						
							|  |  |  |         $n = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($output as $line) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-31 15:54:28 +02:00
										 |  |  |             if ($line == '[STREAM]') { | 
					
						
							| 
									
										
										
										
											2012-05-28 19:46:49 +02:00
										 |  |  |                 $n ++; | 
					
						
							|  |  |  |                 $ret[$n] = array(); | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2012-05-31 15:54:28 +02:00
										 |  |  |             if ($line == '[/STREAM]') { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $chunks = explode('=', $line); | 
					
						
							|  |  |  |             $key = array_shift($chunks); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ('' === trim($key)) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $value = trim(implode('=', $chunks)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (ctype_digit($value)) { | 
					
						
							|  |  |  |                 $value = (int) $value; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2012-05-28 19:46:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-31 15:54:28 +02:00
										 |  |  |             $ret[$n][$key] = $value; | 
					
						
							| 
									
										
										
										
											2012-05-28 19:46:49 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-05-30 12:23:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-31 15:54:28 +02:00
										 |  |  |         return json_encode(array_values($ret)); | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |      * @param  Process          $process | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |      * @return string | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |      * @throws RuntimeException | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |     protected function executeProbe(Process $process) | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |         $this->logger->addInfo(sprintf('FFprobe executes command %s', $process->getCommandline())); | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-11 00:30:02 +02:00
										 |  |  |         try { | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |             $process->run(); | 
					
						
							| 
									
										
										
										
											2012-05-11 00:30:02 +02:00
										 |  |  |         } catch (\RuntimeException $e) { | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |             $this->logger->addInfo('FFprobe command failed'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |             throw new RuntimeException(sprintf('Failed to run the given command %s', $process->getCommandline())); | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-11 00:30:02 +02:00
										 |  |  |         if ( ! $process->isSuccessful()) { | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |             $this->logger->addInfo('FFprobe command failed'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-08 14:20:59 +02:00
										 |  |  |             throw new RuntimeException(sprintf('Failed to probe %s', $process->getCommandline())); | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |         $this->logger->addInfo('FFprobe command successful'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |         return $process->getOutput(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2012-05-25 16:21:16 +02:00
										 |  |  |      * {@inheritdoc} | 
					
						
							| 
									
										
										
										
											2012-04-13 15:12:43 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |     protected static function getBinaryName() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-05-11 00:30:02 +02:00
										 |  |  |         return array('avprobe', 'ffprobe'); | 
					
						
							| 
									
										
										
										
											2012-04-13 10:20:54 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } |