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.hqwc.cn/news/702783.html

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

相关文章

Unity WebGL全屏显示

一、删除footer节点 二、删除最下面点击事件绑定 修改Canvas宽高 canvas.style.width "960px"; canvas.style.height "600px"; 改成 canvas.style.width document.documentElement.clientWidth"px"; canvas.style.height document.document…

JavaScript循环结构

JS循环结构 1 while结构2 for循环3 foreach循环 1 while结构 几乎和JAVA一致 代码 /* 打印99 乘法表 */var i 1;while(i < 9){var j 1;while(j < i){document.write(j"*"i""i*j" ");j;}document.write("<hr/>");i…

runtime pm的实例分析

概念 运行时的PM与前文描述的系统级挂起到RAM时候的PM不太一样&#xff0c;它是针对单个设备&#xff0c;指系统在非睡眠状态的情况下&#xff0c;某个设备在空闲时可以进入运行时挂起状态&#xff0c;而在不是空闲时执行运行时恢复使得设备进入正常工作状态&#xff0c;如此&…

Linux-CentOS-7忘记密码-修改登录密码图文详解

Linux-CentOS-7忘记密码-修改登录密码图文详解 1.重启系统&#xff1a; 在登录界面&#xff0c;选择要登录的用户并点击"Power"按钮&#xff0c;然后选择"Restart"或"Reboot"重新启动系统。 在系统启动时持续按下 “e” 键进入编辑模式。 2…

抖店曝光率高,转化低,不知道怎么提升转化率?试试这四个方法

大家好&#xff0c;我是醒醒团队电商花花。 我们现在做抖音小店的商家或多或少都会遇到不出单&#xff0c;转化低的各种问题。 明明店铺的曝光不低&#xff0c;访客也不少&#xff0c;就是没转化。 下面我根据我们做店的经验&#xff0c;给大家分享一些问题所在&#xff0c;…

总结 UDP 的报文结构和注意事项

UDP协议端格式 UDP报文主体分为两个部分:UDP报头(占8个字节)UDP数据/UDP载荷UPD报头:源端口号目的端口号包长度校验和 1.源端口号&#xff1a;一般是客户端程序程序请求时&#xff0c;由系统自动指定&#xff0c;端口号范围是0~65535&#xff0c; 0 ~ 1023为知名端口号——占16…

数据分析(二)——导入外部数据,导入Excel数据,CSV文件,txt文件,HTML网页,数据抽取,DataFrame对象的loc属性与iloc属性

一.导入外部数据 1.导入.xIs或.xIsx文件 pd.read_ excel(io,sheet_ name,header) 1.1常用参数说明 ●io:表示.xIs或.xIsx文件路径或类文件对象 ●sheet name:表示工作表&#xff0c;取值如下表所示 ●header:默认值为0&#xff0c;取第一行的值为列名&#xff0c;数据为除列…

【保姆级】生成式网络模型基础知识(图像合成/语音合成/GPT)

生成式模型基础知识 初步接触生成任务 生成任务&#xff0c;顾名思义就是要去生成一个东西&#xff0c;比如生成图片/音频/文字等等。 大家接触最多比如chatGPT、stable diffusion、还有一些语音合成相关的东西。 那么问题来了&#xff0c;具体生成步骤是什么样的&#xff…

MIT 6.5840(6.824) Lab1:MapReduce 设计实现

1 介绍 本次实验是实现一个简易版本的MapReduce&#xff0c;你需要实现一个工作程序&#xff08;worker process&#xff09;和一个调度程序&#xff08;coordinator process&#xff09;。工作程序用来调用Map和Reduce函数&#xff0c;并处理文件的读取和写入。调度程序用来协…

【制作100个unity游戏之26】unity2d横版卷轴动作类游戏5(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言三段攻击攻击设置只对敌人造成伤害限制可以移动攻击问题 角色连续按四下攻击&#xff0c;最后会多a一下问题&#xff1a;站在原地连续攻击野猪&#xff0c;只有第一下攻击野猪才掉血&#xff0c;后面的攻击野猪不掉血源码完结 …

Keli5烧写程序成功后再次烧写程序却不能识别芯片。解决方法

1问题&#xff08;已排除硬件问题和Debug配置问题&#xff09; 再次烧写不能识别下如图&#xff08;提示为不能识别到芯片&#xff09; 硬件识别正常 Debug配置正常 就是不能识别到芯片 2为什么会出现这个问题 在STM32Cude设置中没有设置SYS&#xff08;默认是No Debug&…