FFMPEG編碼容錯處理解決辦法之途徑----升級庫文件

在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編譯安裝流程記錄:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70416.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70416.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70416.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是超越編程(逾編程)(元編程?)

超越編程(逾編程)(元編程?)(meta-programming) 目錄 1. meta- 的詞源 2. 逾編程(meta-programming) 的直實含義 2.1 定義 2.2 說明 3. 翻譯成“元編程”應該是一種錯誤 1. meta- 的詞源 這是一個源自希臘語的構詞元素,其有三種含義&#xff…

基于Martin的全國基礎底圖實現

概述 前面有文章基于Martin實現MapboxGL自定義底圖分享了Martin的使用,本文使用網絡收集的數據實現了全國基礎數據的收集和基礎底圖。 實現后效果 實現 1. 數據準備 實例中包含如下數據: 邊界線和九段線數據省邊界面數據省會城市點數據市邊界面數據…

新版Tomcat MySQL IDEA 安裝配置過程遇到的問題

一、IDEA閃退 打不開了 IDEA環境變量路徑不對 二、Tomcat 一閃而過 主要是JDK環境變量不對 三、MySQL 重新安裝、是否備份以及默認盤問題 看清楚教程基本沒問題:Windows 安裝配置及卸載MySQL8超詳細保姆級教程_mysql8卸載-CSDN博客

鏈表_兩兩交換鏈表中的節點

鏈表_兩兩交換鏈表中的節點 一、leetcode-24二、題解1.引庫2.代碼 一、leetcode-24 兩兩交換鏈表中的節點 給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能…

DAY08 List接口、Collections接口、Set接口

