php 调用ffmpeg获取视频信息的简单实现


Posted in PHP onApril 03, 2017

ffmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,包含了libavcodec,保证高可移值性和编解码质量。

本文将介绍使用php调用ffmpeg获取视频信息,调用ffmpeg首先需要服务器上安装了ffmpeg,安装方法很简单,可自行搜索。

代码如下:

<?php
// 定义ffmpeg路径及命令常量
define('FFMPEG_CMD', '/usr/local/bin/ffmpeg -i "%s" 2>&1');

/**
 * 使用ffmpeg获取视频信息
 * @param String $file 视频文件
 * @return Array
 */
function getVideoInfo($file){
 ob_start();
 passthru(sprintf(FFMPEG_CMD, $file));
 $video_info = ob_get_contents();
 ob_end_clean();

 // 使用输出缓冲,获取ffmpeg所有输出内容
 $ret = array();

 // Duration: 00:33:42.64, start: 0.000000, bitrate: 152 kb/s
 if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $video_info, $matches)){
  $ret['duration'] = $matches[1]; // 视频长度
  $duration = explode(':', $matches[1]);
  $ret['seconds'] = $duration[0]*3600 + $duration[1]*60 + $duration[2]; // 转为秒数
  $ret['start'] = $matches[2]; // 开始时间
  $ret['bitrate'] = $matches[3]; // bitrate 码率 单位kb
 }

 // Stream #0:1: Video: rv20 (RV20 / 0x30325652), yuv420p, 352x288, 117 kb/s, 15 fps, 15 tbr, 1k tbn, 1k tbc
 if(preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $video_info, $matches)){
  $ret['vcodec'] = $matches[1];  // 编码格式
  $ret['vformat'] = $matches[2]; // 视频格式
  $ret['resolution'] = $matches[3]; // 分辨率
  list($width, $height) = explode('x', $matches[3]);
  $ret['width'] = $width;
  $ret['height'] = $height;
 }

 // Stream #0:0: Audio: cook (cook / 0x6B6F6F63), 22050 Hz, stereo, fltp, 32 kb/s
 if(preg_match("/Audio: (.*), (\d*) Hz/", $video_info, $matches)){
  $ret['acodec'] = $matches[1];  // 音频编码
  $ret['asamplerate'] = $matches[2]; // 音频采样频率
 }

 if(isset($ret['seconds']) && isset($ret['start'])){
  $ret['play_time'] = $ret['seconds'] + $ret['start']; // 实际播放时间
 }

 $ret['size'] = filesize($file); // 视频文件大小
 $video_info = iconv('gbk','utf8', $video_info);
 return array($ret, $video_info);

}

// 输出视频信息
$video_info = getVideoInfo('myvideo.avi');
print_r($video_info[0]);
?>

输出:

Array
(
 [duration] => 00:33:42.64
 [seconds] => 2022.64
 [start] => 0.000000
 [bitrate] => 152
 [vcodec] => rv20 (RV20 / 0x30325652)
 [vformat] => yuv420p
 [resolution] => 352x288
 [width] => 352
 [height] => 288
 [acodec] => cook (cook / 0x6B6F6F63)
 [asamplerate] => 22050
 [play_time] => 2022.64
 [size] => 38630744
)

以上这篇php 调用ffmpeg获取视频信息的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
剖析 PHP 中的输出缓冲
Dec 21 PHP
php xml实例 留言本
Mar 20 PHP
php中计算时间差的几种方法
Dec 31 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
php实现模拟post请求用法实例
Jul 11 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
PHP对象、模式与实践之高级特性分析
Dec 08 PHP
YII框架中搜索分页jQuery写法详解
Dec 19 PHP
Laravel框架路由管理简单示例
May 07 PHP
php实现快速对二维数组某一列进行组装的方法小结
Dec 04 PHP
PHP中多字节字符串操作实例详解
Aug 23 PHP
php文件包含目录配置open_basedir的使用与性能详解
Apr 03 #PHP
thinkphp关于简单的权限判定方法
Apr 03 #PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
Apr 01 #PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 #PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 #PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 #PHP
PHP房贷计算器实例代码,等额本息,等额本金
Apr 01 #PHP
You might like
php长字符串定义方法
2012/07/12 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
2013/11/28 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
javascript 单例模式详解及简单实例
2017/02/14 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
举例讲解Python中is和id的用法
2015/04/03 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
国际会议邀请函范文
2014/01/16 职场文书
吨的认识教学反思
2014/04/27 职场文书
教师演讲稿开场白
2014/08/25 职场文书
行政文员岗位职责
2015/02/04 职场文书
中标通知书范本
2015/04/17 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
协议书格式模板
2016/03/24 职场文书
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python