zoukankan      html  css  js  c++  java
  • PHP如何获得flv视频缩略图和视频时间

    问题描述;获得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 这个是错误,不可能输出.

    wps_clip_image-30884

    通过上面的截图:我们可以看到输入的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,因为编辑器就没有显示语法高亮,没有办法我照着网上手写了一边代码,发现还是报错诡异了 。。。报错还很奇怪  ,感兴趣的可以试试,没有办法我决定搜英文资料,最后在外国网站看到了代码,拿来一试可以!哈哈哈  还是老外的东西好使啊

    错误的代码:wps_clip_image-988

    关键词没有高亮显示


    下面是正确的代码:

    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         ?>

    预览效果:

    wps_clip_image-31828

    我的视频是55秒正好!ok

    知识共享许可协议本文 由PHP淮北 撰写,欢迎转载,演绎,但是必须保留本文的署名 PHP淮北(包含链接),且不得用于商业目的
  • 相关阅读:
    Python机器学习(五十一)SciPy 介绍
    Python机器学习(五十)NumPy 线性代数
    Python机器学习(四十九)NumPy 矩阵库函数
    Python机器学习(四十八)NumPy 副本和视图
    Python机器学习(四十七)NumPy 排序、查找、计数
    Python机器学习(四十六)NumPy 统计函数
    Python机器学习(四十五)NumPy 数学函数
    Python机器学习(四十四)NumPy 字符串函数
    Python机器学习(四十三)NumPy 位运算
    Python机器学习(四十二)NumPy 数组迭代
  • 原文地址:https://www.cnblogs.com/y0umer/p/2809597.html
Copyright © 2011-2022 走看看