Add doc blocks
This commit is contained in:
parent
70f963f347
commit
4582e152df
2 changed files with 144 additions and 23 deletions
|
|
@ -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 = 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 = 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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
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();
|
||||
}
|
||||
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';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue