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

前端之家收集整理的这篇文章主要介绍了利用Ffmpeg获得flv视频缩略图和视频时间的代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

FFmpeg的官方网址是

中文Wiki是 ,资料很多。

㈠安装FFMEPG

操作系统:centos6

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

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

下面是安装步骤:

㈠安装编译环境

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

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

rpm -Uhv

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

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

:FFMPEG-PHP

安装 FFMPEG-PHP
cd /usr/local/src
wget

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

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

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

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

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

PHP的exec函数的可以参考:

示例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:

    参数说明:

    -L license

    -h 帮助

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

    -f fmt 强迫采用格式fmt

    -I filename 输入文件

    -y 覆盖输出文件

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

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

    s wxh: 指定视频的宽和高

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

    通过上面的截图:我们可以看到输入的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,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 -s 320x240 /usr/local/apache/htdocs/test.jpg

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

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

    PHP获得视频的时间长度

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

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

    错误代码

    显示

    下面是正确的代码

    代码如下:
    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,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

    猜你在找的PHP相关文章