利用Ffmpeg获得flv视频缩略图和视频时间的代码


Posted in PHP onSeptember 15, 2011

问题描述;获得flv视频的缩略图和视频时间长度

  • 谷歌了半天发现可以使用Ffmpeg获得视频的一些信息,先介绍一下FFMEPG

这里简单说一下:FFmpeg是用于录制、转换和流化音频和视频的完整解决方案,一套领先的音/视频编解码类库。官方正式版ffmpeg不支持rmvb和rm格式. 不过有很多解决方法

FFmpeg的官方网址是 http://ffmpeg.mplayerhq.hu/ 。

中文Wiki是 http://www.ffmpeg.com.cn/ ,资料很多。

㈠安装FFMEPG

操作系统:centos6

找了那么多安装FFMEPG的文章,基本上都是没有注释,需要安装那么多软件包,也不说明一下是干什么用的,纠结。。而且安装上面步骤总是出问题,最后只得寻找官网,认真的看一下,确实官方的资料很好用,以后一定要优先看官网资料。

由于FFMEPG本身就支持flv格式,也就是说目前不需要安装什么插件只需要安装FFMEPG,安装FFMEPG有两种方式:①源码包安装,这个不知道怎么回事老是报错②yum命令安装,centos这个yum是最好的命令,呵呵

下面是安装步骤:

㈠安装编译环境

#yum install -y automake autoconf libtool gcc gcc-c++

㈡安装所需程序库的RPM包到 centos

rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

安装 Install ffmpeg 等模块
yum -y install ffmpeg ffmpeg-devel

***********************************centos下面的安装已经完成!

安装php支持插件:FFMPEG-PHP

安装 FFMPEG-PHP
cd /usr/local/src
wget http://garr.dl.sourceforge.net/sourceforge/ffmpeg-php/ffmpeg-php-0.6.0.tbz2
tar jxvf ffmpeg-php-0.6.0.tbz2
cd ffmpeg-php-0.6.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-confi
make
make install

然后修改php.ini文件
vi  php.ini

在php.ini文件加上这句
extension=ffmpeg.so

然后重新启动apache
/etc/init.d/httpd restart

*******备注wget链接那个可能失效,估计是被墙了,可以在网上自己找

----------------------------------------------------------------------------------------------------------

但是我打开phpinfo并没有看到FFMPEG,不知道怎么回事,官网上面提供的安装方法是需要重新编译php来支持ffmpeg,我嫌麻烦,考虑到服务都是在centos上运行,既然centos已经可以,

那我使用php的exec函数调用liunx的shell命令不就可以了,也就是说不需要安装FFMPEG-PHP

关于php的exec函数的可以参考:php中使用exec,system等函数调用系统命令

下面是获得缩略图的常用命令:

示例1:
截取一张352x240尺寸大小的,格式为jpg的图片: 
ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg

示例2:
把视频的前30帧转换成一个Animated Gif : 
ffmpeg -i test.asf -vframes 30 -y -f gif a.gif

示例3:这个是我需要的!
在视频的第8.01秒处截取 320*240 的缩略图

ffmpeg -i test.flv -y -f mjpeg -ss 3 -t 0.001 -s 320x240 test.jpg

示例4:

把视频转换成flv文件(这个用得最多,现在Flv基本上已经成了网络视频的标准了)

ffmpeg -i source -s 320×240 -b 700k -aspect 4:3 -y -f flv dest.flv 。

其中:

  • source:是原始文件的名字,可以是mov,mpeg,avi,wmv各类格式,ffmpeg基本都支持。
  • -s wxh: 指定视频的宽和高
  • -b : 设定视频的比特率
  • -aspect: 保持视频的比率。如4:3或者16:9
  • -y : 如果目标文件存在时,直接覆盖原有的目标文件。
  • -f : 指定转换的文件格式,这里是flv格式。(其实如果不指定文件格式,ffmpeg也会按文件的后缀名来进行转换)。
  • dest: 转换的目标文件名字,并不一定需要是flv,可以是mov,mpeg以及其他的常用格式。

参数说明:

-L license

-h 帮助

-fromats 显示可用的格式,编解码的,协议的

-f fmt 强迫采用格式fmt

-I filename 输入文件

-y 覆盖输出文件

-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持

-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持

s wxh: 指定视频的宽和高

****************************************************************************

示例3:是针对flv格式的视频获得指定处的缩略图,记住 -f强制转换的格式是mjpeg因为我要获得.jpg的缩略图,网上有很多写成文章都是写成ffmpeg -i test.flv -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg 这个是错误,不可能输出.

利用Ffmpeg获得flv视频缩略图和视频时间的代码

通过上面的截图:我们可以看到输入的flv信息和输出的jpg图片信息,Duration就是本文需要的视频长度,但是我不知道如何取得这个变量

下面是PHP调用shell命令获得缩略图的代码

<?php

exec("/usr/bin/ffmpeg -i /usr/local/apache/htdocs/test.flv -y -f mjpeg -ss 3 -t 0.001 -s 320x240 /usr/local/apache/htdocs/test.jpg",$out,$status);   

print_r($status);//0是成功 1是失败

*************************************************

如果没有什么图片生成的可能原因:

①对于存储生成图片的文件夹需要有写入权限 #chomd 777 /usr/local/apache/htdocs

②在php.ini中有disable_functions禁用了php调用shell命令函数,

disable_functions = proc_open, popen,exec, system, shell_exec, passthru

