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/bin這樣,如果你以root的身份登錄HOME最有可能/root。因此,也許替換$HOME用/usr/local ,那樣就會安裝在/usr/local/bin目錄下,具體的我沒有執行,這是查到的解決方案,希望可以給別人提供一些幫助。