macOS上将ffmpeg.c编译成Framework

1 前言

    本文介绍下在macOS上将ffmpeg的fftools目录下的ffmpeg.c程序,也就是ffmpeg的命令行程序,编译成framework的方法。编译成.a或.dylib亦是类似。 

    编译环境如下:

  •  xcode15.3;
  • ffmpeg branch release/6.1;

2 编译ffmpeg

    首先clone我们的FFmpeg代码仓到本地,并更名为ffmpeg,切换分支为release/6.1:

git clone https://github.com/FFmpeg/FFmpeg.git ffmpeg && git checkout release/6.1

    然后在ffmpeg的根目录执行如下命令,由于是学习使用,configure配置的是缺省选项,编译后安装目录在根目录下的mac_build目录下: 

mkdir -p mac_build && ./configure --prefix=./mac_build

     然后执行如下命令,编译并安装ffmpeg:

make -j8 && make install

     configure并编译安装完成之后,会在根目录下生成如下文件:

  • configure配置完毕,会在根目录产生config.hconfig_components.h文件;
  • 生成了ffmpeg/ffplay/ffprobe可执行文件;
  • mac_build目录是ffmpeg的bin/include/lib/share文件;

    其中,mac_build目录结构如下: 

xxxxxx@localhost:~/Applications/workspace/av/ffmpeg/mac_build$tree -L 2
.
├── bin
│   ├── ffmpeg
│   ├── ffplay
│   └── ffprobe
├── include
│   ├── libavcodec
│   ├── libavdevice
│   ├── libavfilter
│   ├── libavformat
│   ├── libavutil
│   ├── libswresample
│   └── libswscale
├── lib
│   ├── libavcodec.a
│   ├── libavdevice.a
│   ├── libavfilter.a
│   ├── libavformat.a
│   ├── libavutil.a
│   ├── libswresample.a
│   ├── libswscale.a
│   └── pkgconfig
└── share├── ffmpeg└── man15 directories, 10 files

    编译安装完成之后,就可以拿该目录下的includelib下的文件引入到工程使用了。 

3 编译ffmpeg.c

3.1 新建xcode工程

    打开xcode新建一个xcode的app工程:

    然后,新建一个target,FFmpegFramework,然后把ffmpeg相关c程序拖进来编译:

    然后在FFmpegFramework => Build Settings => Search Paths里加入ffmpeg的includelib以及config.h的搜索路径:

    到此,xcode工程和FFmpegFramework的创建和初始化工作完成,接下来就是将FFmpegFramework编译成framework了。 

3.2 改写ffmpeg.c的接口方法

  • 在ffmpeg.h文件中,将int main(int argc, char* argv[])方法名改成ffmpeg;
  • ffmpeg.c对应文件的main方法名按以上同步修改;

    ffmpeg.h头文件中修改方法名: 

int ffmpeg(int argc, char* argv[]);

     ffmpeg.c同步修改方法名:

// 将main方法名改为ffmpeg
int ffmpeg(int argc, char **argv)
{int ret, err_rate_exceeded;BenchmarkTimeStamps ti;init_dynload();setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */av_log_set_flags(AV_LOG_SKIP_REPEATED);parse_loglevel(argc, argv, options);#if CONFIG_AVDEVICEavdevice_register_all();
#endifavformat_network_init();show_banner(argc, argv, options);/* parse options and open all input/output files */ret = ffmpeg_parse_options(argc, argv);if (ret < 0)goto finish;if (nb_output_files <= 0 && nb_input_files == 0) {show_usage();av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);ret = 1;goto finish;}if (nb_output_files <= 0) {av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");ret = 1;goto finish;}current_time = ti = get_benchmark_time_stamps();ret = transcode(&err_rate_exceeded);if (ret >= 0 && do_benchmark) {int64_t utime, stime, rtime;current_time = get_benchmark_time_stamps();utime = current_time.user_usec - ti.user_usec;stime = current_time.sys_usec  - ti.sys_usec;rtime = current_time.real_usec - ti.real_usec;av_log(NULL, AV_LOG_INFO,"bench: utime=%0.3fs stime=%0.3fs rtime=%0.3fs\n",utime / 1000000.0, stime / 1000000.0, rtime / 1000000.0);}ret = received_nb_signals ? 255 :err_rate_exceeded   ?  69 : ret;finish:if (ret == AVERROR_EXIT)ret = 0;ffmpeg_cleanup(ret);return ret;
}

3.3 将ffmpeg.c编译成Framework

    接下来就是将ffmpeg.c编译成framework了,期间遇到了很多问题,但基本是一类问题,那就是链接时的undefined symbol

    解决方式就是将ffmpeg.c所依赖的macOS系统framework和基础.a或者.dylib库链接到本framework即可。如下,总共依赖了39个库,其中SDL2必须用dylib库:

4 使用framework

    贴出main.c调用ffmpeg.c的代码:

#include "libavutil/log.h"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libavutil/opt.h"
#include "ffmpeg.h"static void test_ffmpeg(int argc, const char* argv[]) {ffmpeg(argc, argv);
}int main(int argc, const char * argv[]) {@autoreleasepool {// Setup code that might create autoreleased objects goes here.av_log_set_level(AV_LOG_DEBUG);av_log(NULL, AV_LOG_INFO, "hello ffmpeg");test_ffmpeg(argc, argv);}return NSApplicationMain(argc, argv);
}

选中learn-ffmpeg target,在learn-ffmpeg => Build Settings => Search Paths => Header Search Paths/Library Search Paths中指定ffmpeg及其framework相关的include和lib文件:

    include搜索路径:

    lib搜索路径: 

     在learn-ffmpeg target中 Build Settings => Link Binary with Library中加入FFmpegFramework: 

     接下来就可以顺利编译self-ffmpeg程序,并开始调试ffmpeg.c程序了:

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

智能AI个人名片小程序源码系统 带完整的安装代码包以及搭建部署教程

在当今数字化时代&#xff0c;个人名片不再仅仅是一张简单的纸质卡片&#xff0c;而是演变成了一种更加智能、便捷的数字化工具。为了满足这一需求&#xff0c;小编给大家分享一款智能AI个人名片小程序源码系统&#xff0c;该系统不仅提供了完整的安装代码包&#xff0c;还附带…

宋仕强论道之新质生产力

宋仕强论道之新质生产力&#xff0c;宋仕强说当前5G通信、人工智能、万物互联、工业互联网、数字经济、新能源技术和产业等领域正蓬勃发展&#xff0c;成为未来经济增长的重要推动力&#xff0c;也是目前提倡的新质生产力的重要组成部分。而这些领域的发展都离不开数据的采集、…

shopee虾皮跨境商家:月出1000单爆款打造思路!

Shopee爆款打造的方式是需要满足很多特点的&#xff0c;我把它大概归结为了7大要素&#xff1a; 1、顺应平台潮流 通过Shopee前台、市场周报&#xff0c;以及你对这个行业的经验&#xff0c;能够及时掌握平台最近主推产品的信息&#xff0c;又刚好我们店铺里面的商品有能够搭…

SpringBoot内置插件的使用(jackson和lombok)

文章目录 引言I lombok(自动为属性生成构造器)II jacksonsee also引言 idea2021.2.2 已经捆绑安装jackson和lombok插件 I lombok(自动为属性生成构造器) Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。 https://p…

智慧校园的主要功能是什么

随着信息化的发展&#xff0c;智慧校园的应用已经屡见不鲜。智慧校园是新技术与新科技落地的典型案例。智慧校园完善了校园信息化建设体系&#xff0c;推动了教育水平的提升&#xff0c;以下是智慧校园实现的几个比较典型的功能&#xff1a; 1.数字化办公 毋庸置疑&#xff0…

开发利器 - docker 安装运行 mysql

本文选择安装的mysql版本为5.7 &#xff0c;安装环境 mac 1、查看镜像是否存在 docker search mysql:5.7 2、拉取镜像 docker pull mysql:5.7 3、运行镜像 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot1234 -d mysql:5.7 --name&#xff1a;指定容器…

苹果 iPhone 15 Pro Max 称霸:智能手机市场势不可挡

苹果 iPhone 15 Pro Max 称霸&#xff1a;智能手机市场势不可挡 概述 在拥挤且竞争激烈的智能手机市场中&#xff0c;苹果的 iPhone 15 Pro Max 成为明显的赢家&#xff0c;在 2024 年第一季度最畅销智能手机排行榜上名列前茅。根据 Counterpoint Research 的数据&#xff0c…

【Java 查询树结构列表,递归删除子节点】

Java 获取列表树结构,递归删除子节点 数据库表结构ModelVO查询树结构列表递归删除子节点数据库表结构 Model @Data @AllArgsConstructor @NoArgsConstructor public class TBaseDept {/** ID */private String id;/** 单位名称 */private String fdName;/** 部门编码 */priva…

Excel 根据分类及组内序号进行编码

例题描述和简单分析 Excel 记录课程数据&#xff0c;未排序&#xff0c;部分如下&#xff1a; ABC1CourseDateTime2Word1-Sep-209:003Word1-Sep-209:004PowerPoint1-Sep-209:005Word1-Sep-2012:006PowerPoint1-Sep-2012:007Excel1-Sep-2012:008Word1-Sep-2012:00 现在要新增…

《数电》时序逻辑电路 第四章

一&#xff0c;时序逻辑电路的结构和特点。 按触发器状态变化特点 同步时序逻辑电路和异步时序逻辑电路 同步:所有触发器都受同一时钟信号控制&#xff0c;触发器状态变化同步异步:并非所有触发器都受同一时钟信号控制&#xff0c;触发器状态变化不同步 二&#xff0c;触发器 基…

刺客信条提示找不到emp.dll,无法继续执行代码的8个有效解决方法

遇到游戏提示缺少emp.dll文件的问题时&#xff0c;不必过于焦虑&#xff0c;这个问题相对常见且有多种解决方案。以下是一些实用的心得和步骤来帮助你修复这个问题&#xff1a; 在计算机世界里&#xff0c;动态链接库&#xff08;Dynamic Link Library&#xff0c;简称DLL&…

LazyDiffusion:革新交互式图像编辑的扩散模型

Adobe Research和特拉维夫大学的研究人员联合开发了一种名为LazyDiffusion的新型扩散变换器&#xff0c;它能够高效地生成部分图像更新&#xff0c;特别适用于交互式图像编辑。该模型通过创新的编码器-解码器架构&#xff0c;显著提升了图像编辑的效率&#xff0c;同时保持了与…

Zabbix6.0容器化部署(Docker-Composed)

Zabbix 为每个 Zabbix 组件提供 Docker image 作为可移植和自给自足的容器&#xff0c;以加快部署和更新过程。 Zabbix 组件在 Ubuntu、Alpine Linux 和 CentOS 基础 image 上提供:Zabbix 组件支持 MySQL 和 PostgreSQL 数据库、Apache2 和 Nginx Web 服务器。 1. Zabbix 组件…

QT如何增删安装的组件

打开 uninstall QT 往下会看到让你选择 add or remove component。 接下去就可以修改组件了

泥水位监测站的应用场景

TH-SW2泥水位监测站的应用场景相当广泛&#xff0c;包括但不限于以下几种情况&#xff1a; 水源地保护&#xff1a;它可以监测水源地的水质及水位变化&#xff0c;为水源地的保护提供实时数据支持&#xff0c;防止水源污染和过度开采。水库管理&#xff1a;在水库中&#xff0…

C++牛客小白月赛题目分享(1)生不逢七,交换数字,幻兽帕鲁

目录 1.前言 2.三道题目 1.生不逢七 1.题目描述 2.输入描述: 3.输出描述: 4.示例&#xff1a; 5.题解&#xff1a; 2.交换数字 1.题目描述&#xff1a; 2.输入描述&#xff1a; ​编辑 3.输出描述&#xff1a; 4.示例&#xff1a; 5.题解&#xff1a; 3.幻兽帕…

Redis 基础之常用数据类型及命令

常用数据类型及命令 String&#xff08;字符串&#xff09;Hash&#xff08;哈希&#xff09;List&#xff08;列表&#xff09;Set&#xff08;集合&#xff09;zset ( sorted set&#xff1a;有序集合 )Redis setbit 命令HyperLogLogs ( 基数统计 ) Redis 比 Memcached 更优秀…

(python)经典的数学和逻辑谜题-汉诺塔

前言 在贝纳雷斯的大寺庙里在标志着世界中心的圆顶下,有一块黄铜板,上面固定着三根钻石针,每根针高一肘,粗细如蜜蜂的身体.在其中一根针上,上帝在创世时放置了六十四个纯金的圆盘,最大的圆盘放在黄铜板上,其他的圆盘逐渐变小,直到最上面的一个.这就是布拉马之塔.日夜不停地,祭司…

sqli-labs靶场第十四关

目录 1&#xff1a;分析 找闭合符&#xff1a; 2&#xff1a;开始注入 报错注入&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具体值&#xff1a; 1&#xff1a;分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…

消费增值:绿色积分引领电商潮流

消费增值的玩法确实为电商平台提供了一种新颖的用户激励机制&#xff0c;通过积分返利和增值机制&#xff0c;吸引消费者持续参与并提升用户粘性。以下是对您提供的信息的进一步解析和扩展&#xff1a; 消费增值玩法解析 商城消费返利&#xff1a; 每笔消费订单&#xff0c;商…