ubuntu下Cmake链接ffmpeg库

该博客主要讲述在Ubuntu系统下,使用Cmake链接FFmpeg库的相关内容,涉及信息技术中后端开发与音视频编解码领域。
cmake_minimum_required(VERSION 3.0)
project(player)

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_FLAGS "-D__STDC_CONSTANT_MACROS")

set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h)
find_library(AVCODEC_LIBRARY avcodec)

find_path(AVFORMAT_INCLUDE_DIR libavformat/avformat.h)
find_library(AVFORMAT_LIBRARY avformat)

find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h)
find_library(AVUTIL_LIBRARY avutil)
set(CMAKE_CXX_FLAGS "-D__STDC_CONSTANT_MACROS")
find_path(AVDEVICE_INCLUDE_DIR libavdevice/avdevice.h)
find_library(AVDEVICE_LIBRARY avdevice)

include_directories(

       /usr/local/include/
)

link_directories(
  #     /home/rui/repos/ffmpeg/
        /usr/local/lib
#       /home/rui/repos/ffmpeg/libswscale
#       /home/rui/repos/ffmpeg/libavformat
)
INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)

add_executable(player main.c)
message(STATUS ${AVCODEC_LIBRARY})
target_include_directories(ffmpeg_c  PRIVATE ${AVCODEC_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR} ${AVUTIL_INCLUDE_DIR} ${AVDEVICE_INCLUDE_DIR})
target_link_libraries(ffmpeg_c PRIVATE ${AVCODEC_LIBRARY} ${AVFORMAT_LIBRARY} ${AVUTIL_LIBRARY} ${AVDEVICE_LIBRARY} ${SDL2_LIBRARIES}  pthread   swresample m swscale
        avcodec avutil avfilter avdevice postproc z lzma  rt)

 

<think> 我们正在处理一个在Ubuntu系统下使用CMake引入FFmpeg的请求。根据用户提供的引用[1]和[3],我们可以得知在Ubuntu中,FFmpeg通常安装在标准路径下,例如`/usr/lib/x86_64-linux-gnu`(文件)和`/usr/include/x86_64-linux-gnu`(头文件)。此外,引用[3]提到需要设置环境变量以确保程序运行时能找到动态。 我们将创建一个适用于UbuntuCMake示例配置,并注意以下几点: 1. 使用`include_directories`添加FFmpeg头文件路径。 2. 使用`link_directories`添加FFmpeg文件路径。 3. 设置链接,注意在Ubuntu下通常省略后缀(也可以使用带.so的完整名称,但更通用的做法是使用短名称)。 4. 添加可执行文件并链接FFmpeg。 5. 考虑添加必要的系统(如dl和pthread)。 另外,根据引用[1]的示例,我们可以直接使用其设置,但稍作改进以避免硬编码路径,使其更通用。 改进思路: - 使用`find_package`或`pkg_check_modules`来查找FFmpeg(如果系统支持pkg-config)。 - 如果找不到,则回退到默认路径(如引用[1]中的路径)。 但是,考虑到用户要求的是Ubuntu下的示例,且引用[1]已经给出了一个可行的CMakeLists.txt,我们将以此为基础,并加入一些健壮性检查。 步骤: 1. 尝试使用pkg-config查找FFmpeg(推荐方式)。 2. 如果找不到,再使用硬编码路径(并给出警告)。 以下是CMakeLists.txt示例: </think> ### Ubuntu 系统下 CMake 引入 FFmpeg 的完整方法 #### 步骤 1:安装 FFmpeg 开发 ```bash # 安装 FFmpeg 开发文件(包含头文件和静态) sudo apt update sudo apt install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavdevice-dev ``` #### 步骤 2:创建 CMakeLists.txt 配置 ```cmake cmake_minimum_required(VERSION 3.10) project(FFmpeg_Demo) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 1. 自动查找 FFmpeg 组件 find_package(PkgConfig REQUIRED) pkg_check_modules(FFMPEG REQUIRED libavcodec libavformat libavutil libswscale ) # 2. 设置包含路径和链接 include_directories(${FFMPEG_INCLUDE_DIRS}) link_directories(${FFMPEG_LIBRARY_DIRS}) # 3. 添加可执行文件 add_executable(ffmpeg_demo main.cpp) # 4. 链接 FFmpeg target_link_libraries(ffmpeg_demo ${FFMPEG_LIBRARIES} pthread # FFmpeg 需要线程支持 dl # 动态加载支持 ) # 5. 禁用弃用警告 target_compile_options(ffmpeg_demo PRIVATE -Wno-deprecated-declarations ) # 6. 验证 FFmpeg 版本 message(STATUS "Found FFmpeg v${FFMPEG_VERSION}") message(STATUS "Include paths: ${FFMPEG_INCLUDE_DIRS}") message(STATUS "Library paths: ${FFMPEG_LIBRARY_DIRS}") ``` #### 步骤 3:创建测试代码 (main.cpp) ```cpp #include <iostream> extern "C" { #include <libavformat/avformat.h> } int main() { avformat_network_init(); // 初始化网络模块 std::cout << "FFmpeg 版本: " << av_version_info() << std::endl; std::cout << "支持的协议: \n"; // 列出支持的协议 const AVProtocolInfo* protocol = nullptr; while ((protocol = av_protocol_next(protocol))) { if (protocol->name) { std::cout << " - " << protocol->name << "\n"; } } return 0; } ``` #### 步骤 4:编译运行 ```bash # 创建构建目录 mkdir build && cd build # 生成 Makefile cmake .. # 编译项目 make -j$(nproc) # 运行示例 ./ffmpeg_demo ``` ### 配置说明与注意事项 1. **路径自动检测**: - 使用 `pkg_check_modules` 自动查找 FFmpeg 安装路径[^1] - 输出调试信息验证路径: ```bash -- Found FFmpeg v5.1.2 -- Include paths: /usr/include/x86_64-linux-gnu -- Library paths: /usr/lib/x86_64-linux-gnu ``` 2. **必要依赖**: ```cmake target_link_libraries(ffmpeg_demo ${FFMPEG_LIBRARIES} pthread # 必须添加 dl # 必须添加 ) ``` 3. **环境变量配置**(可选): ```bash # 确保运行时找到动态 export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH ``` 4. **自定义路径**(如果非标准安装): ```cmake include_directories(/custom/path/include) link_directories(/custom/path/lib) ``` ### 验证安装成功的关键指标 1. **编译输出**应显示 FFmpeg 版本: ``` -- Found FFmpeg v5.1.2 ``` 2. **程序输出**应显示版本和协议列表: ``` FFmpeg 版本: 5.1.2 支持的协议: - file - tcp - udp ... ``` ### 常见问题解决 1. **找不到 FFmpeg **: ```bash # 手动检查位置 find /usr -name libavcodec.so 2>/dev/null # 安装缺失的开发包 sudo apt install libavcodec-dev ``` 2. **链接错误**: ```cmake # 添加 -Wl,--as-needed 解决链接顺序问题 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") ``` 3. **版本兼容性问题**: ```cmake # 指定最低版本要求 pkg_check_modules(FFMPEG REQUIRED libavcodec>=58 libavformat>=58 ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值