解决办法:注释掉disable_functions这一项

#disable_functions = proc_open, popen,exec, system, shell_exec, passthru

或者disable_functions = (把禁言的函数除去)

保存关闭开启就可以了

③php.ini中的安全模式必须关闭 才可以调用exec函数

safe_mode = off

④图片时间截取也很重要,很有可能是无效图片或者是黑屏

建议 增加关键帧,通常第一帧为关键帧,可以使用:vframes:帧参数,舍弃微秒参数,只保留时间参数

/usr/bin/ffmpeg -i /usr/local/apache/htdocs/test.flv -y -f mjpeg -ss 3 -vframes 1 -s 320x240 /usr/local/apache/htdocs/test.jpg

****************************************************************************

上面都是解决获得缩略图的方法,我看到有人在安卓开发中利用ffmpeg获得手机里面视频的缩略图,考虑到安卓的底层是liunx,应该是通用的!下面是如何获得视频的长度,虽然Duration就是需要的视频长度,但是不知道如何去取,如果有人会,可以教一下我,跪求!

下面是使用纯PHP获得视频的时间长度:

你在网上搜一下:php获得flv视频长度

可以发现有很多结果,但是我翻了十几页发现tmd的都是复制转载的,而且全部都不能使用,不知道为什么?这个代码和诡异,大家可以把网上的代码运行一下,你会发现这个跟不是php,因为编辑器就没有显示语法高亮,没有办法我照着网上手写了一边代码,发现还是报错诡异了 。。。报错还很奇怪  ,感兴趣的可以试试,没有办法我决定搜英文资料,最后在外国网站看到了代码,拿来一试可以!哈哈哈  还是老外的东西好使啊

错误的代码:利用Ffmpeg获得flv视频缩略图和视频时间的代码

关键词没有高亮显示


下面是正确的代码:

<?php 
function BigEndian2Int($byte_word, $signed = false) { 
$int_value = 0; 
$byte_wordlen = strlen($byte_word); 
for ($i = 0; $i < $byte_wordlen; $i++) { 
$int_value += ord($byte_word{$i}) * pow(256, ($byte_wordlen - 1 - $i)); 
} 
if ($signed) { 
$sign_mask_bit = 0x80 << (8 * ($byte_wordlen - 1)); 
if ($int_value & $sign_mask_bit) { 
$int_value = 0 - ($int_value & ($sign_mask_bit - 1)); 
} 
} 
return $int_value; 
} 
//获得视频的数字时间 
function getTime($name){ 
if(!file_exists($name)){ 
return; 
} 
$flv_data_length=filesize($name); 
$fp = @fopen($name, 'rb'); 
$flv_header = fread($fp, 5); 
fseek($fp, 5, SEEK_SET); 
$frame_size_data_length =BigEndian2Int(fread($fp, 4)); 
$flv_header_frame_length = 9; 
if ($frame_size_data_length > $flv_header_frame_length) { 
fseek($fp, $frame_size_data_length - $flv_header_frame_length, SEEK_CUR); 
} 
$duration = 0; 
while ((ftell($fp) + 1) < $flv_data_length) { 
$this_tag_header = fread($fp, 16); 
$data_length = BigEndian2Int(substr($this_tag_header, 5, 3)); 
$timestamp = BigEndian2Int(substr($this_tag_header, 8, 3)); 
$next_offset = ftell($fp) - 1 + $data_length; 
if ($timestamp > $duration) { 
$duration = $timestamp; 
} 
fseek($fp, $next_offset, SEEK_SET); 
} 
fclose($fp); 
return $duration; 
} 
//转化为0:03:56的时间格式 
function fn($time){ 
$num = $time; 
$sec = intval($num/1000); 
$h = intval($sec/3600); 
$m = intval(($sec%3600)/60); 
$s = intval(($sec%60)); 
$tm = $h.':'.$m.':'.$s; 
return $tm; 
} 
$t = getTime("22.flv");//显示数字时间如236722 
echo fn($t);//显示时间格式0:03:56 
?>

预览效果:

利用Ffmpeg获得flv视频缩略图和视频时间的代码

我的视频是55秒正好!ok

PHP 相关文章推荐
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
通过php快速统计某个数据库中每张表的数据量
Sep 04 PHP
destoon安全设置中需要设置可写权限的目录及文件
Jun 21 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
PHP实现简单汉字验证码
Jul 28 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
Jan 04 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
Feb 03 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
php 根据自增id创建唯一编号类
Apr 06 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 PHP
Sorting Array Values in PHP(数组排序)
Sep 15 #PHP
PHP 图片上传代码
Sep 13 #PHP
php中json_encode中文编码问题分析
Sep 13 #PHP
PHP pathinfo()获得文件的路径、名称等信息说明
Sep 13 #PHP
PHP获取MAC地址的函数代码
Sep 11 #PHP
PHP内核介绍及扩展开发指南―基础知识
Sep 11 #PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 #PHP
You might like
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
Javascript 自定义类型方法小结
2010/03/02 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
深入koa-bodyparser原理解析
2019/01/16 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Python request post上传文件常见要点
2020/11/20 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
公司周年庆典邀请函
2014/01/12 职场文书
见习期自我鉴定
2014/01/31 职场文书
经理助理岗位职责
2014/03/05 职场文书
《故乡》教学反思
2014/04/10 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
爱晚亭导游词
2015/02/09 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
入党函调证明材料
2015/06/19 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL