背景
为了研究ffplay的源码细节,打算使用Qt Creator这个IDE中运行并调试打印ffplay,深入研究ffplay的播放细节。
解决的思路是:编译出ffplay编译依赖包(FFmpeg,SDL2),新建工程,在工程引入对应的头文件及库,编译运行ffplay。
安装SDL
ffplay底层使用的SDL进行渲染显示的,所以需要首先安装SDL。
官网
http://www.libsdl.org/
编译
# cd SDL2-2.0.12
# ./configure
# make ; make install
测试
# cd SDL2-2.0.12/test
# ./configure
# make
# ./testyuv
如果可以出现画面窗口,则表示SDL安装成功。
遇到的问题: No available video device
原因:缺少显示设备库
sudo apt-get install libx11-dev
sudo apt-get install xorg-dev
问题: /usr/bin/ld: cannot find -lGL
原因: 缺少GL库
apt-get install libgl1-mesa-dev
安装FFmpeg
安装x264
git clone https://code.videolan.org/videolan/x264.git
./configure --enable-shared --enable-static --disable-asm
make ; make install
安装FFmpeg
./configure --enable-gpl --enable-shared --enable-libx264 --enable-avresample --disable-x86asm
make ; make install
默认安装目录为/usr/local。
如果这样编译,是会报错的,原因是需要生成动态库。报错信息如下:
/usr/bin/ld: libavcodec/mqc.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
libavcodec/mqc.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [libavcodec/libavcodec.so.57] Error 1
解决方式:
fPIC的全称是 Position Independent Code, 用于生成位置无关代码。
-fPIC:表示编译为位置独立的代码
在ffbuild目录下,编辑 config.mak:
CPPFLAGS= -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -fPIC -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -DPIC -DZLIB_CONST
在CPPFLAGS标志后面,增加-fPIC。注意:CFLAGS默认是有的,不要加错。
参考:https://blog.csdn.net/ssf1987/article/details/81118631
安装Qt Creator
从Qt官网下载:qt-opensource-linux-x64-5.12.3.run
增加可执行权限,运行安装即可。
新建工程
新建纯C工程,临时命名为hello1
修改hello1.pro如下:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
cmdutils.c \
ffplay.c
# The include path and libs of FFmpeg
INCLUDEPATH += /usr/local/include \
/root/ffmpeg-3.4.7 \
LIBS += -L/usr/local/lib -lavformat \
-lavdevice \
-lavcodec \
-lavfilter \
-lavutil \
-lswresample \
-lswscale \
-lpostproc \
# The include path and libs of SDL2
INCLUDEPATH += /usr/local/include/SDL2
LIBS += -L/usr/local/lib -lSDL2
HEADERS += \
cmdutils.h \
config.h
添加ffplay.c源文件及依赖的头文件和C文件。主要依赖的文件为:
- config.h 系统配置信息
- cmdutils.c/h 应该是用来解析命令行参数
添加FFmpeg头文件和动态库
-
/usr/local/include FFmpeg默认安装路径之头文件路径,包括部分头文件
-
/root/ffmpeg-3.4.7 FFmpeg源码目录,可以提供安装目录提供不了的头文件
-
/usr/local/lib FFmpeg安装路径之动态库路径
对应的SDL2的路径配置跟FFmpeg配置类似。
运行
至此,工程可以正常编译,并且运行。但是,没有输入参数,所以很快就结束了。
添加命令行参数:
点击运行按钮,效果如下: