Merge pull request #50 from alchemy-fr/ffprobe-on-uris

Allow ffprobe on remote files
This commit is contained in:
Romain Neutron 2013-08-05 09:00:08 -07:00
commit 5cbec1981b
5 changed files with 52 additions and 19 deletions

View file

@ -1,6 +1,10 @@
CHANGELOG CHANGELOG
--------- ---------
* 0.3.1 (xx-xx-2013)
* Allow use of FFProbe on remote URIs.
* 0.3.0 (07-04-2013) * 0.3.0 (07-04-2013)
* Complete rewrite of the library, lots of BC breaks, check the doc. * Complete rewrite of the library, lots of BC breaks, check the doc.

View file

@ -288,6 +288,19 @@ FFMpeg use many units for time and space coordinates.
- `FFMpeg\Coordinate\Point` represent a point. - `FFMpeg\Coordinate\Point` represent a point.
- `FFMpeg\Coordinate\TimeCode` represent a timecode. - `FFMpeg\Coordinate\TimeCode` represent a timecode.
### FFProbe
`FFMpeg\FFProbe` is used internally by `FFMpeg\FFMpeg` to probe medias. You can
also use it to extract media metadata.
```php
$ffprobe = FFMpeg\FFProbe::create();
$ffprobe
->streams('/path/to/video/mp4') // extracts streams informations
->videos() // filters video streams
->first() // returns the first video stream
->get('duration'); // returns the duration property
```
##Using with Silex Microframework ##Using with Silex Microframework

View file

@ -12,6 +12,7 @@
namespace FFMpeg; namespace FFMpeg;
use Alchemy\BinaryDriver\ConfigurationInterface; use Alchemy\BinaryDriver\ConfigurationInterface;
use Alchemy\BinaryDriver\Exception\ExecutionFailureException;
use Doctrine\Common\Cache\ArrayCache; use Doctrine\Common\Cache\ArrayCache;
use Doctrine\Common\Cache\Cache; use Doctrine\Common\Cache\Cache;
use FFMpeg\Driver\FFProbeDriver; use FFMpeg\Driver\FFProbeDriver;
@ -207,12 +208,6 @@ class FFProbe
private function probe($pathfile, $command, $type, $allowJson = true) private function probe($pathfile, $command, $type, $allowJson = true)
{ {
if (!is_file($pathfile)) {
throw new InvalidArgumentException(sprintf(
'Invalid filepath %s, unable to read.', $pathfile
));
}
$id = sprintf('%s-%s', $command, $pathfile); $id = sprintf('%s-%s', $command, $pathfile);
if ($this->cache->contains($id)) { if ($this->cache->contains($id)) {
@ -237,7 +232,11 @@ class FFProbe
$parseIsToDo = true; $parseIsToDo = true;
} }
$output = $this->ffprobe->command($commands); try {
$output = $this->ffprobe->command($commands);
} catch (ExecutionFailureException $e) {
throw new RuntimeException(sprintf('Unable to probe %s', $pathfile), $e->getCode(), $e);
}
if ($parseIsToDo) { if ($parseIsToDo) {
$data = $this->parser->parse($type, $output); $data = $this->parser->parse($type, $output);

View file

@ -0,0 +1,29 @@
<?php
namespace FFMpeg\Functional;
use FFMpeg\FFProbe;
class FFProbeTest extends FunctionalTestCase
{
public function testProbeOnFile()
{
$ffprobe = FFProbe::create();
$this->assertGreaterThan(0, count($ffprobe->streams(__DIR__ . '/../../files/Audio.mp3')));
}
/**
* @expectedException FFMpeg\Exception\RuntimeException
*/
public function testProbeOnUnexistantFile()
{
$ffprobe = FFProbe::create();
$ffprobe->streams('/path/to/no/file');
}
public function testProbeOnRemoteFile()
{
$ffprobe = FFProbe::create();
$this->assertGreaterThan(0, count($ffprobe->streams('http://video-js.zencoder.com/oceans-clip.mp4')));
}
}

View file

@ -228,18 +228,6 @@ class FFProbeTest extends TestCase
$this->assertEquals($output, call_user_func(array($ffprobe, $method), $pathfile)); $this->assertEquals($output, call_user_func(array($ffprobe, $method), $pathfile));
} }
/**
* @expectedException FFMpeg\Exception\InvalidArgumentException
* @dataProvider provideProbeMethod
*/
public function testProbeWithInvalidFile($method)
{
$pathfile = '/path/to/nofile';
$ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
call_user_func(array($ffprobe, $method), $pathfile);
}
public function provideProbeMethod() public function provideProbeMethod()
{ {
return array( return array(