ubuntu中使用ffmpeg库进行api调用开发

一般情况下,熟悉了ffmpeg的命令行操作,把他当成一个工具来进行编解码啥的问题不大,不过如果要把功能集成进自己的软件中,还是要调用ffmpeg的api才行。

ffmpeg的源码和外带的模块有点太多了,直接用官网别人编译好的库就可以了,下面的操作就是演示使用cmake调用ffmpeg的库,来进行api的开发。

我把最后的工程包放到了我的下载资源里面了:ubuntu中使用ffmpeg库进行开发的cmake工程资源-CSDN文库

1 下载编译好的ffmpeg库

去如下网址下载自己想要的平台的库文件:  

Releases · BtbN/FFmpeg-Builds · GitHub

 对于ubuntu,下载linux amd64版本。

2 新建cmake工程文件夹架构

就是新建一个工程文件夹,里面包含几个子文件夹,把ffmpeg的库放到lib文件夹里面。

├── build
├── CMakeLists.txt
├── inc
├── lib
│   ├── CMakeLists.txt
│   └── ffmpeg_lib
└── src
    ├── CMakeLists.txt
    ├── module
    └── system

上面是我的一个文件夹结构,我把ffmpeg的库放到lib文件夹中,自己的代码放到src里面,顶层有CMakeLists.txt,各个子文件夹有各自的CMakeLists.txt。

3 编写CMakeLists.txt,然后编译

顶层的cmakelists.txt


#version required
cmake_minimum_required(VERSION 3.22.1)

#project name
project(ffmpeg_test VERSION 1.0.0)

#include dir
include_directories(inc)
link_directories(lib)

#ffmpeg lib
include_directories(lib/ffmpeg_lib/include)
link_directories(lib/ffmpeg_lib/lib)

#configs
set(BUILD_SHARED_LIBS on)   #shared libs
set(CMAKE_BUILD_TYPE debug) #debug mode

message(STATUS build_type:${CMAKE_BUILD_TYPE})
if(CMAKE_BUILD_TYPE)
    set(CMAKE_C_FLAGS_DEBUG "-O2 -DDEBUG")
    message(STATUS c_flags:${CMAKE_C_FLAGS_DEBUG})
else()
    message(STATUS build_type:${CMAKE_BUILD_TYPE})
endif()

#subdirectory
add_subdirectory(src)
add_subdirectory(lib)

message(STATUS "project version:${PROJECT_VERSION}")
message(STATUS system_name:${CMAKE_HOST_SYSTEM_NAME}) 
message(STATUS system_processor:${CMAKE_HOST_SYSTEM_PROCESSOR}) 
message(STATUS host_system:${CMAKE_HOST_SYSTEM}) 
message(STATUS system_version:${CMAKE_HOST_SYSTEM_VERSION})


lib文件夹的cmakelists.txt


set(ffmpeg_lib_dir, ffmpeg_lib/lib)
set(ffmpeg_header_dir, ffmpeg_lib/include)

#IMPORT exist SHARED libs
add_library( avcodec SHARED IMPORTED)
add_library( avfilter SHARED IMPORTED )
add_library( swresample SHARED IMPORTED )
add_library( swscale SHARED IMPORTED )
add_library( avformat SHARED IMPORTED )
add_library( avutil SHARED IMPORTED )


#set lib link dir
set_target_properties( avcodec PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavcodec.so )
set_target_properties( avfilter PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavfilter.so )
set_target_properties( swresample PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libswresample.so )
set_target_properties( swscale PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libswscale.so )
set_target_properties( avformat PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavformat.so )
set_target_properties( avutil PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavutil.so )

#add include and library directories to system
include_directories(ffmpeg_lib/include)
link_directories(ffmpeg_lib/lib)

#link librarys to system
#target_link_libraries(${PROJECT_NAME}  avcodec avformat avutil swresample swscale swscale avfilter )

#get_property(inc_dirs DIRECTORY ./ PROPERTY INCLUDE_DIRECTORIES)
#get_property(lib_dirs DIRECTORY ./ PROPERTY LINK_DIRECTORIES)
#message("cmake ffmpeg... \n include_dirs=${inc_dirs} \n lib_dirs=${lib_dirs}")








src文件夹的cmakelists.txt


#include directory
include_directories(module)
link_directories(module)

#subdirectory
add_subdirectory(module)
add_subdirectory(system)

