1. 程式人生 > >PHP+ffmpeg+nginx的配置實現視訊轉碼

PHP+ffmpeg+nginx的配置實現視訊轉碼

最近專案中需要實現上傳視訊過程中自動轉碼MP4格式的功能,想到了用FFmpeg來實現它,但從來沒有操作過,查閱了很多資料,遇到了好多問題,現在終於安裝成功,覺得應該寫下來與人分享一下,以免有人遇到和我一樣的困境。

首先我是CentOs 6.7版本 環境是LNMP 我需要用PHP實現在上傳過程中實施轉碼功能。
下面詳細介紹一下安裝ffmpeg擴充套件的操作

要求:具有完全root訪問許可權。
①從repo匯入GPG金鑰:

rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms
  • 1
  • 1

②安裝ATRPMS Repo:

rpm -ivh http://dl.atrpms
.net/all/atrpms-repo-6-7.el6.x86_64.rpm
  • 1
  • 1

輸出應該是這樣:

Retrieving http://dl.atrpms.net/all/atrpms-repo-6-7.el6.x86_64.rpm
Preparing...                ##################################### [100%]
   1:atrpms-repo            ##################################### [100%]
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

③開始安裝ffmpeg

yum install ffmpeg
  • 1
  • 1

這裡可能需要等一會兒,會提示你選擇【y/n/d】
選擇y就可以了

其實到這裡的時候ffmpeg已經安裝成功了
④安裝ffmpeg-devel

yum install ffmpeg-devel
  • 1
  • 1

同樣等一會,需要一些時間

如果安裝成功了,執行

ffmpeg -version
  • 1
  • 1

顯示如下:

ffmpeg version 2.2.1
built on Apr 13 2014 13:00:18 with gcc 4.4.6 (GCC) 20120305 (Red Hat 4.4.6-4)
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared
--enable-runtime-cpudetect --enable-gpl --enable-version3 --enable-postproc --enable-avfilter --enable-pthreads --enable-x11grab --enable-vdpau --disable-avisynth --enable-frei0r --enable-libopencv --enable-libdc1394 --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --disable-stripping libavutil 52. 66.100 / 52. 66.100 libavcodec 55. 52.102 / 55. 52.102 libavformat 55. 33.100 / 55. 33.100 libavdevice 55. 10.100 / 55. 10.100 libavfilter 4. 2.100 / 4. 2.100 libswscale 2. 5.102 / 2. 5.102 libswresample 0. 18.100 / 0. 18.100 libpostproc 52. 3.100 / 52. 3.100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

證明ffmpeg已經開始工作

寫一下我自己操作執行的簡單程式碼

ffmpeg   -i /路徑/視訊名稱.字尾名    /新的路徑/新的名稱.新字尾
  • 1
  • 1

如果報The encoder ‘aac’ is experimental but experimental codecs are not enabled的錯誤 ,說明acc編碼器的編碼器沒有起作用,但如果你想使用它,就在命令里加上’-strict -2’

PHP程式碼
用exec或者shell_exec函式的時候,需要修改php.ini。因為預設這兩個函式在禁用列表裡。
一般php.ini 檔案都在/usr/local/php/etc/php.ini

vim /usr/local/php/etc/php.ini
  • 1
  • 1

查詢disable_functions 把裡面的exec與shell_exec刪掉就可以了
:wq! 儲存退出
並重啟php-fpm

<?php
    $cmd = 'ffmpeg -i /home/1.wmv  /home/1.mp4';
    echo exec($cmd);
?>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

如果成功的話 你可以在home檔案下看到1.wmv 與1.mp4。

在多記錄一些過程中出現的錯誤吧。
如果你是在:
(http://blog.csdn.net/loyachen/article/details/50909854)
這種方法安裝的時候最後遇到了錯誤 發現exec執行不了 實現不了功能
你可以在程式碼資料夾下建立一個log.txt 並給它寫入的許可權
然後PHP中程式碼片段裡

$cmd = 'ffmpeg   -i /路徑/視訊名稱.字尾名 '-strict -2  /新的路徑/新的名稱.新字尾 2>/路徑/log.txt';
  • 1
  • 1

重定向前加的數字解釋
檔案描述符:1和2指向同一個檔案表項,也可以說錯誤的輸出被合併了.其中0 表示鍵盤輸入 1表示螢幕輸出 2表示錯誤輸出.把標準出錯重定向到標準輸出
然後執行,會把錯誤資訊記錄在log.txt中。
我之前的錯誤提示是:

sh: /root/bin/ffmpeg: Permission denied
  • 1
  • 1

就是這個目錄下許可權是被拒絕的。或者是,你的視訊不能直接在根目錄下。放在別的資料夾中,賦予許可權,才能PHP執行。在根據上面的連結中的安裝裡,預設把擴充套件檔案全部安裝在了root資料夾下。
在執行

PKG_CONFIG_PATH =“$ HOME / ffmpeg_build / lib / pkgconfig”./configure --prefix =“$ HOME / ffmpeg_build”-extra-cflags =- I $ HOME / ffmpeg_build / include”--extra-ldflags =- L $ HOME / ffmpeg_build / lib“--bindir =”$ HOME / bin“--pkg-config-flags =- static“--enable-gpl --enable-nonfree --enable-libfdk-aac --enable -libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
  • 1
  • 1
的時候,
你指向HOME/binrootHOME最有可能/root。因此,也許替換$HOME用/usr/local ,那樣就會安裝在/usr/local/bin目錄下,具體的我沒有執行,這是查到的解決方案,希望可以給別人提供一些幫助。