您的位置:首页 > 编程语言 > PHP开发

PHP如何获得flv视频缩略图和视频时间

2011-09-13 17:02 567 查看
问题描述;获得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 这个是错误,不可能输出.





通过上面的截图:我们可以看到输入的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

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

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

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

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

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

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

错误的代码:



关键词没有高亮显示

下面是正确的代码:

01
<?php
02
03
function
BigEndian2Int(
$byte_word
,
$signed
=
false) {
04
05
$int_value
=
0;
06
$byte_wordlen
=
strlen
(
$byte_word
);
07
08
for
(
$i
=
0;
$i
<
$byte_wordlen
;
$i
++)
{
09
$int_value
+=
ord(
$byte_word
{
$i
})
* pow(256,(
$byte_wordlen
-
1 -
$i
));
10
}
11
12
if
(
$signed
)
{
13
$sign_mask_bit
=
0x80 <<(8 * (
$byte_wordlen
-
1));
14
if
(
$int_value
&
$sign_mask_bit
)
{
15
$int_value
=
0 -(
$int_value
&
(
$sign_mask_bit
-
1));
16
}
17
}
18
19
return
$int_value
;
20
}
21
22
//获得视频的数字时间
23
function
getTime(
$name
){
24
if
(!
file_exists
(
$name
)){
25
return
;
26
}
27
$flv_data_length
=
filesize
(
$name
);
28
$fp
=
@
fopen
(
$name
,
'rb'
);
29
$flv_header
=
fread
(
$fp
,
5);
30
fseek
(
$fp
,
5,SEEK_SET);
31
$frame_size_data_length
=BigEndian2Int(
fread
(
$fp
,
4));
32
$flv_header_frame_length
=
9;
33
if
(
$frame_size_data_length
>
$flv_header_frame_length
)
{
34
   
fseek
(
$fp
,
$frame_size_data_length
-
$flv_header_frame_length
,
SEEK_CUR);
35
}
36
$duration
=
0;
37
while
((
ftell
(
$fp
)
+1) <
$flv_data_length
)
{
38
 
$this_tag_header
=
fread
(
$fp
,
16);
39
 
$data_length
=
BigEndian2Int(
substr
(
$this_tag_header
,
5,3));
40
 
$timestamp
=
BigEndian2Int(
substr
(
$this_tag_header
,
8,3));
41
 
$next_offset
=
ftell
(
$fp
)
-1 +
$data_length
;
42
 
if
(
$timestamp
>
$duration
)
{
43
  
$duration
=
$timestamp
;
44
 
}
45
46
 
fseek
(
$fp
,
$next_offset
,
SEEK_SET);
47
}
48
49
fclose(
$fp
);
50
return
$duration
;
51
}
52
//转化为0:03:56的时间格式
53
function
fn(
$time
){
54
$num
=
$time
;
55
$sec
=
intval
(
$num
/1000);
56
$h
=
intval
(
$sec
/3600);
57
$m
=
intval
((
$sec
%3600)/60);
58
$s
=
intval
((
$sec
%60));
59
$tm
=
$h
.
':'
.
$m
.
':'
.
$s
;
60
return
$tm
;
61
 
62
}
63
64
 
$t
=
getTime(
"22.flv"
);
//显示数字时间如236722
65
echo
fn(
$t
);
//显示时间格式0:03:56
66
?>
预览效果:





我的视频是55秒正好!ok



本文 由PHP淮北 撰写,欢迎转载,演绎,但是必须保留本文的署名 PHP淮北(包含链接),且不得用于商业目的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  flv php centos header byte fp