利用Ffmpeg获得flv视频缩略图和视频长度时间
这里简单说一下: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 。
其中:
参数说明:
-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 这个是错误,不可能输出.
通过上面的截图:我们可以看到输入的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,因为编辑器就没有显示语法高亮,没有办法我照着网上手写了一边代码,发现还是报错诡异了 。。。报错还很奇怪? ,感兴趣的可以试试,没有办法我决定搜英文资料,最后在外国网站看到了代码,拿来一试可以!哈哈哈? 还是老外的东西好使啊
错误的代码:
关键词没有高亮显示
?
下面是正确的代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566<?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
????????
?>
预览效果:
?
我的视频是55秒正好!ok
http://www.cnblogs.com/phphuaibei/archive/2011/09/09/2172589.html
?