参照ffmpeg重新写makefile文件提取prores编解码库

2023-12-11 13:08

本文主要是介绍参照ffmpeg重新写makefile文件提取prores编解码库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们知道,ffmpeg源码是在linux底下开发出来的,而如果我们要在windows底下进行ffmpeg相关代码的修改和优化的话,则是需要借助mingw,mingw中提供了msys编译环境,这样的话,你修改和优化后的ffmpeg代码如果要在windows下应用的话,则可以通过编译生成相关的dll和lib库进行引用,达到最大化利用ffmpeg性能的目的。

接下来,以自己近期做的prores编解码器代码修改优化部分过程为例,来说明下如何在windows平台上通过重写makefile文件,重新编译生成新的prores编解码库。有的人可能会问,为什么不直接在vs2013平台上进行修改并编译好库,这样不也可以编译得到相应的dll和lib库吗?当然是可以的,不过由于visual studio平台在编译ffmpeg部分代码过程中并不支持部分编译选项,比如AT&T汇编优化,因此在visual studio平台上编译出的库也就不支持AT&T汇编优化,从而影响了ffmpeg进行相关流媒体处理的性能。那可能又有一部分人会问,那你直接在linux上进行开发不就行了么?当然也是可以的,只是笔者习惯了在windows下进行开发,虽说笔者电脑上也装了一个linux的虚拟机,不过老是切来切去的也不方便,所以干脆就直接在mingw上倒腾了,反正功能和linux基本一样。

好了,接下来开始上干货了。。。

1、  先上ffmpeg官网下载ffmpeg源码,分别在library.mak和common.mak的图1和图2位置处增加这两条语句:echo-e "$(YASM) $(YASMFLAGS) -I $(<D)/ -o $@$<\n">>asmout.log和echo -e "$($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C)$($(1)_O) $<\n">>output.log,然后分别采用mingw 32位和64位,按32位和64位编译得到dll和lib库,其中32位的configure选项为:./configure–enable-shared, 64位的configure选项为:./configure –arch=x86-64 –enable-shared,编译完成后,可以在libavutil,libavcodec等文件夹中看到各个.c文档被编译得到了.o和.d文件,其中.d文件就是代表把这个.c文档编译成.o文档需要的依赖文件。比如,我这里修改优化后需要编译的有proresdec2.c文档,那么我们可以查看proresdec2.d文件中的依赖文档有哪些,如下图3


图1


图2


图3

接下来保存好ffmpeg一级目录下的config.h以及config.asm两个文件,将32位和64位下分别编译得到的这两个config文件分别保存到config_x86和config_x64中。

2、  在vs2013中,新建两个工程,这里我自己命名为BaseLib和 ProResCodec,将步骤一后得到的ffmpeg重新make clean一下,然后将ffmpeg中的libavutil和libavcodec两个源码文件夹复制到自己的vs工程目录下,并在两个工程属性中,将libavutil和libavcodec中头文件全部包含进去。接下来重新利用vs编译器和msys一起编译ffmpeg,此时32位的configure选项为:./configure –enable-shared –toolchain=msvc, 64位的configure选项为:./configure–arch=x86-64 –enable-shared –toolchain=msvc,重新编译后,可得到新的config.h和config.asm,将32位和64位下分别编译得到的这两个config文件分别保存到config_x86和config_x64中,将这两个文件夹也复制到vs工程目录下,并根据不同的vs平台包含进项目BaseLib和ProResCodec中去。将proresdec2.c文档加入到ProResCodec工程,编译链接,发现有些函数没有定义或者链接不了,肯定还需要其他.c文件加入进来,根据函数名在libavutil和libavcodec文件夹中查找,逐个将相应的.c文件加入,直至最后两个工程项目都可以完全编译链接通过。

这一步主要是为了下一步进行makefile编写时需要哪些文件加入mingw编译提供参考。

3、  参考网络资料《跟我一起学makefile》(http://blog.csdn.net/haoel/article/details/2886/)资料,熟悉makefile书写规则和一般技巧。重新建立新的文件夹,将第一步中得到的config_x86和config_x64文件夹复制到新的文件夹目录下,且将ffmpeg中的源码文件夹libavutil和libavcodec复制到新的文件夹目录下,分别在两个文件夹中新建makefile文档,根据步骤二中的两个项目BaseLib和ProResCodec下分别包含的.c文件分别书写libavutil和libavcodec中的两个makefile文件,其中我自己32位的两个makefile文件参考如下:

Libavutil中makefile:

vpath %.c ../compat/msvc

这篇关于参照ffmpeg重新写makefile文件提取prores编解码库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480803

相关文章

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

ROS - C++实现RosBag包回放/提取

文章目录 1. 回放原理2. 回放/提取 多个话题3. 回放/提取数据包,并实时发布 1. 回放原理 #include <ros/ros.h>#include <rosbag/bag.h>#include <std_msgs/String.h>int main(int argc, char** argv){// 初始化ROS节点ros::init(argc, argv,

FFmpeg系列-视频解码后保存帧图片为ppm

在正常开发中遇到花屏时怎么处理呢?可以把解码后的数据直接保存成帧图片保存起来,然后直接看图片有没有花屏来排除是否是显示的问题,如果花屏,则代表显示无问题,如果图片中没有花屏,则可以往显示的方向去排查了。 void saveFrame(AVFrame* pFrame, int width, int height, int iFrame){FILE *pFile;char szFilename[

HalconDotNet中的图像特征与提取详解

文章目录 简介一、边缘特征提取二、角点特征提取三、区域特征提取四、纹理特征提取五、形状特征提取 简介   图像特征提取是图像处理中的一个重要步骤,用于从图像中提取有意义的特征,以便进行进一步的分析和处理。HalconDotNet提供了多种图像特征提取方法,每种方法都有其特定的应用场景和优缺点。 一、边缘特征提取   边缘特征提取是图像处理中最基本的特征提取方法之一,通过检

如何根据相同分隔符提取间隔数据?

最近遇到很多提问怎么提取字符的,而这些问题都有一个相同的特征,就是要提取的内容与内容之间,都有着相同的分隔符。当然,这种问题直接用“数据” →  “分列”功能就可以一步到位实现的,但有人喜欢折腾,而更多的人又非得指定函数公式的方法,或者更多的是要保持数据的同步性。   下面,我们就来讲讲用函数公式应该怎么实现这个提取,首先来个数据和要求,如下图,将 - 号间隔的内容依次提取到右边单元格内:

Kernel 中MakeFile 使用if条件编译

有时需要通过if  else来选择编译哪个驱动,单纯的obj-$(CONFIG_)就不是很方便,下面提供两种参考案例: 案例一: 来源:drivers/char/tpm/Makefileifdef CONFIG_ACPItpm-y += tpm_eventlog.o tpm_acpi.oelseifdef CONFIG_TCG_IBMVTPMtpm-y += tpm_eventlog.o

html记账本改写:数据重新布局,更好用了,没有localStorage保存版本

<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>htm记账本</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid bla

Java8特性:分组、提取字段、去重、过滤、差集、交集

总结下自己使用过的特性 将对象集合根据某个字段分组 //根据id分组Map<String, List<Bean>> newMap = successCf.stream().collect(Collectors.groupingBy(b -> b.getId().trim())); 获取对象集合里面的某个字段的集合 List<Bean> list = new ArrayList<>