php-ffmpeg 获取视频时长
php-ffmpeg get video duration
当我尝试使用 php-ffmpeg 包装器和 ffprobe 获取视频的持续时间时,我得到了一个巨大的对象,而不仅仅是持续时间。
$ffprobe = FFMpeg\FFProbe::create();
$ffprobe->format($this->videoFile)
->get('duration');
$this->videoFile 是 /home/admin/........./5422346433.mp4
因此它指向正确的文件并且持续时间列在
中的巨型对象中
[[-show_format-/home/admin/web/admin.simplewebevents.com/public_html/cron/649652027.mp4][1]] => Array
(
[0] => FFMpeg\FFProbe\DataMapping\Format Object
(
[properties:FFMpeg\FFProbe\DataMapping\AbstractData:private] => Array
(
[filename] => /home/admin/web/admin.simplewebevents.com/public_html/cron/649652027.mp4
[nb_streams] => 2
[nb_programs] => 0
[format_name] => mov,mp4,m4a,3gp,3g2,mj2
[format_long_name] => QuickTime / MOV
[start_time] => 0.000000
[duration] => 5736.833333
[size] => 668381267
[bit_rate] => 932056
[probe_score] => 100
[tags] => Array
(
[major_brand] => mp42
[minor_version] => 0
[compatible_brands] => mp42mp41isomavc1
[creation_time] => 2016-12-04 18:25:58
)
)
)
[1] =>
)
)
但显然 ->get('duration') 没有 return 持续时间。
我也试过
$ffprobe
->streams($this->videoFile) // extracts streams informations
->videos() // filters video streams
->first() // returns the first video stream
->get('duration');
$ffprobe
->streams($this->videoFile)
->videos()
->first()
->get('duration');
RETURNS 持续时间。所以我必须将该命令存储到一个变量中。获取持续时间的正确方法是:
$duration = $ffprobe
->streams($this->videoFile)
->videos()
->first()
->get('duration');
$file='msd.mp4';
$time = exec("$ffmpeg -i ".$file." 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//");
echo getSecondsFromHMS($time);
function getSecondsFromHMS($time) {
$timeArr = array_reverse(explode(":", $time));
$seconds = 0;
echo '<pre>';print_r($timeArr);echo '</pre>';
foreach ($timeArr as $key => $value) {
if ($key > 2)
break;
$seconds += pow(60, $key) * $value;
}
return (int)$seconds;
}
这是 return 持续时间(以秒为单位)。
在README.md中写的是这段代码:
$ffprobe = FFMpeg\FFProbe::create();
$duration = $ffprobe
->format('/path/to/video/mp4') // extracts file informations
->get('duration'); // returns the duration property
并且工作正常。
如果有人不想使用 ffmpeg-php 然后使用下面的代码
$file='http://techslides.com/demos/sample-videos/small.mp4';
$dur = shell_exec("ffmpeg -i ".$file." 2>&1");
if(preg_match("/: Invalid /", $dur)){
return false;
}
preg_match("/Duration: (.{2}):(.{2}):(.{2})/", $dur, $duration);
if(!isset($duration[1])){
return false;
}
$hours = $duration[1];
$minutes = $duration[2];
$seconds = $duration[3];
echo $seconds + ($minutes*60) + ($hours*60*60);
当我尝试使用 php-ffmpeg 包装器和 ffprobe 获取视频的持续时间时,我得到了一个巨大的对象,而不仅仅是持续时间。
$ffprobe = FFMpeg\FFProbe::create();
$ffprobe->format($this->videoFile)
->get('duration');
$this->videoFile 是 /home/admin/........./5422346433.mp4
因此它指向正确的文件并且持续时间列在
中的巨型对象中[[-show_format-/home/admin/web/admin.simplewebevents.com/public_html/cron/649652027.mp4][1]] => Array
(
[0] => FFMpeg\FFProbe\DataMapping\Format Object
(
[properties:FFMpeg\FFProbe\DataMapping\AbstractData:private] => Array
(
[filename] => /home/admin/web/admin.simplewebevents.com/public_html/cron/649652027.mp4
[nb_streams] => 2
[nb_programs] => 0
[format_name] => mov,mp4,m4a,3gp,3g2,mj2
[format_long_name] => QuickTime / MOV
[start_time] => 0.000000
[duration] => 5736.833333
[size] => 668381267
[bit_rate] => 932056
[probe_score] => 100
[tags] => Array
(
[major_brand] => mp42
[minor_version] => 0
[compatible_brands] => mp42mp41isomavc1
[creation_time] => 2016-12-04 18:25:58
)
)
)
[1] =>
)
)
但显然 ->get('duration') 没有 return 持续时间。
我也试过
$ffprobe
->streams($this->videoFile) // extracts streams informations
->videos() // filters video streams
->first() // returns the first video stream
->get('duration');
$ffprobe
->streams($this->videoFile)
->videos()
->first()
->get('duration');
RETURNS 持续时间。所以我必须将该命令存储到一个变量中。获取持续时间的正确方法是:
$duration = $ffprobe
->streams($this->videoFile)
->videos()
->first()
->get('duration');
$file='msd.mp4';
$time = exec("$ffmpeg -i ".$file." 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//");
echo getSecondsFromHMS($time);
function getSecondsFromHMS($time) {
$timeArr = array_reverse(explode(":", $time));
$seconds = 0;
echo '<pre>';print_r($timeArr);echo '</pre>';
foreach ($timeArr as $key => $value) {
if ($key > 2)
break;
$seconds += pow(60, $key) * $value;
}
return (int)$seconds;
}
这是 return 持续时间(以秒为单位)。
在README.md中写的是这段代码:
$ffprobe = FFMpeg\FFProbe::create();
$duration = $ffprobe
->format('/path/to/video/mp4') // extracts file informations
->get('duration'); // returns the duration property
并且工作正常。
如果有人不想使用 ffmpeg-php 然后使用下面的代码
$file='http://techslides.com/demos/sample-videos/small.mp4';
$dur = shell_exec("ffmpeg -i ".$file." 2>&1");
if(preg_match("/: Invalid /", $dur)){
return false;
}
preg_match("/Duration: (.{2}):(.{2}):(.{2})/", $dur, $duration);
if(!isset($duration[1])){
return false;
}
$hours = $duration[1];
$minutes = $duration[2];
$seconds = $duration[3];
echo $seconds + ($minutes*60) + ($hours*60*60);