使用Qmake单独编译ffplay,基于ffmpeg6.0

92 阅读1分钟

1. 背景

ffmpeg是一个巨大的开源宝库,其中的ffplay是音视频开发者不能不看的优秀框架案例。静态的代码固然晦涩难明,如果能够调试和添加log,对于我们的研究学习当然会事半功倍,单独编译ffplay便是出于此目的。

2. 环境

  1. 本文是在mac进行的实验,linux和win的情况大致类似。
  2. 需要安装SDL2
  3. 最好是之前有源码编译过一次ffmpeg,并且系统中存放的库和本次ffplay编译需要的一致(换言之,同一包代码里面出来的),以免发生由于版本不同函数link不到的现象。ffmpeg6.0的编译可以参考我的另外一篇文章FFmpeg编译及开发环境搭建

3. 项目搭建

3.1 代码目录

首先新建Qt qmake项目,然后移植ffmpeg目录下的代码,整体结构如下。

# 当前工作环境目录
ffplay_qmake
├── cmdutils.c
├── cmdutils.h
├── ffplay.c
├── ffplay_qmake.pro
├── ffplay_qmake.pro.user
├── fopen_utf8.h
├── opt_common.c
└── opt_common.h

其中ffplay_qmake.pro,ffplay_qmake.pro.user为Qt项目生成,.pro文件需要我们具体提供构建指令,.user为QtCreator使用,我们不必修改。
另外,ffplay.c, cmdutils.h, cmdutils.c, opt_common.h, opt_common.c, fopen_utf8.h这些文件均拷贝于ffmpeg源码的fftools目录。
另外说明下这里的构建原则,对于fftools文件夹里面的代码,需要源码编译,所以需要拷贝到项目中。对于ffmpeg几大.so库, 以静态连接的方式引入使用。

3.2 qmake构建指令

下面是ffplay_qmake.pro文件中的内容

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
# CONFIG -= qt

INCLUDEPATH += /usr/local/include/SDL2 \
               /usr/local/include/ \
               /Users/zhou/workspace/third_src/ffmpeg_src/FFmpeg \ # 这里是ffmpeg的源码目录

LIBS += -L/usr/local/lib/ \
        -lavutil \
        -lavformat \
        -lavdevice \
        -lavfilter \
        -lswresample \
        -lswscale \
        -lpostproc \
        -lavcodec \
        -lSDL2 \

SOURCES += cmdutils.c \
           ffplay.c \
           opt_common.c

HEADERS += \
    cmdutils.h \
    fopen_utf8.h \
    opt_common.h