get_property(inc_dirs DIRECTORY ./ PROPERTY INCLUDE_DIRECTORIES)
get_property(lib_dirs DIRECTORY ./ PROPERTY LINK_DIRECTORIES)
message("cmake src... \n include_dirs=${inc_dirs} \n lib_dirs=${lib_dirs}")

system子文件夹的cmakelists.txt




#bin file, before libs
#aux_source_directory(./ system_files)
#add_executable(${PROJECT_NAME} ${system_files})
#add_executable(${PROJECT_NAME} mux.c)
#add_executable(${PROJECT_NAME} demux_decode.c)
add_executable(${PROJECT_NAME} decode_filter_video.c)

#libs
target_link_libraries(${PROJECT_NAME} PRIVATE   
                        module                  #link local module lib
                        avcodec avformat avutil swresample swscale swscale avfilter #link ffmpeg lib
                        m)                      #link libm.so for math operations



set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

进入build文件夹,执行命令:

cmake ../
make
oushaojun@oushaojun-virtual-machine:~/Desktop/ffmpeg/cmake_project/build$ cmake ../
-- build_type:debug
-- c_flags:-O2 -DDEBUG
cmake src... 
 include_dirs=/home/oushaojun/Desktop/ffmpeg/cmake_project/inc;/home/oushaojun/Desktop/ffmpeg/cmake_project/lib/ffmpeg_lib/include;/home/oushaojun/Desktop/ffmpeg/cmake_project/src/module 
 lib_dirs=/home/oushaojun/Desktop/ffmpeg/cmake_project/lib;/home/oushaojun/Desktop/ffmpeg/cmake_project/lib/ffmpeg_lib/lib;/home/oushaojun/Desktop/ffmpeg/cmake_project/src/module
-- project version:1.0.0
-- system_name:Linux
-- system_processor:x86_64
-- host_system:Linux-6.8.0-49-generic
-- system_version:6.8.0-49-generic
-- Configuring done
-- Generating done
-- Build files have been written to: /home/oushaojun/Desktop/ffmpeg/cmake_project/build
oushaojun@oushaojun-virtual-machine:~/Desktop/ffmpeg/cmake_project/build$ make
Consolidate compiler generated dependencies of target module
[ 50%] Built target module
Consolidate compiler generated dependencies of target ffmpeg_test
[100%] Built target ffmpeg_test
oushaojun@oushaojun-virtual-machine:~/Desktop/ffmpeg/cmake_project/build$ 

去build/bin中就可以看到最后的可执行文件了,当前的可执行程序都是官方的demo,要写自己的代码一样的套路。

ffmpeg的api使用不是很复杂,不过比较底层,要想集成进自己的项目里面,工作量不小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935095.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Ubuntu】URDC(Ubuntu远程桌面助手)安装、用法,及莫名其妙进入全黑模式的处理

1、简述 URDC是Ubuntu远程桌面助手的简称。 它可以: 实时显示桌面:URDC支持通过Windows连接至Ubuntu设备(包括x86和ARM架构,例如Jetson系列、树莓派等)的桌面及光标。远程操控双向同步剪切板多客户端连接:同一Ubuntu设备最多可同时被三台Windows客户端连接和操控,适用于…

备忘录模式的理解和实践

引言 在软件开发中,我们经常会遇到需要保存对象状态并在某个时间点恢复到该状态的需求。这种需求类似于我们平时说的“后悔药”,即允许用户撤销之前的操作,恢复到某个之前的状态。备忘录模式(Memento Pattern)正是为了…

云端微光,AI启航:低代码开发的智造未来

文章目录 前言一、引言:技术浪潮中的个人视角初次体验腾讯云开发 Copilot1.1 低代码的时代机遇1.1.1 为什么低代码如此重要? 1.2 AI 的引入:革新的力量1.1.2 Copilot 的亮点 1.3 初学者的视角1.3.1 Copilot 带来的改变 二、体验记录&#xff…

(css)element中el-select下拉框整体样式修改

(css)element中el-select下拉框整体样式修改 重点代码(颜色可行修改) // 修改input默认值颜色 兼容其它主流浏览器 /deep/ input::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.50); } /deep/ input::-moz-input-placeholder {color: rgba…

Ungoogled Chromium127编译指南 Windows篇 - 获取源码(七)

