macOS上使用qt creator编译调试ffmpeg.c

1 前言

    上文macOS上将ffmpeg.c编译成Framework介绍了使用xocde将ffmpeg.c编译成Framework的方法,这里列举另外一种办法,就是用qt creator来完成这件事情。

    编译环境如下:

  • qt creator 9.0.2;
  • ffmpeg release/6.1;

2 编译ffmpeg.c

    大致思路如下:

  • 将ffmpeg.c编译成动态库dylib;
  • 在qt creator的app工程里使用该动态库;

    值得一提的是,用qt creator新建工程,必须是Plain C Application,不能是C++的工程。因为ffmpeg.c相关头文件的变量名用到了c++的关键字,比如class等,这会导致在c++项目里无法编译成功。 

2.1 新建qt工程

    新建一个Plain C Application工程,并选择使用cmake来构建项目:

    代码目录结构如下图:

2.2 改写ffmpeg.c接口

    在ffmpeg.h文件中将main方法名改为ffmpeg:

#将main方法名改为ffmpeg
int ffmpeg(int argc, char* argv[]);

    在ffmpeg.c文件中将main方法名改为ffmpeg:

#将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;
}

2.3 编写CMakeLists.txt

    用qt creator编译ffmpeg.c,关键在于cmake脚本的编写,这里贴出所写的cmake编译脚本:

