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 modemessage(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 libavcodec avformat avutil swresample swscale swscale avfilter #link ffmpeg libm)                      #link libm.so for math operationsset(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使用不是很复杂,不过比较底层,要想集成进自己的项目里面,工作量不小。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chrome扩展插件案例:单词查询

Chrome扩展插件案例:单词查询 在页面内选中单词,右键菜单中显示词典连接,自动将选中单词发送至该词典查询 创建项目文件夹,在文件夹内创建一下文件 manifest.json: {"manifest_version":2,//版本号,由goo…

Leetcode SQL 刷题与答案-基础篇

数据科学家 算法工程师 面试准备 全套-github.com/LongxingTan/Machine-learning-interview 1050. 合作过至少三次的演员和导演 SELECT actor_id, director_id FROM ActorDirector GROUP BY actor_id, director_id HAVING COUNT(*) > 3;1076. Project Employees II SELEC…

实现 DataGridView 下拉列表功能(C# WinForms)

本文介绍如何在 WinForms 中使用 DataGridViewComboBoxColumn 实现下拉列表功能,并通过事件响应来处理用户的选择。以下是实现步骤和示例代码。 1. 效果展示 该程序的主要功能是展示如何在 DataGridView 中插入下拉列表,并在选择某一项时触发事件。 2.…

Docker Compose实战一( 轻松部署 Nginx)

通过过前面的文章(Docker Compose基础语法)你已经掌握基本语法和常用指令认识到Docker Compose作为一款强大工具的重要性,它极大地简化了多容器Docker应用程序的部署与管理流程。本文将详细介绍如何使用 Docker Compose 部署 Nginx&#xff0…

【免费】如何考取HarmonyOS应用开发者基础认证和高级认证(详细教程)

HarmonyOS应用开发者认证考试PC网址 基础:华为开发者学堂 高级:华为开发者学堂 注:免费认证,其中基础认证有免费的课程,浏览器用Edge。 (新题库有点懒,不更新了,点赞收藏后找我要新题库 2024…

解决ThreadLocal在项目中的线程数据共享问题

目录 ThreadLocal 简介 问题描述 为什么会有这个问题 解决方案 1. 使用请求作用域存储 2. 使用 HTTP Session 存储 3. 使用 Spring Security 4. 确保 ThreadLocal 的正确使用 5.通常解决方法 结论 在多线程环境中,ThreadLocal 是一种非常有用的工具&#…

瑞芯微开发板 烧写固件问题

自用rk3568-firefly-itx-3568q核心板fpga自研底板,因底板所需外设、功能与原厂有较大差异,故裁剪相应sdk,编译新的内核进行烧写。然而在更改设备树过程中kernel/drivers/media/i2c/fpga.c中的像素格式MEDIA_BUS_FMT_YUYV8_2X8误改成MEDIA_BUS…

photoblog解题过程

本题要求:通过sql注入,找到数据库中的账号密码,并成功登录。登录后利用文件上传,将一句话木马上传到数据库中,然后并对网站进行控制。 解题过程 1、通过在靶机中输入ifconfig,查到ip为192.168.80.153&…

QT获取tableview选中的行和列的值

查询数据库数据放入tableview(tableView_database)后 QSqlQueryModel* sql_model new QSqlQueryModel(this);sql_model->setQuery("select * from dxxxb_move_lot_tab");sql_model->setHeaderData(0, Qt::Horizontal, tr("id&quo…

「Mac玩转仓颉内测版46」小学奥数篇9 - 基础概率计算

本篇将通过 Python 和 Cangjie 双语实现基础概率的计算,帮助学生学习如何解决简单的概率问题,并培养逻辑推理和编程思维。 关键词 小学奥数Python Cangjie概率计算 一、题目描述 假设有一个袋子中有 5 个红球和 3 个蓝球,每次从袋子中随机…

Face2QR:可根据人脸图像生成二维码,还可以扫描,以后个人名片就这样用了!

今天给大家介绍的是一种专为生成个性化二维码而设计的新方法Face2QR,可以将美观、人脸识别和可扫描性完美地融合在一起。 下图展示为Face2QR 生成的面部图像(第一行)和二维码图像(第二行)。生成的二维码不仅忠实地保留…

电子商务人工智能指南 1/6 - 搜索、广告和发现

介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

Python快速入门二:Python3 基础语法

一、编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适…

nextcloud云盘的部署

借鉴链接:https://blog.csdn.net/guigenyi/article/details/126692747 创建自定义 Docker 网络 docker network create nextcloud-network 创建mysql的账号密码都是root 并将其连接到自定义网络 docker run --name mysql-container --network nextcloud-network -e…

图(dfs与bfs)算法1

开辟新专题!不擅长的图它来了来了!(莫名激动 进度:10/100 另:没想到给自己挖了个坑,可以用dfs的基本上也可以用bfs,看来要双线并行了。 补:图算法是我近期得有30%的焦虑来源了&am…

Ruby On Rails 笔记3——表的增删改查

1.Migration Migrations是一种便利的方法,能以重现的方式随时间推移改变数据库schema. 使用Ruby Domain Specific Language (DSL),因此你不用手写SQL,进而使你的schema和changes与数据库独立。 可以把每次migration看作是数据库的一个新“版本”。A schema开始时什么都没有…

一、测试工具LoadRunner Professional脚本编写-录制前设置

设置基于URL的脚本 原因:基于HTML的脚本会导致login接口不能正确录制 设置UTF-8 原因:不勾选此项会导致脚本中文变为乱码

14、鸿蒙学习——管理通知角标

针对未读的通知,系统提供了角标设置接口,将未读通知个数显示在桌面图标的右上角角标上。 通知增加时,角标上显示的未读通知个数需要增加。 通知被查看后,角标上显示的未读通知个数需要减少,没有未读通知时&#xff0…

Thonny IDE + MicroPython + ESP32 + GY-302 测量环境中的光照强度

GY-302是一款基于BH1750FVI光照强度传感器芯片的模块。该模块能够直接测量出环境中的光照强度,并将光照强度转换为数字信号输出。其具体参数如下表所示。 参数名称 参数特性 测量范围 0-65535 LX 测量精度 在环境光下误差小于20%,能够自动忽略50/60…

AJAX和XHR、fetch、axios的关系

AJAX中有两套原生的API,一个是XHR(XMLHttpRequest),一个是Fetch API axios是第三方库,在浏览器环境中使用的是XHR umi-request也是第三方库,在浏览器环境中使用的是Fetch 在 AJAX(Asynchronous JavaScript and XML&am…