ffplay调试环境搭建

软件维
• 阅读 1257

前言

ffplay是基于FFmpeg的最简单的官方播放器。麻雀虽小,五脏俱全,虽说ffplay简单,但是各种播放器应有的功能一一俱全,说它简单或许仅仅是因为它只有一个点c文件而已吧。

想要开发一个优秀的播放器,参考是必不可少的,毕竟control c和control v是程序员天生的本能。以前遇到播放的问题向人请教的时,经常听到的一句话就是去看看ffplay是怎么处理的就知道怎么过解决了呀,
可见ffplay在播放领域的地位不一般。。。

而且想要学好FFmpeg,在了解了FFmpeg的基本知识和相关API之后,再结合项目实战是非常有必要的。但是光是跑马观花式的看看ffplay的源码可能收获甚微,要想深入去了解ffplay内部的大致细节,集成源码断点调试是必可少的。
后续笔者将用几篇文章介绍ffplay的一些主要的功能点,但是想要了解ffplay单靠几篇文章肯定是不够的,笔者更加希望的是这几篇博客能起到抛砖引玉的作用,引导大家更加深入地学习了解。。。

所谓兵马未动,粮草先行,今天我们就先搭建好ffplay的调试环境,方便大家后续的学习调试。

环境搭建

笔者所使用的环境是:Mac系统和Clion开发工具。笔者集成的FFmpeg的版本是使用Homebrew安装的ffmpeg5.0

1、编译集成FFmpeg库
ffplay的调试环境搭建是建立在笔者之前的文章 《FFmpeg连载1-开发环境搭建》 之上,首先需要集成FFmpeg的相关库,这一步大家参考笔者之前的文章即可。

2、新建Clion工程

新建好CLion工程后(注意是C工程,不是C++工程),我们就需要下载FFmpeg的源码了,注意这个源码的版本最好和前面集成FFmpeg的版本好一样,即使不一样版本呢之间也不要相差太远,不然可能会因为版本的原因导致一些功能或头文件对应不上。

3、生成config.h头文件

下载好FFmpeg的源码后,我们需要进入到源码目录执行一下./configure命令行,这一步的目的是生成config.h头文件。然后找到文件config.h并拷贝到我们新建CLion工程中去。

4、拷贝fftools目录下的相关文件

我们将源码目录fftools下的三个文件拷贝进去我们的CLion工程,这三个文件分别是cmdutils.ccmdutils.hffplay.c

5、拷贝va_copy.h头文件

将源码目录compat下的头文件va_copy.h也拷贝进去我们新建的CLion目录,到这里我们所需的源文件是算是准备完成了。

6、修改CMakeLists.txt

修改CMakeLists.txt如下,主要相关库的路径要替换成自己的FFmpeg库和SDL库的真实路径。

cmake_minimum_required(VERSION 3.21)
# 这里是工程名称  C工程
project(FFplay_debug C)

set(CMAKE_C_STANDARD 99)

cmake_minimum_required(VERSION 3.17)

# FFmpeg的安装目录,可以通过命令"brew info ffmpeg"获取
# 需要替换成自己的FFMpeg安装目录
set(FFMPEG_DIR /opt/homebrew/Cellar/ffmpeg/5.0)

# SDL2的安装目录,可以通过命令"brew info sdl2"获取
# 需要替换成自己的SDL2安装目录
set(SDL2_DIR /opt/homebrew/Cellar/sdl2/2.0.20)

# 头文件搜索路径
include_directories(${FFMPEG_DIR}/include/)

include_directories(${CMAKE_SOURCE_DIR})

include_directories(${SDL2_DIR}/include/SDL2/)

# 动态链接库或静态链接库的搜索路径
link_directories(${FFMPEG_DIR}/lib/)

link_directories(${SDL2_DIR}/lib/)

#将指定文件设置在FFmpeg_test_source变量中
file(GLOB FFplay_debug_source ${CMAKE_SOURCE_DIR}/*.*)

add_executable(FFplay_debug ${FFplay_debug_source} cmdutils.c)

#链接库
target_link_libraries(FFplay_debug
        #FFmpeg 库
        avcodec
        avdevice
        postproc
        avfilter
        avformat
        avutil
        swresample
        swscale
        # SDL2库
        SDL2
        )

7、debug测试

然后就可以愉快地进行断点调试了,找到ffplay.c的main函数,打一个断点,然后debug运行一下。

ffplay调试环境搭建

同理,如果童鞋们想要调试一下ffprobe.c或ffmpeg.c也可以使用同样的方式集成即可。

可能遇到的问题

1、SDL2没有安装

ffplay是需要依赖SDL进行画面的展示和声音的播放的。所以集成的前提是需要安装好SDL2。

2、文件"cmdutils.c"找不到头文件"libavutil/libm.h"

笔者集成的时候就遇到了这个问题,解决方案就是直接注释掉即可。

推荐阅读

FFmpeg连载1-开发环境搭建
FFmpeg连载2-分离视频和音频
FFmpeg连载3-视频解码
FFmpeg连载4-音频解码
FFmpeg连载5-音视频编码
FFmpeg连载6-音频重采样
FFmpeg连载8-视频合并以及替换视频背景音乐实战

关注我,一起进步,人生不止coding!!!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
软件维
软件维
Lv1
今朝有酒今朝醉,明日愁来明日愁。
文章
2
粉丝
0
获赞
0