解決!上傳 mp4 到伺服器之後,個別視訊無法在瀏覽器播放

anan6527發表於2020-07-07

使用ffmpeg對視訊進行轉碼,轉存後上傳七牛雲空間,作為視訊資源,可在瀏覽器正常播放

記錄一下工作中遇到的問題以及解決方法。

公司站點有些使用者需要上傳視訊資源,檔案不大,大多是MP4格式的,但是偶然發現個別視訊檔案上傳之後並不能播放,檔案字尾也都是mp4。

查閱相關資料之後,瞭解到視訊的編碼格式有多種,但是瀏覽器一般能識別到的是h264編碼的。

最初給產品的建議是在上傳入口貼個連結,讓使用者自行下載轉碼工具進行轉碼,但是產品大佬表示多數使用者不一定會使用,另外就是使用者體驗不好。
轉而去查閱七牛雲的文件,發現七牛提供的有轉碼服務,迅速莽了一套出來,交給前端除錯,最後也通過了。
然鵝,七牛雲是要收費!!!
4分鐘的視訊轉碼需要3毛錢!
0.03元/4分鐘 還是普通清晰度的!
這麼大的開支、這麼小的公司,領導當然不會批這個錢。

最終查到了ffmpeg這麼個東西,看起來能用。

安裝 ffmpeg

1 yum install yasm
2 下載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 install
6 返回上一級,tar xjf ffmpeg-4.2.3.tar.bz2
注意重新命名ffmpeg資料夾的名稱 和配置命令相對應 cd 進入ffmpeg
7

./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 install
8 vim /etc/ld.so.conf 在檔案末尾加上

/usr/local/ffmpeg/lib/

儲存退出 執行 ldconfig
9 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 協議》,轉載必須註明作者和本文連結

相關文章