在qt開發環境下接收網絡數據,調用ffmpeg解碼播放視頻,出現閃屏現象,具體現象可以使用操作系統自帶的ffplay播放器播放原始視頻流可復現;而使用操作系統自帶的mpv播放器播放視頻則不會出現閃屏;閃屏時會報Could not find ref with POC xx錯誤(由于是無線通信該錯誤無法避免)要求能達到mpv的播放效果就行,具體實現方式不限。?
根本解決方法:通過測試不同版本的pplay功能,哪個版本容錯能力強就用哪個版本。
當只使用 I 幀進行編碼時,編碼時間較短,但生成的視頻流較長;而加入 P B 幀后,會使編碼時間變長,但生成的視頻流長度只有純 I 幀編碼的 25%。因此,P B 幀的加入本質上是用時間換空間的思路(跟算法設計思路剛好反過來)。
將無線傳輸過來的UDP協議視頻,將UDP去掉包頭及包尾將數據組合成一幀編碼數據后保存成h265裸流文件。用ffmpeg4.2.2的命令ffplay播放有花屏現象并伴隨報錯誤Could not? find ref with POC xx。但是利用mpv播放雖然也有報錯Could not? find ref with POC xx但是不花屏。將一幀H265編碼數據組成一幀后送入函數?avcodec_send_packet(進行解碼)和avcodec_receive_frame(從解碼的圖像中獲取YUV圖像)這些函數的返回值也是對的。
為此解決此問題用到的方法進行梳理如下:
方法1、加入數據緩沖器---有少部分改善
????????由原來的收到一幀就進行處理修改為根據UDP協議序號幀收滿數據后,再直接送入解碼器進行解碼(開辟有緩沖器)。
方法2、硬件解碼---效果不明顯
硬件解碼數據不能為RGB24,
方法3、OPenGL顯示圖像數據--效果不明顯
通過加入庫文件進行顯示
方法4、 MPV與FFMPEG播放處理不通--確定問題解決思路
發現MPV雖然是基于FFMPEG庫上開發的但是對FFMPEG進行了優化,其播放效果優于FFMPEG
方法5、更新FFMPEG庫---效果明顯
Step 1 下載并編譯FFMPEG庫
1)下載ffmpeg源代碼
說明:
ffmpeg下載地址?http://ffmpeg.org/releases/
點擊Last modified(最后修改內容可看到最新版本--其實是快照版本)
- ?Snapshot版本?:這是一種開發中的版本,表示該版本尚未正式發布,可能會頻繁發生變化。它主要用于開發階段,特別是多個團隊或模塊之間協同開發時,確保依賴的模塊始終是最新的。?12
- ?Release版本?:這是一種正式發布的版本,表示該版本已經經過測試和驗證,不會再有頻繁的變化。它通常用于生產環境,確保依賴的版本是穩定和可靠的。
2)?ffmpeg編譯安裝
首先,將下載好的ffmpeg壓縮包解壓。輸入解壓bz2壓縮文件的命令
sudo tar -xjf ffmpeg-snapshot.tar.bz2
然后進入解壓后的文件夾,打開終端,設置安裝配置,配置文件是configure,在編譯和安裝之前,需要配置一下,不然無法執行編譯指令.
配置configure的指令為:(注意將--enable-libx264去掉,否則配置報錯)
sudo ./configure --enable-gpl --enable-libx264 --prefix=/media/cssc/708/ZHKZ/YTHWQ/FFMPEG_BUILD/ffmpeg-build?--enable-shared
其中,gpl和libx264是額外的庫,可根據情況選擇,默認都是disable。
--prefix:指定安裝路徑,如果不指定,頭文件會默認安裝在/usr/local/include,庫會默認在/usr/local/lib
--enable-shared:選擇編譯動態庫,如果不加上這一句,編譯出來的只有靜態庫(.a),加上之后才有動態庫(.so)
配置完以后,執行編譯和安裝命令:
make -j8 && sudo make install
其中,make -j8:多線程編譯的意思,加快編譯速度,當然也要看電腦最大線程數。make install:安裝各種頭文件和庫,要加上sudo,不然建不了文件夾。
編譯以及安裝完之后,在ffmpeg-build
文件夾下會多出四個文件夾,bin、include、lib、share;
如果沒有指定安裝路徑,bin文件夾下的兩個文件會默認至/usr/local/bin/
include文件夾下的內容會默認在/usr/local/include/下
lib文件夾下的內容會默認在/usr/local/lib/下
share文件夾下的內容默認在/usr/local/share/下
除此之外,還需要注意一點,每次編譯之前都需要配置configure
,上次的配置在此次編譯無效。
3)添加環境變量
打開ffmpeg(安裝后的)下的bin,執行./ffmpeg -version會出現報錯信息:這是因為ffmpeg庫沒有鏈接到系統庫里邊,建立鏈接有兩種辦法,第一種在環境變量中添加ffmpeg庫路徑,第二種是在/etc/ld.so.conf.d文件夾下建立ffmpeg.conf,推薦使用第一種,更簡單快捷一些,第二種權當記錄在此。
第一種方法:
將ffmpeg添加到環境變量,首先執行?
sudo gedit /etc/profile
在文件末尾添加ffmpeg主程序路徑和庫路徑:(也可命令行執行只對當前cmd用戶有效)
export PATH=$PATH:/media/cssc/708/ZHKZ/YTHWQ/FFMPEG_BUILD/ffmpeg-build/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/media/cssc/708/ZHKZ/YTHWQ/FFMPEG_BUILD/ffmpeg-build/lib
保存后,再執行? ?
source /etc/profile
再次執行ffmpeg -version
就可以正常顯示ffmpeg版本信息了,也不用進入ffmpeg-build/bin
下了。不僅可以看到版本信息,還能看到編譯ffmpeg時的configure
配置信息,以及庫的版本。
補充說明:除了用新版本可以解決視頻解碼播放花屏問題,同時也嘗試基于FFMPEG4.2.2版本的MPV庫進行播放,因為MPV庫對FFMPEG庫進行了優化。
方法6、采用MPV庫---效果明顯
linux下GPU硬件解碼接口,常用的有vdpau和vaapi。mpv是基于mplayer開發的一個播放器。此外,mpv還提供了函數庫libmpv,通過使用libmpv可以編寫一個簡單的播放器。
mpv是一款一優秀的播放器。由于需要將其內嵌到代碼中,所以需要將其編譯成動態庫的形式使用。編譯流程如下:
1)mpv源碼URL:
? ? ? ? ? ? ?URL1: ?https://github.com/mpv-player/mpv? ? ?
? ? ? ? ? ? ?URL2:?https://github.com/mpv-player/mpv-build??
URL1是mpv的源碼,而URL2是將源碼和其所需要的庫做了一個整合腳本。此文檔使用URL2進行編譯安裝。
2)mpv編譯安裝流程記錄: