PHP中利用Ffmpeg得到flv視頻縮略圖和播放時間

這裏簡單說一下:FFmpeg是用於錄製、轉換和流化音頻和視頻的完整解決方案,一套領先的音/視頻編解碼類庫。官方正式版ffmpeg不支持rmvb和rm格式. 不過有不少解決方法php

FFmpeg的官方網址是 http://ffmpeg.mplayerhq.hu/ 。c++

中文Wiki是 http://www.ffmpeg.com.cn/ ,資料不少。shell

㈠安裝FFMEPGapache

操做系統:centos6centos

找了那麼多安裝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

④圖片時間截取也很重要,頗有多是無效圖片或者是黑屏

建議 增長關鍵幀,一般第一幀爲關鍵幀,可使用: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,由於編輯器就沒有顯示語法高亮,沒有辦法我照着網上手寫了一邊代碼,發現仍是報錯詭異了 。。。報錯還很奇怪  ,感興趣的能夠試試,沒有辦法我決定搜英文資料,最後在外國網站看到了代碼,拿來一試能夠!哈哈哈  仍是老外的東西好使啊,錯誤的代碼:

關鍵詞沒有高亮顯示

下面是正確的代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?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
?>
預覽效果:

wps_clip_image-31828

個人視頻是55秒正好!

相關文章
相關標籤/搜索