1. 程式人生 > >第十一章:ffmpeg和QT開發播放器之專案移植到Ubuntu

第十一章:ffmpeg和QT開發播放器之專案移植到Ubuntu

寫在前面:  
    將前面十章節的程式碼移植到linux中,注意,這裡是移植到ubuntu中,之後我還會想辦法移植到開發板中去,不過還是有點難度就是了。移植好的程式碼路徑:https://download.csdn.net/download/tainjau/10396395

1、下載安裝QT5.8

                                

2、下載編譯ffmpeg

        第一步:還是在老師提供的網址http://ffmpeg.club/ffmpeg_download.html下載FFmpeg原始碼,這裡我下載的是3.4.1版本的。將其拷貝進ubuntu中,使用tar -jxvf ffmpeg-3.4.1.tar.bz2解壓。

        第二步:安裝編譯依賴環境
sudo apt-get update
sudo apt-get -y install autoconf automake build-essential \
libass-dev libfreetype6-dev libsdl2-dev libtheora-dev \
libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev \
libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev
sudo apt-get install yasm		//這個是編譯原始碼所需要的工具
       如果有出現安裝不了的,就使用sudo aptitude install libsdl2-dev

       注:虛擬機器裡面最好還是記得先快照一下,以免出現問題。

       第三步安裝可選依賴庫

       X264 安裝

       sudo apt-get install libx264-dev

       注:如果選擇編譯要新增 --enable-gpl --enable-libx264

       如果安裝失敗可以選擇原始碼安裝
       wget http://download.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
       tar xjvf last_x264.tar.bz2

       cd x264-snapshot*
       PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --disable-opencl
       PATH="$HOME/bin:$PATH" make
       make install       AAC安裝
       sudo apt-get install libfdk-aac-dev
       如果選擇編譯新增 --enable-libfdk-aac
       如果加了 --enable-gpl  需要加 --enable-nonfree       MP3
       sudo apt-get install libmp3lame-dev
       如果選擇編譯新增 --enable-libmp3lame       opus
       sudo apt-get install libopus-dev
       如果選擇編譯新增 --enable-libopus
       VPX  VP8 Video Encoding Guide       sudo apt-get install libvpx-dev
       如果選擇編譯新增 --enable-libvpx       第四步編譯為靜態庫
       在ffmpeg原始碼中,通過執行命令./configure生成makefile
       ./configure --enable-shared --prefix=/usr/local/ffmpeg 
       其中 --enable-shared 表示編譯為動態庫, --prefix 表示安裝的路徑
       然後執行make -j4
       make install       編譯完成後就可以看到 /usr/local/ffmpeg 目錄中有標頭檔案和動態連結庫檔案。如果為了專案編譯執行方

便,可以直接把動態連結庫複製到 /usr/lib 目錄下,這樣執行就不用指定庫路徑了。

       編譯專案時候要注意,庫路徑要設定到 /usr/lib  防止有老版本衝突,很多軟體安裝的時候會把 ffmpeg 安裝

進去,比如安裝 opencv 也會把 ffmpeg 安裝進去,有可能造成版本衝突。

       之後將整個工程放在linux中,使用QT creadt去開啟.pro檔案,並檢視pro檔案,這裡我對pro檔案進行了初步修改,以後缺少啥就新增啥進去。
TEMPLATE = app

#如果是win32平臺下
win32{
TARGET = Xplay
DESTDIR = ../bin
QT += core multimedia widgets gui
CONFIG += debug console
DEFINES += WIN64 QT_DLL QT_MULTIMEDIA_LIB QT_WIDGETS_LIB
INCLUDEPATH += ./GeneratedFiles \
    . \
    ./GeneratedFiles/Debug \
    ../../lib \
    ../../include
LIBS += -L"../../lib"
DEPENDPATH += .
MOC_DIR += ./GeneratedFiles/debug
OBJECTS_DIR += debug
UI_DIR += ./GeneratedFiles
RCC_DIR += ./GeneratedFiles
include(Xplay.pri)
win32:RC_FILE = Xplay.rc
}
#如果是linux平臺下
linux{
message("linux");
LIBS += -L/usr/local/ffmpeg/lib -lavcodec -lavutil -lresam

INCLUDEPATH += /usr/local/ffmpeg/include    \
                ./GeneratedFiles

include(Xplay.pri)
}
QT += core multimedia widgets gui
DEFINES += QT_MULTIMEDIA_LIB QT_WIDGETS_LIB
       接下來的錯誤是鎖有問題,因為linux和win程式設計還是有區別的,所以要稍作更改。新增上標頭檔案#include <QMutex>
       追加lib庫的內容LIBS += -L/usr/local/ffmpeg/lib -lavcodec -lavutil -lswresample \
       編譯完成後,還是沒辦法正常使用,按老師的分析是因為win和linux的音訊處理是有所不同的,在win中,音訊播放時候只要緩衝有資料,就會播放,而linux有的版本則需要音訊滿了才會播放。

       下載完成之後,直接將檔案放入ubuntu後,在命令列中執行./qt-opensource-linux-x64-5.8.0.run 即可,然後直接下一步下一步安裝。

3、建立qt.pro

                                

       在初步編譯的時候就開始報錯了,這裡的錯誤如圖,主要原因是因為win平臺下不區分大小寫,而linux中會區分大小寫。

                                

       追到這個檔案發現,是ui_xplay.h這檔案包含的,但是這個檔案是系統自動根據介面而生成的,所以要修改介面。

                                

       先取消提升,在重新做提升操作

                                            

                               

       更改完之後再編譯,出現以下問題,目測是QT需要的庫沒定義好,回到.pro檔案裡面、

                             

       新增以下兩段定義

                                

       再次編譯出現找不到定義,這說明庫檔案有錯,連結出問題了。

       -lavformat   -lswscale,問題就解決了。

                                

4、對音訊程式進行修改

       編譯完成後,還是沒辦法正常使用,按老師的分析是因為win和linux的音訊處理是有所不同的,在win中,音訊播放時候只要緩衝有資料,就會播放,而linux有的版本則需要音訊滿了才會播放。 

       我自己的處理是讓音訊解碼視訊至少解碼一次。

                    

相關推薦

:ffmpegQT開發播放專案移植Ubuntu

寫在前面:      將前面十章節的程式碼移植到linux中,注意,這裡是移植到ubuntu中,之後我還會想辦法移植到開發板中去,不過還是有點難度就是了。移植好的程式碼路徑:https://download.csdn.net/download/tainjau/10396395

:ffmpegQT開發播放使用QT播放

寫在前面:    編寫完視訊的編碼轉碼程式之後,就需要將整個程式重新封裝一下,以便於後續的工作,這裡對應視訊課程中的4-1~4-2。前陣子忙著工作上的事情,也就沒什麼進度,想想還是不應該,QT稍微接觸了

——字串字串函式

字串字面值 用雙引號括起來的內容稱為字串字面量,雙引號中的字元和編譯器自動加入末尾的\0字元,都作為字串儲存在記憶體中,如果字串字面量之間沒有間隔,或者用空白字元分隔,C會將其視為串聯起來的字串字面量。字元陣列名和陣列名一樣,指向該陣列的首元素的地址。字串內部想

第一行程式碼——:Android特色開發——基於位置的服務

目錄: 11.1 基於位置的服務簡介 11.2 申請API Key 11.3 使用百度定位 11.3.1 準備LBS SDK 11.3.2 確定自己位置的經緯度 11.3.3 選擇定位模式 11.3.4 看得懂的位置資訊 11.4 使用百度地圖 11.4.1

網絡文件共享服務samba

windows 計算機 免費軟件 信息服務 全世界 Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。在此之前我們已經了解了NFS和FTP,NFS與samba一樣,也是在網絡中實現文件共享的一種實現,但不幸的是,其不支持windows平臺,而本

Helm-kubernetes的包管理

Helm - K8s的包管理器 11.1 Why Helm   K8s能夠很好的組織和編排容器,但它缺少一個更高層次的應用打包工具,Helm就是幹這個的。   比如對於一個MySQL服務,K8s需要部署如下物件:   (1)Service,讓外界能訪問MySQL   (2)Secret,定義MySQ

Helm-kubernetes的包管理(下)

11.5.5 開發自己的chart     k8s提供了大連官方的chart, 不過要部署微服務,還是需要開發自己的chart:   1  建立chart      Helm會幫助建立目錄mychart,並生成各類chart檔案。我們在此基礎上開發自己的chart.

讀書筆記--《Python基礎教程第二版》-- 文件素材

ja第十一章 文件和素材11.1 打開文件 open函數用來打開文件,語法如下: open(name[,mode[,buffering]]) f = open(r‘/home/python/somefile.txt‘)11.1.1 文件模式r 讀模式w 寫模式a 追加模式b 二進制模式(可添加到其他的模式

Django框架學習——Cookiesession

保存 服務 span 登錄校驗 請求 查看cookie cookie 如何 rom 第十一章 Django框架學習——Cookie和session 一、Cookie簡介 二、裝飾器版登錄校驗 三、session簡介 四、如何在CBV中使用裝飾器 一、Cookie簡介

使用JSP/Servlet技術開發—— Ajax互動擴充套件

1、 jQuery實現Ajax的方法: ●除了$.ajax()方法以外,jQuery還提供了其他多種更簡單的 Ajax 實現方法,如$.get()、$.post()、$.getJSON()、物件.load()等方法; ●$.get()方法:是 jQuery 封裝的傳送 HTTP GET 請求從

Redis開發與運維讀書筆記--快取設計

快取能夠有效地加速應用的讀寫速度,同時也可以降低後端負載,對日常應用的開發至關重要。但是將快取加入應用架構後也會帶來一些問題. 1 快取的收益和成本 收益如下:·加速讀寫:因為快取通常都是全記憶體的(例如Redis、Memcache),而儲存層通常讀寫效能不夠強悍(例如M

Java本地介面(JNI)程式設計指南規範()

第三部分:規範(Part Three: Specification) 第十一章"JNI"設計概要(Overview of the JNI Design) 這章給出了"JNI"設計的概要。如果有需要,我們還提供底層技術的動機。設計概要作為主要的"JNI"概念的規範,例

.NET Core實戰專案CMS 開發篇-資料庫生成及實體程式碼生成器開發

上篇給大家從零開始搭建了一個我們的ASP.NET Core CMS系統的開發框架,具體為什麼那樣設計我也已經在第十篇文章中進行了說明。不過文章釋出後很多人都說了這樣的分層不是很合理,什麼資料庫實體應該跟倉儲放在一起形成領域物件,什麼ViewModel應該放在應用層結構倉儲層與UI層。其實我想

資料庫系統概念(機械工業出版社,六版)複習——:查詢處理查詢優化

第十一章 查詢處理和查詢優化 查詢優化 在所有等效執行計劃中選擇具有最小查詢執行代價的計劃 查詢代價的度量 只用傳輸磁碟塊數以及搜尋磁碟次數來度量查詢計算計劃的代價 tT – 傳輸一個塊的時間 tS

【無私分享:ASP.NET CORE 專案實戰()】Asp.net Core 快取 MemoryCache Redis

1 /// <summary> 2 /// 修改快取 3 /// </summary> 4 /// <param name="key">快取Key</param> 5 ///

—I/O管理磁碟排程【計算機作業系統】

11.1 列出並簡單定義執行I/O的三種技術。 可程式設計I/O:處理器代表程序給I/O模組傳送給一個I/O命令,該程序進入忙等待,等待操作的完成,然後才可以繼續執行。 中斷驅動I/O:處理器代表程序向I/O模組傳送一個I/O命令,然後繼續執行後續指令,當I/O模組完

敏捷軟件開發

構建 工作 容易 說明 畫圖 很多 模式 它的 無需 第10章 Liskov 替換原則(LSP) 原則解釋: 子類型(sbutype)必須能夠替換掉它們的基類型(base type) 這一章沒大看懂,貌似和 OCP(開發關閉原則)關系很大,以後再研究

抽象封裝

包括 his 根據 直觀 this 容易 love 完整 自定義 1. 從實現中抽象出類的步驟:  1)找出它的種類——類名(類名一般是名字)  2)找出它的屬性——字段的名字  3)找出它的行為——方法名 2. 抽象的原則   根據面向對象的思想抽象出類 3. 類團的好處

構建讀後感

思維導圖 我們 加減乘除 圖形 計算 每日 導圖 case 中間 本周進行了構建之法的第十一章軟件設計與實現的學習; 第十一章主要講了典型的開發流程,常見的分析和設計方法:ERD,DFD,UML,開發階段的一些管理方法:每日構建,小強地獄,構建大師; 分析和設計方法包括以文

我的學習路__字符流

之間 才會 fileutil output keys 返回 ont 讀取數據 一個 【字符流】 IO流的分類 ★字節流 操作的文件不是文本文件 字節輸入流: InputStream 抽象類 FileInputStream操作文件的字節輸入流 字節輸出流: OutputStr