使用ffmpeg對視訊進行轉碼,轉存後上傳七牛雲空間,作為視訊資源,可在瀏覽器正常播放
記錄一下工作中遇到的問題以及解決方法。
公司站點有些使用者需要上傳視訊資源,檔案不大,大多是MP4格式的,但是偶然發現個別視訊檔案上傳之後並不能播放,檔案字尾也都是mp4。
查閱相關資料之後,瞭解到視訊的編碼格式有多種,但是瀏覽器一般能識別到的是h264編碼的。
最初給產品的建議是在上傳入口貼個連結,讓使用者自行下載轉碼工具進行轉碼,但是產品大佬表示多數使用者不一定會使用,另外就是使用者體驗不好。
轉而去查閱七牛雲的文件,發現七牛提供的有轉碼服務,迅速莽了一套出來,交給前端除錯,最後也通過了。
然鵝,七牛雲是要收費!!!
4分鐘的視訊轉碼需要3毛錢!
0.03元/4分鐘 還是普通清晰度的!
這麼大的開支、這麼小的公司,領導當然不會批這個錢。
最終查到了ffmpeg這麼個東西,看起來能用。
安裝 ffmpeg
1
yum install yasm2
下載x264,www.videolan.org/developers/x264.ht... 在該頁面找到對應的資源連結 直接wget下載到伺服器.3
下載ffmpeg ffmpeg.org/download.html 在該頁面找到對應的資源連結,直接wget下載到伺服器.4
tar -xjf x264-master.tar.bz2 注意重新命名x264在 usr/local/下的名稱 和下面的配置相對應 並進入x264目錄5
./configure --prefix=/usr/local/x264 --enable-shared --enable-static --disable-asm
此處prefix對應的路徑就是第四步 x264-master.tar.bz2 的解壓路徑
make
make install6
返回上一級,tar xjf ffmpeg-4.2.3.tar.bz2
注意重新命名ffmpeg資料夾的名稱 和配置命令相對應 cd 進入ffmpeg7
./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/x264/include --extra-ldflags=-L/usr/local/x264/lib
這裡同樣要注意x264和ffmpeg的路徑問題
make
make install8
vim /etc/ld.so.conf 在檔案末尾加上
/usr/local/ffmpeg/lib/
儲存退出 執行 ldconfig9
vim /etc/profile 檔案末新增環境變數:
#set ffmpeg environment
PATH=$PATH:/usr/local/ffmpeg/bin
export PATH
儲存退出 執行 source /etc/profile
10
檢視是否成功 ffmpeg -version
注意:
坑:
bash: ffmpeg: command not found
一個簡單粗暴的解決辦法: 進入/usr/local/ffmpeg/bin 目錄
找到 ffmpeg 檔案,然後複製到 /usr/local/bin 目錄下
然後在給這個目錄許可權,這一步很重要
sudo chmod -R 777 /usr/local/bin
也可直接建立軟連線到usr/local/bin
坑:
ffmpeg: error while loading shared libraries: libx264.so.161: cannot open shared object file: No such file or directory
在 etc/ld.so.conf 下追加
/usr/local/x264/lib/
或者重新編譯安裝x264
安裝完畢,開始呼叫
$cmd = '/usr/local/ffmpeg/ffmpeg -i ' . $file_path . ' -c:v libx264 -strict -2 ' . $new_path;
exec($cmd, $log, $status);
\Log::info('視訊轉碼完成', ['new_path' => $new_path, 'log' => $log, 'status' => $status]);
這裡需要注意,雖然ffmpeg我們設定了全域性變數,在命令列除錯的時候是可以成功觸發執行的,但是我這裡是放到佇列裡進行呼叫,發現始終返回127,最後在$cmd這裡,帶上ffmpeg的絕對路徑就可以成功了。
另外,由於視訊轉碼過程比較慢,4分鐘的視訊,公司的測試伺服器轉碼花了大致10分鐘,因此轉碼過程建議都佇列處理,在佇列設定裡注意設定隊裡任務的timeout時長
結語
第一次發文,非運維大佬,就是個臭敲程式碼的,如有紕漏歡迎指正,感謝!
本作品採用《CC 協議》,轉載必須註明作者和本文連結