cmake_minimum_required(VERSION 3.5)project(qt-ffmpegc LANGUAGES C)#ffmpeg源码根目录
set(FFMPEG_SRC_ROOT_PATH "/Users/mingo/Applications/workspace/av/ffmpeg")
#fftools源码目录
set(FFMPEG_SRC_TOOL_PATH ${FFMPEG_SRC_ROOT_PATH}/fftools)
#列出要参与编译的ffmpeg.c相关源码
set(FFMPEG_SRC${FFMPEG_SRC_TOOL_PATH}/cmdutils.c ${FFMPEG_SRC_TOOL_PATH}/cmdutils.h${FFMPEG_SRC_TOOL_PATH}/ffmpeg_dec.c ${FFMPEG_SRC_TOOL_PATH}/ffmpeg_demux.c${FFMPEG_SRC_TOOL_PATH}/ffmpeg_enc.c ${FFMPEG_SRC_TOOL_PATH}/ffmpeg_filter.c${FFMPEG_SRC_TOOL_PATH}/ffmpeg_hw.c ${FFMPEG_SRC_TOOL_PATH}/ffmpeg_mux_init.c${FFMPEG_SRC_TOOL_PATH}/ffmpeg_mux.c ${FFMPEG_SRC_TOOL_PATH}/ffmpeg_mux.h${FFMPEG_SRC_TOOL_PATH}/ffmpeg_opt.c ${FFMPEG_SRC_TOOL_PATH}/ffmpeg.c${FFMPEG_SRC_TOOL_PATH}/ffmpeg.h${FFMPEG_SRC_TOOL_PATH}/opt_common.c ${FFMPEG_SRC_TOOL_PATH}/opt_common.h${FFMPEG_SRC_TOOL_PATH}/sync_queue.c ${FFMPEG_SRC_TOOL_PATH}/sync_queue.h${FFMPEG_SRC_TOOL_PATH}/thread_queue.c ${FFMPEG_SRC_TOOL_PATH}/thread_queue.h${FFMPEG_SRC_TOOL_PATH}/objpool.c ${FFMPEG_SRC_TOOL_PATH}/objpool.h)#ffmpeg的头文件、lib文件及相关基础库根目录
set(FFMPEG_BUILD_ROOT_PATH ${FFMPEG_SRC_ROOT_PATH}/mac_build)
#ffmpeg几个库的include文件路径
set(FFMPEG_INCLUDE_PATH ${FFMPEG_BUILD_ROOT_PATH}/include)
#全部的依赖库所在目录
set(FFMPEG_LIB_PATH ${FFMPEG_BUILD_ROOT_PATH}/lib)#系统基础库
set(SYS_BASE_LIB iconv z bz2)
#ffmpeg几个.a库
set(LINK_FFMPEG_LIBS${FFMPEG_LIB_PATH}/libavformat.a${FFMPEG_LIB_PATH}/libavutil.a${FFMPEG_LIB_PATH}/libavcodec.a${FFMPEG_LIB_PATH}/libavfilter.a${FFMPEG_LIB_PATH}/libswscale.a${FFMPEG_LIB_PATH}/libswresample.a${FFMPEG_LIB_PATH}/libavdevice.a)
#其他依赖库
set(OTHER_3RDPARTY_LIBS${FFMPEG_LIB_PATH}/libxcb.a${FFMPEG_LIB_PATH}/libxcb-xfixes.a${FFMPEG_LIB_PATH}/libxcb-shm.a${FFMPEG_LIB_PATH}/libxcb-shape.a${FFMPEG_LIB_PATH}/libXdmcp.a${FFMPEG_LIB_PATH}/libXau.a${FFMPEG_LIB_PATH}/libX11.a${FFMPEG_LIB_PATH}/libX11-xcb.a${FFMPEG_LIB_PATH}/libSDL2.dylib)#将ffmpeg.c打成动态库
add_library(ffmpegc SHARED ${FFMPEG_SRC})
#指定ffmpegc动态库相关依赖库
target_link_libraries(ffmpegc PRIVATE ${LINK_FFMPEG_LIBS} ${OTHER_3RDPARTY_LIBS} ${SYS_BASE_LIB})
#ffmpeg所依赖的macOS的Framework
list(APPEND DEPENDCY_LIB_LISTFoundation AudioToolbox CoreAudio AVFoundation CoreVideo CoreMedia CoreGraphics OpenGL Metal VideoToolbox CoreImage AppKit CoreFoundation CoreServices Security)
foreach(var IN LISTS DEPENDCY_LIB_LIST)target_link_libraries(ffmpegc PRIVATE "-framework ${var}")
endforeach()
# 设置ffmpeg.c动态库的输出路径
set_target_properties(ffmpegc PROPERTIESLIBRARY_OUTPUT_DIRECTORY ${FFMPEG_LIB_PATH}ARCHIVE_OUTPUT_DIRECTORY ${FFMPEG_LIB_PATH}
)add_executable(qt-ffmpegc main.c)include_directories(${FFMPEG_SRC_ROOT_PATH})
include_directories(${FFMPEG_SRC_TOOL_PATH})
include_directories(${FFMPEG_INCLUDE_PATH})#指定qt-ffmpegc app工程所依赖的库,与ffmpeg.c一致
target_link_libraries(qt-ffmpegc PRIVATE ${LINK_FFMPEG_LIBS} ${OTHER_3RDPARTY_LIBS} ${SYS_BASE_LIB})
#qt-ffmpegc依赖ffmpegc动态库
target_link_libraries(qt-ffmpegc PRIVATE ${FFMPEG_LIB_PATH}/libffmpegc.dylib)
#qt-ffmpegc依赖macOS的各framwork
foreach(var IN LISTS DEPENDCY_LIB_LIST)message(STATUS ${var})target_link_libraries(qt-ffmpegc PRIVATE "-framework ${var}")
endforeach()install(TARGETS qt-ffmpegcLIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

    值得一提的是,cmake脚本里指定对macOS系统Framework的依赖脚本如下,列出范例代码:

target_link_libraries(qt-ffmpegc PRIVATE "-framework Foundation")

    好了,cmake脚本编写完成,现在可以编译ffmpeg.c动态库和qt-ffmpegc可执行文件了。

3 使用ffmpeg.c动态库

    列出qt-ffmpegc工程main.c的调用代码:

#include <stdio.h>#include "libavformat/avformat.h"
#include "ffmpeg.h"static void test_ffmpeg() {AVFormatContext* ifmt = NULL;const char* filename = "";int ret = avformat_open_input(&ifmt, filename, NULL, NULL);if (ret < 0) {av_log(ifmt, AV_LOG_INFO, "avformat_open_input failed\n");}ret = avformat_find_stream_info(ifmt, NULL);if (ret < 0) {}AVPacket pkt;av_init_packet(&pkt);while (1) {ret = av_read_frame(ifmt, &pkt);if (pkt.stream_index == 1 &&  pkt.flags & AV_PKT_FLAG_KEY) {av_log(ifmt, AV_LOG_INFO, "keyframe\n");}}
}static void test_ffmpeg_cmd(int argc, const char* argv[]) {ffmpeg(argc, argv);
}int main()
{printf("Hello World!\n");test_ffmpeg();const char* args[3] = { "ffmpeg", "-h", "filter=overlay" };test_ffmpeg_cmd(3, args);return 0;
}

    然后编译调试,执行ffmpeg -h filter=overlay范例命令:

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

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

