音视频开发4-补充 ubuntu安装qt5,qt5上使用ffmpeg,ubuntu 上安装sdl,

1. 环境搭建前说明

本节基于安装完成ffmpeg后的操作。
如果不使用ffmpeg,可以不用安装ffmpeg,文章参考之前的博客: 音视频开发4-补充 FFmpeg 开发环境搭建 -- 配置环境 Ubuntu 22.04.2 LTS +FFmpeg 7.0

2 安装qt-5.12.10

安装QT
下载地址: https://download.qt.io/archive/qt/
下载地址: https://download.qt.io/archive/qt/5.12/5.12.10/

3. 将下载好的文件从windows上移动到linux上

下载好的文件qt安装文件是在windows上的,那么就需要将可执行文件放到linux上执行。

这里是通过vmware的共享文件夹 实现的,将windows下的D:\linuxgongxiang 文件夹下的会自动映射到linux 下的 /mnt/hgfs/linuxgongxiang

4.给该文件 可执行权限

chmod +x qt-opensource-linux-x64-5.12.10.run

5.运行安装文件

然后运行 ./qt-opensource-linux-x64-5.12.10.run

6.启动安装完成后的可执行文件

运行完毕后,在/home/hunandede/qt/Qt5.12.10/Tools/QtCreator/bin 中可以启动 qtcreator
./qtcreator

7. 第一次运行会有问题,报错如下

ubuntu安装qt5 Could not load the Qt platform plugin "xcb" in ""
even though it was found.
https://blog.csdn.net/u012768805/article/details/98756925

8. fix 方案

需要安装:
sudo apt install --reinstall libxcb-xinerama0

9.以sudo 执行没有问题

./qtcreator  无法打开 qtcreator

sudo ./qtcreator  正确打开 qtcreator

10.直接执行./qtcreator

Ubuntu16.04打开Qt显
示/home/user/ .config /QtProject/qtcreator/qtversion.xml :
Permission denied
权限不够所导致,执⾏命令 sudo chown -R user:user ~/.config/ 即可解决。
默认需要使⽤sudo权限启动
不是sudo权限也能启动则需要修改权限
2 语法:sudo chown -R username:username ~/.config/
⽐如我的ubuntu:
sudo chown -R hunandede:hunandede ~/.config/

11.QT使⽤FFmpeg

之前我们在ubutun 上的build 的ffmpeg 的路径是:

/home/hunandede/ffmpeg_build

其中bin 下放的是 x265的可执行文件

include 目录下放的是 .h文件

lib 下放的是 动态库文件

因此要在 .pro文件中设置 INCLUDEPATH,表示我在代码中使用到的 头文件 会在如下的路径中查找

还要在.pro 文件中,设置LIBS,表示我运行时要使用的 静态库 或者 动态库 会在如下的文件中查找。

当前测试中,由于ffmpeg 是我们自己build 的 静态库,因此写法如下:

12. 代码举例

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
        main.c

INCLUDEPATH += /home/hunandede/ffmpeg_build/include

LIBS += /home/hunandede/ffmpeg_build/lib/libavcodec.a \
/home/hunandede/ffmpeg_build/lib/libavdevice.a \
/home/hunandede/ffmpeg_build/lib/libavfilter.a \
/home/hunandede/ffmpeg_build/lib/libavformat.a \
/home/hunandede/ffmpeg_build/lib/libavutil.a \
/home/hunandede/ffmpeg_build/lib/libswresample.a \
/home/hunandede/ffmpeg_build/lib/libswscale.a

#include <stdio.h>

// 包含ffmpeg头⽂件

#include "libavutil/avutil.h"

int main()
{
    printf("Hello World!\n");
    printf("Hello FFMPEG, version is %s\n", av_version_info());
    return 0;
}

结果:

11:04:37: Starting /home/hunandede/build-demo01_c-Desktop_Qt_5_12_10_GCC_64bit-Debug/demo01_c ...
Hello World!
Hello FFMPEG, version is 7.0

13. 后续TODO:使用动态库的时候,是否只需要将.a文件换成.so文件呢?不是,因为动态库的加载

LIBS += /home/hunandede/ffmpeg_build/lib/libavcodec.so \
/home/hunandede/ffmpeg_build/lib/libavdevice.a \
/home/hunandede/ffmpeg_build/lib/libavfilter.a \
/home/hunandede/ffmpeg_build/lib/libavformat.a \
/home/hunandede/ffmpeg_build/lib/libavutil.a \
/home/hunandede/ffmpeg_build/lib/libswresample.a \
/home/hunandede/ffmpeg_build/lib/libswscale.a

14. linux 下安装sdl2

1. 下载SDL源码库,SDL-release-2.30.3
2. 解压,然后依次执⾏命令
./autogen.sh
./configure --prefix=/home/hunandede/ffmpeg_build --bindir = /home/hunandede/ bin
make
sudo make install

--prefix选项是配置安装的路径,一般 .h文件,静态库,动态库文件都会在这个目录下。

--bindir 选项指定二进制文件的安装位置,这里的二进制文件定义为可以被用户直接执行的程序

15. sdl2的使用

INCLUDEPATH += /home/hunandede/ffmpeg_build/include

LIBS += /home/hunandede/ffmpeg_build/lib/libSDL2.a

#include <stdio.h>

// 包含ffmpeg头⽂件

#include "libavutil/avutil.h"
#include <SDL2/SDL_version.h>
#include <SDL2/SDL_log.h>

int main()
{
    printf("Hello World!\n");
    printf("Hello FFMPEG, version is %s\n", av_version_info());

        SDL_version compiled;
        SDL_version linked;

        SDL_VERSION(&compiled);
        SDL_GetVersion(&linked);

        SDL_Log("We compiled against SDL version %u.%u.%u ...\n",
                    compiled.major, compiled.minor, compiled.patch);
        SDL_Log("But we are linking against SDL version %u.%u.%u.\n",
                    linked.major, linked.minor, linked.patch);

    return 0;
}

16. linux_2-sdl-basic项⽬  linux_2-sdl-yuv  TODO

17. windows 中搭建 QT环境 

音视频开发4 FFmpeg windows 环境搭建,QT 安装,动态库的搜索路径-CSDN博客

在这个博客中,有更多的加载静态库和动态库的方法。如果在开发中遇到问题,请也要参考这个文章。

其核心区别是:如果指定的是动态库,例如:libavcodec.dll.a,还需要指定真正的使用到的动态库的路径,因为.dll.a 的作用是:用于MinGW编译器中(MinGW gcc/g++,MinGW则是指Minimalist GNU for Windows的缩写),并不是真正的dll的

.dll.a ,   ffmpeg中的 .lib 并不存放真正的函数代码本体
只是包含了函数所在的DLL文件和文件中 函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

因此还需要指定真正使用的 dll 的具体位置,在这之前,还需要了解dll 在windows 的加载顺序问题。下图的写法是将要用到的dll 的

18   .dll、.lib、.dll.a  .so 文件   .a 的区别

windows 下:

  静态库:提供2分文件:

  (1).h 文件【包含lib中输出的类,以及函数原型】, 需要将该文件包含如“程序源文件”中

  (2).lib静态文件【包含对函数的声明与实现】  编译期间使用, 最终放入exe执行文件中,且最终的exe文件较大;

  因此:自己可以逐步把自己用gcc编译源文件生成的obj文件通过tlib命令加入到一个lib文件中,也可以把lib文件内的obj文件进行删除操作,还可以把内部的obj文件给提取出来。

 动态库:提供3分文件:

  (1).h文件【包含dll输出类型,以及函数原型】, 需要将文件包含入“程序源文件”中

  (2).lib静态导入文件【只包含对实现部分dll的导出声明】是编译器生成dll时自动生成的lib文件。

  (3).dll动态库【函数的实现部分】  “编译阶段”使用lib, 运行期间使用dll,因此如果要通过源码的编译,则需要lib库引入,如果要后续生成的执行文件运行起来,则需要dll放在exe的同目录下,最终的exe文件较小;

 

静态库的lib:即包括函数实现的声明索引信息,也有函数实现内容;  其实质是:多个obj文件的集合, obj文件是源码cpp文件“编译”后生成的obj。因此在编译静态库是根本不会出现“链接问题错误”;

动态库的lib:是在【编译-连接】生成dll后生成的文件。只包含函数实现的声明索引信息,不是obj文件的集合,只记录了dll文件中的函数的入库和地址信息,dll文件是函数的具体实现部分。

里面有三种文件后缀分别为:.lib、.def、.dll.a 。
.def:暂时还不太清楚。
.lib:用于MSVC编译器中 (MSVC 微软自己的编译器)
.dll.a:用于MinGW编译器中(MinGW gcc/g++,MinGW则是指Minimalist GNU for Windows的缩写)

这三个文件里面并不存放真正的函数代码本体
只是包含了函数所在的DLL文件和文件中 函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

linux  下:

.a 就是 linux 中的静态库

.so 就是 linux 中的动态库

19 dll 的加载问题

exe在寻找dll文件时,大概按照以下优先级顺序去查找(这里只列出了大概的搜索路径,并没有写全):

exe所在的目录

Windows的System目录

C:/Windows/System
C:/Windows/System32
Windows目录

C:/Windows
环境变量Path中的路径

所以可以考虑将%FFMPEG_HOME%/bin目录配置到Path变量中
置于如何配置Windows的环境变量Path,这是基本开发常识了,就不再讲解了


第1种方式需要在每一个Qt程序中都拷贝一份FFmpeg的dll文件,

第2~4种方式可以让多个Qt程序共用同一份FFmpeg的dll文件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值