1. 引言 在完成所有必要工具的安装和配置后,我们进入了Ungoogled Chromium编译过程的第一个关键阶段:获取源代码。本文将详细介绍如何正确获取和准备Ungoogled Chromium的源代码,为后续的编译工作打下基础。 2. 准备工作 2.1 环境检查 在…

802数据结构:2022年真题选择题

目录 前言 一、 选择题(本大题共 15小题,每小题 2分,共 30分) 1、当输入非法错误时一个“好”的算法会进行适当处理而不会产生难以理解的输出结果。这称为算法的()。A可读性    B.健壮性    C.正确性…

汽车零部件设计之——发动机曲轴预应力模态分析仿真APP

汽车零部件是汽车工业的基石,是构成车辆的基础元素。一辆汽车通常由上万件零部件组成,包括发动机系统、传动系统、制动系统、电子控制系统等,它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天,汽车零部件需…

QT实战--带行号的支持高亮的编辑器实现(2)

本文主要介绍了第二种实现带行号的支持高亮的编辑器的方式,基于QTextEdit实现的,支持自定义边框,背景,颜色,以及滚动条样式,支持输入变色,复制文本到里面变色,支持替换,是一个纯专业项目使用的编辑器 先上效果图: 1.头文件ContentTextEdit.h #ifndef CONTENT_TEXT_…

【JAVA】旅游行业中大数据的使用

一、应用场景 数据采集与整合:全面收集旅游数据,如客流量、游客满意度等,整合形成统一数据集,为后续分析提供便利。 舆情监测与分析:实时监测旅游目的地的舆情信息,运用NLP算法进行智能处理,及…

vxe-grid使用问题

目录 1.slot中使用模板字符串 2.合并表头 坑1:合并表头后一窜一窜的位置 坑2:合并表头后页面位置不够大,表头合并的位置就又窜了 3.footer-method部分行高 4.整列居左的前提下设置前几行居中 坑1:样式加不上去 坑2&#x…

Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播

技术背景 好多开发者,希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务,然后低延迟播放出来。简单来说,在Unity 中实现采集 Camera 场景并推送RTMP的话,先是获取 Camera 场景数据,通过创建 RenderTex…

分布式 Raft算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & Raft算法 & 总结》《分布式 & Raft算法 & 问题》 参考文献 《Raft一致性算法论文译文》《深入剖析共识性算法 Raft》 简介 Raft 木筏是一种基于日志复制实现的分布式容错&一致性算法。在Raft算法…

System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本

问题1:“/”应用程序中的服务器错误。 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。 说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细…

JAVA |日常开发中Websocket详解

JAVA |日常开发中Websocket详解 前言一、Websocket 概述1.1 定义1.2 优势 二、Websocket 协议基础2.1 握手过程2.2 消息格式2.3 数据传输方式 三、Java 中使用 Websocket3.1 Java WebSocket API(JSR - 356)3.2 第三方库(如 Tyrus&…

SpringBoot Maven快速上手

文章目录 一、Maven 1.1 Maven 简介:1.2 Maven 的核心功能: 1.2.1 项目构建:1.2.2 依赖管理: 1.3 Maven 仓库: 1.3.1 本地仓库:1.3.2 中央仓库:1.3.3 私服: 二、第一个 SpringBoot…

【论文阅读】处理器芯片敏捷设计方法:问题与挑战

作者:包云岗老师 包云岗老师是计算机体系结构方向的大牛,推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会: 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…

方案介绍|CW32L010安全低功耗MCU:驱动高速风筒新力量

吹风机一直以来都是消费者日常生活中的高频刚需产品,而高速风筒更是因为其快速干发、护发养发和低噪音的优势,逐渐成为家庭不可或缺的电器之一。 高速风筒通过采用高速电机和优化的气流设计,能够在短时间内快速吹干头发,同时减少…

uniapp uni-table最简单固定表头

需求:固定表头数据,在网上找了半天,啥都有,就是一直实现不了,最后更改代码实现 1.效果 2.主要代码讲解完整代码 表格的父级一定要设置高度,不然会错位,我看网上说设置position:fixed…

单元测试SpringBoot

添加测试专用属性 加载测试专用bean Web环境模拟测试 数据层测试回滚 测试用例数据设定

9. Win11上原生运行Ubuntu

本文介绍如何在win11原生系统上运行ubuntu,不需要额外安装虚拟机,以及如何配置网络等。 1.安装正版Win11 由于正版Win11需要钱,网上能破解的win11可能有问题,但是它们的破解工具,却是能正常用的,所以&…