相关文章

解决哈希冲突的方法总结

哈希冲突是指在哈希表中两个或多个键被哈希函数映射到了同一个位置上&#xff0c;造成数据存储冲突的情况。解决哈希冲突的常见方法包括以下几种&#xff1a; 开放定址法&#xff1a; 线性探测法&#xff1a;当发生冲突时&#xff0c;顺序地查找下一个空槽。 二次探测法&#x…

【算法】完成所有任务需要的最少轮数

题目 给你一个下标从 0 开始的整数数组 tasks &#xff0c;其中 tasks[i] 表示任务的难度级别。在每一轮中&#xff0c;你可以完成 2 个或者 3 个 相同难度级别 的任务。 返回完成所有任务需要的 最少 轮数&#xff0c;如果无法完成所有任务&#xff0c;返回 -1 。 解析 思…

2024 年 4 月区块链游戏研报:市场低迷中活跃用户数创新高

2024 年 4 月区块链游戏研报 作者&#xff1a;stellafootprint.network 数据来源&#xff1a;GameFi 研究页面 2024 年 4 月&#xff0c;Web3 游戏领域在经历 3 月创纪录的表现后&#xff0c;迎来了显著波动。比特币自历史高位回调&#xff0c;月跌幅达到 10.4%。与此同时&a…

Rabbitmq报unauthorized异常

问题&#xff1a; Caused by: java.lang.SecurityException: Attempt to deserialize unauthorized class cn.seczone.sscsp.common.model.TaskSbomMessageMq; add allowed class name patterns to the message converter or, if you trust the message orginiator, set envir…

IC卡16个扇区详解:揭秘智能卡的存储结构

目录标题 IC卡的基本结构扇区的划分扇区的功能扇区的安全性扇区的应用NFC卡和IC卡&#xff0c;从外观怎样区分总结 在智能卡的世界里&#xff0c;IC卡&#xff08;Integrated Circuit Card&#xff09;以其安全性和便捷性成为了现代生活中不可或缺的一部分。无论是用于支付、身…

react18【系列实用教程】JSX (2024最新版)

为什么要用 JSX&#xff1f; JSX 给 HTML 赋予了 JS 的编程能力 JSX 的本质 JSX 是 JavaScript 的语法扩展&#xff0c;浏览器本身不能识别&#xff0c;需要通过解析工具&#xff08;如babel&#xff09;解析之后才能在浏览器中运行。 bable 官网可以查看解析过程 JSX 的语法 …

PCie协议之-TLP Header详解(一)

✨前言&#xff1a; 在PCIe通信过程中&#xff0c;事务层数据包&#xff08;Transaction Layer Packets&#xff0c;简称TLP&#xff09;扮演着非常重要的角色。TLP用于在设备之间传递数据和控制信息&#xff0c;它们是PCIe的基本信息传输单元。 TLP可分为几个部分&#xff0c…

