From 4582e152df699d46083659dcb414aa3464f5a388 Mon Sep 17 00:00:00 2001 From: Romain Neutron Date: Fri, 13 Apr 2012 15:12:43 +0200 Subject: [PATCH] Add doc blocks --- src/FFMpeg/FFMpeg.php | 109 ++++++++++++++++++++++++++++++++++------- src/FFMpeg/FFProbe.php | 58 +++++++++++++++++++--- 2 files changed, 144 insertions(+), 23 deletions(-) diff --git a/src/FFMpeg/FFMpeg.php b/src/FFMpeg/FFMpeg.php index 9ab4b0a..d4a5a62 100644 --- a/src/FFMpeg/FFMpeg.php +++ b/src/FFMpeg/FFMpeg.php @@ -11,17 +11,31 @@ namespace FFMpeg; +use \Symfony\Component\Process\Process; + +/** + * FFMpeg driver + * + * @author Romain Neutron imprec@gmail.com + */ class FFMpeg extends Binary { protected $pathfile; + /** + * Opens a file in order to be processed + * + * @param string $pathfile + * @throws Exception\InvalidFileArgumentException + */ public function open($pathfile) { if ( ! file_exists($pathfile)) { $this->logger->addError(sprintf('Request to open %s failed', $pathfile)); - throw new \InvalidArgumentException(sprintf('File %s does not exists', $pathfile)); + + throw new Exception\InvalidFileArgumentException(sprintf('File %s does not exists', $pathfile)); } $this->logger->addInfo(sprintf('FFmpeg opens %s', $pathfile)); @@ -29,11 +43,20 @@ class FFMpeg extends Binary $this->pathfile = $pathfile; } + /** + * + * @param int $time The time in second where to take the snapshot + * @param string $output The pathfile where to write + * @param int $width The width of the image + * @param int $height The height of the image + * @return boolean True if success + * @throws Exception\RuntimeException + */ public function extractImage($time, $output, $width, $height) { if ( ! $this->pathfile) { - throw new \RuntimeException('No file open'); + throw new Exception\RuntimeException('No file open'); } $cmd = $this->binary @@ -43,19 +66,24 @@ class FFMpeg extends Binary $this->logger->addInfo(sprintf('Executing command %s', $cmd)); - $process = new \Symfony\Component\Process\Process($cmd); - $process->run(); + $process = new Process($cmd); + + try + { + $process->run(); + } + catch (\RuntimeException $e) + { + + } if ( ! $process->isSuccessful()) { $this->logger->addError(sprintf('Command failed :: %s', $process->getErrorOutput())); - if (file_exists($output) && is_writable($output)) - { - unlink($output); - } + $this->cleanupTemporaryFile($output); - throw new \RuntimeException('Failed to extract image'); + throw new Exception\RuntimeException('Failed to extract image'); } $this->logger->addInfo('Command run with success'); @@ -63,11 +91,20 @@ class FFMpeg extends Binary return true; } + /** + * Encode the file to the specified format + * + * @param Format\AudioFormat $format The output format + * @param string $outputPathfile The pathfile where to write + * @param int $threads The number of threads to use + * @return boolean True if success + * @throws Exception\RuntimeException + */ public function encode(Format\AudioFormat $format, $outputPathfile, $threads = 1) { if ( ! $this->pathfile) { - throw new \RuntimeException('No file open'); + throw new Exception\RuntimeException('No file open'); } $threads = max(min($threads, 64), 1); @@ -86,6 +123,15 @@ class FFMpeg extends Binary return false; } + /** + * Encode to audio + * + * @param Format\AudioFormat $format The output format + * @param string $outputPathfile The pathfile where to write + * @param int $threads The number of threads to use + * @return boolean True if success + * @throws Exception\RuntimeException + */ protected function encodeAudio(Format\AudioFormat $format, $outputPathfile, $threads) { $cmd = $this->binary @@ -98,17 +144,34 @@ class FFMpeg extends Binary . ' -ac 2 -ar ' . $format->getAudioSampleRate() . ' ' . escapeshellarg($outputPathfile); - $process = new \Symfony\Component\Process\Process($cmd); - $process->run(); + $process = new Process($cmd); + + try + { + $process->run(); + } + catch (\RuntimeException $e) + { + + } if ( ! $process->isSuccessful()) { - throw new \RuntimeException(sprintf('Encoding failed : %s', $process->getErrorOutput())); + throw new Exception\RuntimeException(sprintf('Encoding failed : %s', $process->getErrorOutput())); } return true; } + /** + * Encode to video + * + * @param Format\VideoFormat $format The output format + * @param string $outputPathfile The pathfile where to write + * @param int $threads The number of threads to use + * @return boolean True if success + * @throws Exception\RuntimeException + */ protected function encodeVideo(Format\VideoFormat $format, $outputPathfile, $threads) { $cmd_part1 = $this->binary @@ -138,15 +201,17 @@ class FFMpeg extends Binary $passes[] = $cmd_part1 . ' -pass 2 ' . $cmd_part2 . ' -ac 2 -ar 44100 ' . escapeshellarg($outputPathfile); + $process = null; + foreach ($passes as $pass) { - $process = new \Symfony\Component\Process\Process($pass); + $process = new Process($pass); try { $process->run(); } - catch (\Exception $e) + catch (\RuntimeException $e) { break; } @@ -156,14 +221,19 @@ class FFMpeg extends Binary $this->cleanupTemporaryFile(getcwd() . '/ffmpeg2pass-0.log'); $this->cleanupTemporaryFile(getcwd() . '/ffmpeg2pass-0.log.mbtree'); - if ($process instanceof \Symfony\Component\Process\Process && ! $process->isSuccessful()) + if ( ! $process->isSuccessful()) { - throw new \RuntimeException(sprintf('Encoding failed : %s', $process->getErrorOutput())); + throw new Exception\RuntimeException(sprintf('Encoding failed : %s', $process->getErrorOutput())); } return true; } + /** + * Removes unnecessary file + * + * @param string $pathfile + */ protected function cleanupTemporaryFile($pathfile) { if (file_exists($pathfile) && is_writable($pathfile)) @@ -172,6 +242,11 @@ class FFMpeg extends Binary } } + /** + * Return the binary name + * + * @return string + */ protected static function getBinaryName() { return 'ffmpeg'; diff --git a/src/FFMpeg/FFProbe.php b/src/FFMpeg/FFProbe.php index 78cec52..3e3389a 100644 --- a/src/FFMpeg/FFProbe.php +++ b/src/FFMpeg/FFProbe.php @@ -11,14 +11,28 @@ namespace FFMpeg; +use \Symfony\Component\Process\Process; + +/** + * FFProbe driver + * + * @author Romain Neutron imprec@gmail.com + */ class FFProbe extends Binary { + /** + * Probe the format of a given file + * + * @param string $pathfile + * @return string + * @throws Exception\InvalidFileArgumentException + */ public function probeFormat($pathfile) { if ( ! is_file($pathfile)) { - throw new \InvalidArgumentException($pathfile); + throw new Exception\InvalidFileArgumentException($pathfile); } $cmd = $this->binary . ' ' . $pathfile . ' -show_format'; @@ -26,32 +40,64 @@ class FFProbe extends Binary return $this->executeProbe($cmd); } + /** + * Probe the streams contained in a given file + * + * @param string $pathfile + * @return string + * @throws Exception\InvalidFileArgumentException + */ public function probeStreams($pathfile) { if ( ! is_file($pathfile)) { - throw new \InvalidArgumentException($pathfile); + throw new Exception\InvalidFileArgumentException($pathfile); } $cmd = $this->binary . ' ' . $pathfile . ' -show_streams'; - return $this->executeProbe($cmd); + try + { + return $this->executeProbe($cmd); + } + catch (Exception\RuntimeException $e) + { + + } } + /** + * + * @param string $command + * @return string + * @throws Exception\RuntimeException + */ protected function executeProbe($command) { - $process = new \Symfony\Component\Process\Process($command); + try + { + $process = new Process($command); - $process->run(); + $process->run(); + } + catch (\RuntimeException $e) + { + throw new Exception\RuntimeException(sprintf('Failed to run the given command %s', $command)); + } if ( ! $process->isSuccessful()) { - throw new \RuntimeException(sprintf('Failed to probe %s', $command)); + throw new Exception\RuntimeException(sprintf('Failed to probe %s', $command)); } return $process->getOutput(); } + /** + * Return the binary name + * + * @return string + */ protected static function getBinaryName() { return 'ffprobe';