學習目標 能夠說出List集合特點1.有序2.允許存儲重復的元素3.有帶索引的方法(練習 add,remove,set,get) 能夠使用集合工具類Collections類:static void sort(List<T> list) 根據元素的自然順序 對指定列表按升序進行排序。static <T> void sort(List<T> lis…

Zookeeper(58)如何在Zookeeper中實現分布式鎖?

在 Zookeeper 中實現分布式鎖是一種常見的用例。Zookeeper 提供了強一致性、高可用性的分布式協調服務&#xff0c;使得它非常適合用來實現分布式鎖。以下是詳細的步驟和代碼示例&#xff0c;展示如何在 Zookeeper 中實現分布式鎖。 1. Zookeeper 分布式鎖的基本原理 Zookeep…

帆軟報表FineReport入門:簡單報表制作[擴展|左父格|上父格]

FineReport幫助文檔 - 全面的報表使用教程和學習資料 數據庫連接 點擊號>>JDBC 選擇要連接的數據庫>>填寫信息>>點擊測試連接 數據庫SQLite是帆軟的內置數據庫, 里面有練習數據 選擇此數據庫后,點擊測試連接即可 數據庫查詢 方法一: 在左下角的模板數據集…

后臺管理系統-項目初始化

認識vue-admin **核心交付:** 為什么要基于現成架子二次開發 什么是二次開發:基于已有的代碼(項目工程,腳手架)開進行新功能的開發 所以看懂已有的框架中的既有代碼,變得很重要了 1. 背景知識 后臺管理系統是一種最常見的應用模式,不同的管理系統之間有很多相似的地方…

DAY07 Collection、Iterator、泛型、數據結構

學習目標 能夠說出集合與數組的區別數組:1.是引用數據類型的一種2.可以存儲多個元素3.數組的長度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.數組即可以存儲基本類型的數據,又可以存儲引用數據類型的數據int[],double[],String[],Student[]集合:1.是引用數據類…

VLM(視覺語言模型)與DeepSeek R1(獎勵機制)如何結合

VLM&#xff08;視覺語言模型&#xff09;與DeepSeek R1&#xff08;獎勵機制&#xff09;如何結合 flyfish VLM的傳統訓練依賴于監督學習&#xff08;直接擬合問答對&#xff09;&#xff0c;而規則獎勵函數通常用于強化學習&#xff08;通過試錯和獎勵反饋優化策略&#xf…

從零開始構建一個語言模型中vocab_size(詞匯表大小)的設定規則

從零開始構建一個語言模型就要設計一個模型框架,其中要配置很多參數。在自然語言處理任務中,vocab_size(詞匯表大小) 的設定是模型設計的關鍵參數之一,它直接影響模型的輸入輸出結構、計算效率和內存消耗。 本文是在我前文的基礎上講解的:從零開始構建一個小型字符級語言…

計算機網絡之物理層——基于《計算機網絡》謝希仁第八版

(??? )&#xff0c;Hello我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的攻城獅&#xff0…

實時股票行情接口與WebSocket行情接口的應用

實時股票行情接口與WebSocket行情接口的應用 實時股票行情接口是量化交易和投資決策的核心工具之一&#xff0c;行情接口的種類和功能也在不斷擴展。介紹幾種常見的行情接口&#xff0c;包括實時股票行情接口、Level2行情接口、WebSocket行情接口以及量化行情接口&#xff0c;…

圖論 之 BFS

文章目錄 3243.新增道路查詢后的最短距離1311.獲取你好友已觀看的視頻 BFS:廣度優先搜索&#xff08;BFS&#xff09; 是一種常用的算法&#xff0c;通常用于解決圖或樹的遍歷問題&#xff0c;尤其是尋找最短路徑或層級遍歷的場景。BFS 的核心思想是使用隊列&#xff08;FIFO 數…

ollama stream“:True django如何返回數據

在使用 Django 框架開發 Web 應用時&#xff0c;如果你想要通過 Ollama 流式返回數據&#xff0c;你可以通過 Django 的 HttpResponse 或者 StreamingHttpResponse 來實現。Ollama 主要用于處理文本生成任務&#xff0c;如聊天機器人、自動完成等&#xff0c;通常這些任務會產生…

為什么要用 const 和 let,而不是 var?

JavaScript 中有三種方式聲明變量&#xff1a;var、let 和 const。其中&#xff0c;var 是早期版本的 JavaScript 中的標準&#xff0c;但隨著 ECMAScript 6&#xff08;ES6&#xff09;引入了 let 和 const&#xff0c;var 的種種問題也顯現出來。今天&#xff0c;我們將探討為…

從零開始玩轉TensorFlow:小明的機器學習故事 2

你好&#xff0c;TensorFlow&#xff01;——從零開始的第一個機器學習程序 1. 為什么要寫這個“Hello, TensorFlow!”&#xff1f; 無論學習什么新語言或新框架&#xff0c;“Hello World!”示例都能幫助我們快速確認開發環境是否就緒&#xff0c;并掌握最基本的使用方式。對…

【Java八股文】10-數據結構與算法面試篇

【Java八股文】10-數據結構與算法面試篇 數據結構與算法面試題數據結構紅黑樹說一下跳表說一下&#xff1f;LRU是什么&#xff1f;如何實現&#xff1f;布隆過濾器怎么設計&#xff1f;時間復雜度&#xff1f; 排序算法排序算法及空間復雜度 數據結構與算法面試題 數據結構 紅…

Docker換源加速(更換鏡像源)詳細教程(2025.2最新可用鏡像,全網最詳細)

文章目錄 前言可用鏡像源匯總換源方法1-臨時換源換源方法2-永久換源&#xff08;推薦&#xff09;常見問題及對應解決方案1.換源后&#xff0c;可以成功pull&#xff0c;但是search會出錯 補充1.如何測試鏡像源是否可用2.Docker內的Linux換源教程 換源速通版&#xff08;可以直…

華為云deepseek大模型平臺:deepseek滿血版

華為云硅基流動使用Chatbox接入DeepSeek-R1滿血版671B 1、注冊&#xff1a; 華為云deepseek大模型平臺注冊&#xff1a;https://cloud.siliconflow.cn/i/aDmz6aVN 說明&#xff1a;填寫邀請碼的話邀請和被邀請的賬號都會獲得2000 萬 Tokens&#xff1b;2個帳號間不會與其他關聯…