打家劫舍问题(线性,环形

打家劫舍问题&#xff08;根据递推公式来初始化 偷i和不偷i两种情况 如果连成环&#xff0c;考虑首元素就不考虑尾元素&#xff0c;考虑尾元素就不考虑首元素 线性问题代码 class Solution {public int rob(int[] nums) {int lennums.length;int[] dpnew int[len];//记录最…

Redis缓存降级

当访问量剧增、服务出现问题&#xff08;如响应时间慢或不响应&#xff09;或非核心服务影响到核心流程的性能时&#xff0c;仍然需要保证服务还是可用的&#xff0c;即使是有损服务。系统可以根据一些关键数据进行自动降级&#xff0c;也可以配置开关实现人工降级。 缓存降级…

Windows Server 2022 环境下WEB和DNS服务器配置方法

目录 实验名称&#xff1a;WEB和DNS服务器配置实验目的实验原理&#xff1a;主要设备、器材&#xff1a;实验内容&#xff1a;配置本地WEB站点配置本地DNS服务器 实验名称&#xff1a;WEB和DNS服务器配置 实验目的 掌握 Windows Server 2022 环境下WEB服务器配置方法 掌握 Wi…

Idea 核心编程快捷键-简洁版

Idea 实际开发中必备的快捷键功能整理&#xff0c;欢迎补充。 如果由于Idea版本默认快捷键不对&#xff0c;建议自己根据功能谷歌一下。 编程时提速 功能WindowsMac记忆提示移除当前文件中的没有调用的类Ctrl Option O进入某个类里面Ctrl 左键单击Command 左键单击回到光…

C# 下载安装,使用OfficeOpenXml

下载安装OfficeOpenXml模块 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Text.RegularEx…

使用RESTful API构建 web 应用程序

RESTful API是一种基于HTTP协议的架构风格&#xff0c;用于设计网络应用程序的 API。它强调使用标准的HTTP方法&#xff08;如GET、POST、PUT和DELETE&#xff09;对资源进行操作&#xff0c;并使用统一的资源标识符&#xff08;URI&#xff09;来唯一标识每个资源。RESTful AP…

基于spingboot,vue线上辅导班系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 权限划分&#xff1a;用户&#xff0c;管理员 具有前后台展示&#xff0c;前台供用户使用&#xff1b;用户具有自己的后台&#xff0c;查看自己的老师课程等&#xff1b;管理员具有最大的权限后台。 用户&#xff1a…

set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`

TF_ENABLE_ONEDNN_OPTS是配合log输出信息来用。 os.environ["TF_CPP_MIN_LOG_LEVEL"]的取值有四个&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;分别和log的四个等级挂钩&#xff1a;INFO&#xff0c;WARNING&#xff0c;ERROR&#xff0c;FATA…

代码随想录第七天打卡|454.四数相加II, 383. 赎金信 ,15. 三数之和 , 18. 四数之和

454.四数相加II Python class Solution:def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:nlen(nums1)res0Mapdefaultdict(int)for i in range(n):for j in range(n):Map[nums1[i]nums2[j]]1for i in range(n):fo…

第十三篇:智慧之网:深度探索关系型数据库的数学奥秘与实战技艺

智慧之网&#xff1a;深度探索关系型数据库的数学奥秘与实战技艺 1. 引言 1.1 数据时代的基石 在数字化的浪潮中&#xff0c;数据已成为新时代的石油&#xff0c;而关系型数据库则是这座数据矿藏的精炼厂。自E.F. Codd在1970年提出关系模型以来&#xff0c;关系型数据库以其坚…

Flink CDC 原理

简介 Flink CDC&#xff08;Change Data Capture&#xff09;是 Apache Flink 提供的一个变更数据捕获工具集。它可以监控数据库的变更&#xff0c;并将这些变更实时地以流的形式提供给下游系统&#xff0c;这些变更包括插入、更新和删除操作。 Flink CDC 适用于需要实时数据…

(Arcgis)python geopandas库分割shp属性表特定内容,批量导出shp文件

一、两个文件。实现目标&#xff1a;从1个shp文件&#xff0c;根据属性表内容提取成200个shp文件&#xff0c;文件名取自txt文本内容 shp文件&#xff08;要素1-200.shp&#xff09;&#xff1a;打开属性表前14项相同&#xff0c;后200项不相同。 ————任务目标&#xff1a…

【yolov8分类任务-全流程】【公开数据白内障-101:101例白内障手术的视频数据集】

文章目录 1.公开数据集1.1.白内障-101&#xff1a;数据集文件结构1.1.1.视频文件1.1.2.注释文件(1)videos.csv(2) phases.csv(3)annotations.csv 1.2. 数据处理1.2.1.抽帧脚本全部代码&#xff08;每行都有注释&#xff09;1.2.2.分类任务划分数据集脚本 2.yolov8分类任务训练2…