星期一, 8月 22, 2011

PHP轉影音檔

[轉]使用PHP進行影片轉檔及擷取縮圖

要在 Linux 主機上使用 PHP 進行影片轉檔,須安裝 LAME、ffmpeg、Ruby、FLVTool2。

  1. 安裝 LAME
    LAME 是用來將聲音壓成 MP3 格式,並加入 --enable-shared 以供 ffmpeg 使用
    網址:http://lame.sourceforge.net/

    下載完成後,輸入下列命令:
    [root@localhost ~]# tar -zxvf lame-3.98.4.tar.gz
    [root@localhost ~]# cd lame-3.98.4
    [root@localhost ~]# ./configure --enable-shared -prefix=/usr
    [root@localhost ~]# make
    [root@localhost ~]# make install
  2. ffmpeg Install With Libx264
    1. Download libx264
      Get the libx264 package from here: http://www.videolan.org/developers/x264.html
    2. Install libx264
      cd /path/to/x264-dir
      ./configure --enable-shared
      make
      make install
      ldconfig
      如果遇到yasm not found,就用無敵的yum install yasm
      如果遇到yum找不到yasm,就先裝epel
      //32bit 
      sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
      
      //CentOS 5 64bit
      sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
      
      //CentOS 6
      rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
  3. 安裝 ffmpeg
    ffmpeg 影片轉檔系統,其 libavcodec 涵蓋大部分影片格式,不過仍有轉換 FLV 上的問題,須另外安裝 FLVTools 來修正。
    網址:http://www.ffmpeg.org/

    下載完成後,輸入下列命令:
    [root@localhost ~]# tar -zxvf ffmpeg-0.5.1.tar.gz
    [root@localhost ~]# cd ffmpeg-0.5.1
    [root@localhost ~]# ./configure --enable-gpl --enable-libmp3lame --enable-shared --enable-libx264 --prefix=/usr

    [root@localhost ~]# make clean && make
    [root@localhost ~]# make install
  4. 安裝 Ruby
    FLVTool2 可以修正 ffmpeg 不正確儲存 FLV metadata 的問題,不過它是用 Ruby 寫的,須先安裝 Ruby。
    網址:http://www.ruby-lang.org/en/

    下載完成後,輸入下列命令:
    [root@localhost ~]# tar -zxvf ruby-1.9.1-p376.tar.gz
    [root@localhost ~]# cd ruby-1.9.1-p376
    [root@localhost ~]# ./configure
    [root@localhost ~]# make
    [root@localhost ~]# make install
  5. 安裝 FLVTool2
    FLVTool2 是一個用來編輯FLV檔的套件,透過它來儲存FLV檔,確保 FLV 檔裡有正確的 metadata。
    網址:http://rubyforge.org/projects/flvtool2/

    下載完成後,輸入下列命令:
    [root@localhost ~]# tar -xvf flvtool2-1.0.6.tar
    [root@localhost ~]# cd flvtool2-1.0.6
    [root@localhost ~]# ruby setup.rb config
    [root@localhost ~]# ruby setup.rb setup
    [root@localhost ~]# ruby setup.rb install
  6. 安裝 ffmpeg-php
    為了讓 PHP 取得影片的資料,要安裝 ffmpeg-php 插件。
    網址:http://ffmpeg-php.sourceforge.net/
    下載:http://sourceforge.net/projects/ffmpeg-php/files/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2/download

    下載完成後,輸入下列命令:
    [root@localhost ~]# tar -xvf ffmpeg-php-0.6.0.tbz2
    [root@localhost ~]# cd ffmpeg-php-0.6.0
    [root@localhost ~]# phpize
    [root@localhost ~]# ./configure && make
    [root@localhost ~]# make install

    在configure && make階段遇到CODEC_TYPE_VIDEO undeclared問題
    新增yum的Repository後
    重裝yum install ffmpeg ffmpeg-devel ffmpeg-libpostproc 解決一些問
    Install FFmpeg and ffmpeg-php on CentOS Easily
    之後又遇到‘PIX_FMT_RGBA32′undeclared 看下篇解決
    ffmpeg-php error PIX_FMT_RGBA32

    如果 Apache 是使用 XAMPP 請參考這篇:
    [Linux] 在 XAMPP 上安裝 PHP extension (以 ffmpeg-php 為例)

    make後 可以看到產生ffmpeg.so的資料
    再搬到/usr/lib64/php/modules/ffmpeg.so
    即可設定 PHP 載入這個plugin。
  7. 設定 php.ini
    1. #vi /etc/php.ini
      加入以下內容:
      [ffmpeg]
      extension=ffmpeg.so
    2. 重開apache
      #service httpd restart

    最後重啟 Apache
  8. 開始轉檔
    以下是一個簡單的範例:
    PHP程式碼
    //ffmpeg 的執行路徑
    $ffmpegPath = "/usr/bin/ffmpeg";
    //來源影片路徑
    $srcFile = '/var/www/html/ffmpeg/upload/test_in.wmv';
    //輸出影片路徑
    $outFile = '/var/www/html/ffmpeg/upload/test_out.flv';
    //輸出縮圖路徑
    $outImg = '/var/www/html/ffmpeg/upload/test.jpg';

    //取得影片資訊
    $ffmpegObj = new ffmpeg_movie($srcFile);
    //取得音頻比特率
    $srcAB = intval($ffmpegObj->getAudioBitRate()/1000);

    //將影片轉換為FLV檔
    exec("$ffmpegPath -i $srcFile -f flv -s 436x324 -acodec libmp3lame -ar 22050 -ac 2 -ab $srcAB -y $outFile");

    //從影片產生縮圖
    exec("$ffmpegPath -itsoffset -1 -i $srcFile -vcodec mjpeg -vframes 1 -an -f rawvideo -s 436x324 $outImg");
如果沒有錯誤,又沒有轉出的檔案 檢查一下資料夾權限是否限制寫入

Reference

沒有留言: