FFmpeg跨平台编译指南:为armv7/armv7s/arm64/i386架构优化

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:FFmpeg是用于处理多媒体数据的开源框架,涵盖转换、编码、解码等多种功能。针对iOS设备上不同处理器架构(armv7, armv7s, arm64, i386)的特殊需求,本文详细介绍了如何进行FFmpeg的交叉编译。从FFmpeg的基本介绍到不同架构的特点,再到64位编译和交叉编译的详细步骤,本文为iOS开发者提供了一个全面的编译流程。编译过程中还涵盖了如何配置编译选项、使用工具链和合并目标文件为fat binary。文章最后提示了在App Store审核政策下的注意事项,以及如何根据项目需求对FFmpeg进行适当的裁剪。 FFmpeg跨平台编译指南:为armv7/armv7s/arm64/i386架构优化_第1张图片

1. FFmpeg开源多媒体框架概述

FFmpeg是一个功能强大的开源多媒体框架,它包括了从音视频录制、转换到流化等一系列功能,广泛应用于音视频处理领域。作为一个完整的命令行工具,FFmpeg同样提供了大量的编程接口供开发者使用。

1.1 FFmpeg功能特性

FFmpeg支持几乎所有的音视频格式,并且拥有高效的编码和解码能力。它还包含一个巨大的编解码库,其中囊括了从老旧的MPEG-1到现代的H.265/HEVC等编码技术。

1.2 应用场景

无论是在服务器端进行音视频流处理,还是在客户端开发媒体播放器,FFmpeg都能提供灵活多样的解决方案。同时,FFmpeg的可定制性让它在特定领域,如安全性、易用性和性能优化方面,可以进行深度开发。

1.3 社区与支持

作为一个活跃的开源项目,FFmpeg拥有庞大的社区支持和持续的更新。社区成员不断地在改进代码库,增加新功能,修复已知问题,并且提供丰富的文档和示例代码供参考。

2. ARM架构特点与选择

ARM(Advanced RISC Machines)架构是一种广泛应用于移动设备和嵌入式系统的精简指令集(RISC)处理器架构。其设计强调高能效比,使得搭载ARM处理器的设备在功耗和性能之间取得了良好的平衡。随着移动互联网和物联网的发展,ARM架构因其优越的特性在各个领域得到了广泛的应用。

2.1 ARM架构简介

2.1.1 ARM架构发展历程

ARM架构始于1985年,由Acorn Computers公司为了其个人计算机产品而设计。随后,ARM架构被苹果电脑采用,并逐步演变为今天我们所知的多种ARM架构版本。ARM的第一个商业产品是ARM2处理器,而之后的几年里,ARM不断地发布新的处理器版本,如ARM6, ARM7, ARM9,每一版本都在性能和功耗方面进行了优化。

进入21世纪,ARM架构开始向移动通信市场转型,推出了ARM11处理器系列。2008年,ARM推出了具有里程碑意义的Cortex处理器系列,其中包括针对不同市场的A系列(应用处理器)、R系列(实时处理器)和M系列(微控制器)。从此,ARM架构在移动设备市场占据了统治地位,成为绝大多数智能手机和平板电脑处理器的核心。

2.1.2 ARM核心架构的分类

ARM核心架构主要可以分为两大类:基于经典ARMv7架构的处理器和基于ARMv8架构的处理器,即64位的ARM64处理器。

  • ARMv7架构是32位处理器的最后一个主要版本,其下又有多个子版本,包括但不限于ARMv7-A(应用级,面向智能手机、平板电脑)、ARMv7-R(实时级,面向高端嵌入式系统)、ARMv7-M(微控制器级,面向低功耗微控制器)。
  • ARMv8架构引入了64位计算能力,增加了AArch64执行状态,使得ARM处理器在高性能计算领域有了更广阔的应用空间。

2.2 ARM架构特性分析

2.2.1 ARMv7架构特点

ARMv7架构是ARM技术发展的一个重要阶段,其特点包括: - 低功耗设计:ARMv7继续维持了ARM处理器一贯的低功耗优势,这对于移动设备尤其重要。 - 高性能:ARMv7架构通过提高处理器的时钟频率和优化的指令集,显著提升了性能。 - 扩展的指令集:加入了如NEON技术的SIMD(单指令多数据)扩展,支持多媒体和信号处理应用。

2.2.2 ARMv7s架构优化

ARMv7s是针对高性能应用进一步优化的版本,特点包括: - 内存访问的优化:引入了更高效的缓存机制和内存管理,减少内存访问延迟。 - 加强的异常处理:提高了异常和中断处理的效率,这对于实时操作系统特别重要。

2.2.3 ARM64架构的先进性

ARM64架构,即AArch64,引入了64位计算能力,具有以下特点: - 更大的地址空间:支持更大的内存寻址,这对于大型应用程序来说至关重要。 - 新指令集:例如,使用了全新的加密指令集,提升安全性能。 - 改进的性能:ARM64架构通过使用新的指令和执行机制显著提高了性能。

2.2.4 i386架构的兼容性

i386架构是由Intel开发的x86架构处理器,它广泛用于桌面和服务器系统。ARM处理器的i386架构版本主要是为了与现有的软件生态保持兼容性,特别是Linux操作系统。

2.3 架构选择对编译的影响

2.3.1 不同架构性能对比

不同ARM架构之间,性能的差异主要体现在计算能力、内存管理以及对于特定应用的优化程度上。例如,一个高度优化的ARMv7s处理器可能在特定任务上超越性能较低的ARM64处理器。选择时,应根据实际应用场景来权衡各方面性能。

2.3.2 应用场景与架构匹配

对于嵌入式应用而言,由于对功耗和体积的要求更高,ARMv7-M架构可能更为合适。而对于需要高性能计算和大内存空间的应用,则ARM64架构是更佳的选择。因此,开发者需要根据实际需求来选择最合适的处理器架构。

2.4 小结

ARM架构因其出色的性能和能效比,成为移动设备和嵌入式系统的首选。ARMv7架构到ARM64架构的演进,不仅带来了性能的提升,也扩展了ARM处理器的应用范围。选择合适的ARM架构对于充分发挥设备性能和满足应用需求至关重要。在下节中,我们将探讨64位编译对性能的提升,这与选择适合的ARM架构息息相关。

3. 64位编译对性能的提升

随着技术的进步,处理器架构也不断迭代更新,64位计算已经逐渐成为主流。这一部分将深入探讨32位与64位架构之间的差异,64位编译的性能优势,以及在转向64位编译过程中需要考虑的因素。

3.1 32位与64位架构对比

3.1.1 处理器架构基础

处理器架构决定了计算机的基本结构和功能。32位处理器在历史上扮演了重要角色,但随着技术的发展,64位处理器以其更宽的数据通道和更大的寻址能力成为了现代计算的主力。了解两者的基础差异是理解性能提升的关键。

3.1.2 地址空间与数据处理能力

32位处理器使用32位寄存器,理论上能够寻址2^32 = 4GB的内存。然而,在实际应用中,由于操作系统的限制,实际可用的内存往往少于4GB。相比之下,64位处理器使用64位寄存器,能够寻址高达2^64字节的内存,这为处理大量数据提供了基础保障。

3.2 64位编译的优势

3.2.1 性能提升原理

64位编译的优势主要体现在以下几个方面:

  • 更大的内存支持 :应用程序可以使用更多的内存,避免了内存不足导致的性能瓶颈。
  • 更快的运算速度 :64位处理器可以同时处理更多的数据,提高了数值计算的效率。
  • 改进的系统架构 :64位系统往往伴随着更先进的优化技术,如多核并行处理和指令集扩展。

3.2.2 实际应用案例分析

在FFmpeg这样的多媒体处理库中,64位编译带来的性能提升尤为显著。例如,在视频转码任务中,64位编译的FFmpeg能够更快地完成转码过程,减少等待时间,提高工作效率。

3.3 64位编译的考量与策略

3.3.1 软件兼容性问题

64位编译在提升性能的同时,也带来了软件兼容性问题。一些旧的库和应用程序可能未针对64位进行优化,或者存在32位专有的功能,这些都需要在转向64位之前仔细考虑。

3.3.2 转向64位的步骤与建议

转向64位编译是一个逐步的过程,以下是一些步骤与建议:

  1. 代码审计 :检查代码中是否有32位特有代码,确保代码可以在64位环境下运行。
  2. 依赖库更新 :确保所有的依赖库都支持64位编译。
  3. 性能测试 :进行详细的性能测试,确保64位编译后性能提升符合预期。
  4. 用户培训 :如果应用面向用户,提供相应的支持和培训,帮助用户过渡到64位版本。

在接下来的章节中,我们将详细探讨如何实现交叉编译以适应不同平台,优化工具链配置,以及创建与维护多架构的fat binary。这些技能对于任何希望在64位架构中最大化性能的开发者来说都是至关重要的。

4. 交叉编译步骤详解

4.1 交叉编译环境搭建

4.1.1 选择合适的交叉编译工具链

在进行交叉编译之前,开发者需要选择一个合适的交叉编译工具链。工具链的选择取决于目标平台的架构,以及项目中所使用的编程语言。对于ARM架构,通常使用的是GNU工具链,即一系列由GCC(GNU Compiler Collection)和binutils组成的工具集合。此外,还有一些商业和开源的工具链可供选择,例如ARM自己提供的DS-5 Development Studio,或者其他第三方工具,如Linaro。

工具链的版本也需考虑,因为不同版本的工具链在性能优化、支持的语言特性等方面可能有所不同。在选择工具链时,需要确保其与目标硬件设备和操作系统版本兼容。

4.1.2 环境变量的设置

安装工具链之后,需要设置一系列的环境变量以便在编译过程中正确调用工具链中的程序。这些环境变量主要包括 PATH CC (C编译器), CXX (C++编译器), AR (归档器), AS (汇编器)等。以bash环境为例:

export PATH=/path/to/cross-compiler/bin:$PATH
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export AR=arm-linux-gnueabihf-ar
export AS=arm-linux-gnueabihf-as

其中 /path/to/cross-compiler/bin 是交叉编译工具链的安装路径。设置这些变量后,任何使用这些变量定义的编译器的编译命令都会调用交叉编译器。

4.2 FFmpeg的交叉编译过程

4.2.1 下载和配置源码

交叉编译FFmpeg之前,首先需要获取其源代码。可以使用git从其官方仓库克隆:

git clone git://git.videolan.org/ffmpeg.git ffmpeg

获取源码后,创建一个构建目录,并在构建目录中调用工具链的配置脚本:

cd ffmpeg
mkdir cross-compile
cd cross-compile
/path/to/cross-compiler/bin/$(target)-gcc -D__STDC_CONSTANT_MACROS -I../libavcodec -I../libavformat -I../libavutil -I../libavresample -I../libpostproc -I../libswscale -I../libswresample ../configure --target-os=linux --arch=arm --enable-cross-compile --cc=$(target)-gcc --prefix=../output

这里 $(target) 根据目标架构替换为相应的交叉编译器前缀,例如 arm-linux-gnueabihf- --enable-cross-compile 标志用于启用交叉编译模式,其他相关参数根据实际需要进行配置。

4.2.2 编译前的准备与优化

在执行编译之前,应确保所有依赖库都已正确准备,并且目标平台上的某些库可能需要交叉编译。例如,对于FFmpeg来说,通常需要 libx264 libfdk-aac 等库,这些库的交叉编译方法类似,但可能需要调整编译器标志和链接器标志。

编译优化可以通过启用特定于目标硬件的编译器优化标志来实现。例如,为ARM处理器启用NEON指令集的优化:

CFLAGS="-mfloat-abi=hard -mfpu=neon" ../configure --target-os=linux ...

4.2.3 执行编译命令

准备和优化完成后,可以执行 make 命令来编译FFmpeg:

make -j$(nproc)

-j$(nproc) 标志告诉 make 使用所有可用的处理器核心来加速编译过程。编译完成后,可以安装FFmpeg:

make install

安装完成后,FFmpeg及其库文件会出现在之前指定的 --prefix 目录中。为了测试安装是否成功,可以执行:

/path/to/cross-compiler/bin/$(target)-ffmpeg -version

如果能够看到版本信息,则表示交叉编译成功。

4.3 跨平台编译的挑战与解决方案

4.3.1 依赖库的交叉编译

在交叉编译FFmpeg时,依赖库的交叉编译也是一个挑战。许多依赖库可能需要从源代码编译,且编译器和链接器的标志可能需要根据目标平台进行调整。此外,一些库可能没有现成的交叉编译工具链可用,需要手动设置工具链路径和编译器标志。

4.3.2 编译中遇到的问题及解决办法

在编译过程中可能会遇到各种问题,如不支持的指令集、缺少某些平台特定的头文件或库。解决这些问题的策略包括:

  • 确保所有依赖项都已正确编译和安装。
  • 查看交叉编译工具链的文档,了解对特定目标架构的支持情况。
  • 在遇到编译错误时,仔细阅读错误信息,并检查是否有缺少的编译器标志。
  • 对于平台特定的问题,可参考目标平台的开发者社区和论坛,查找是否有现成的解决方案或补丁。

通过上述步骤,可以成功地在指定的目标架构上交叉编译FFmpeg,并解决编译过程中遇到的问题。

5. 编译选项与工具链配置

5.1 FFmpeg编译选项详解

5.1.1 核心编译选项

编译FFmpeg时,核心编译选项决定了哪些组件将被编译进最终的二进制文件,以及针对特定功能的配置。使用 ./configure 脚本是配置这些选项的标准方式。

./configure --enable-gpl --enable-nonfree ...

在上述命令中, --enable-gpl 使得FFmpeg能够使用GPL协议保护的编码器和解码器,而 --enable-nonfree 则允许使用那些非自由的编码器。除了这些,还有诸如 --enable-libx264 来包含特定的库(例如x264编码器)。根据具体需求,可以启用或禁用许多其他编译选项。

5.1.2 优化选项与性能调整

FFmpeg提供了多种编译时优化选项,以便开发者根据目标平台进行性能调整。

./configure --enable-shared --enable-static ...

例如, --enable-shared 选项用于生成动态链接库,而 --enable-static 用于生成静态链接库。通过调整这些选项,开发者可以优化最终应用的加载时间和运行效率。

5.2 工具链配置与优化

5.2.1 工具链的选择标准

选择合适的编译工具链对跨平台开发至关重要。工具链的选择会影响编译过程、目标平台的兼容性以及生成的代码质量。

在ARM架构上,通常选择GNU编译器集合(GCC)或Clang/LLVM。 arm-none-eabi-gcc 是针对裸机开发的常用工具链,而针对iOS等平台则可能选择Clang。

5.2.2 配置工具链的步骤

配置工具链通常涉及设置环境变量,比如 PATH ,这样系统才能找到编译器和其他工具。

export PATH=/path/to/toolchain/bin:$PATH

在此基础上,可以运行 ./configure 脚本来初始化配置环境。对于复杂的项目,可能还需要手动编辑 config.mak 文件来指定更多细节。

5.2.3 工具链优化策略

为了得到性能最优的FFmpeg库,可以采取以下优化策略:

  • 利用 -O2 -O3 优化编译选项。
  • 使用 -march=native 来启用针对当前CPU架构的特定优化。
  • 对于ARM架构,可以使用 -mfpu=neon 来启用NEON指令集进行浮点数运算加速。
CFLAGS="-O3 -mfpu=neon" ./configure ...

在进行编译时,建议分别测试不同的编译标志,因为不同的目标平台可能对优化选项有不同的响应。

5.3 交叉编译选项的配置

在进行交叉编译时,FFmpeg允许通过 --target-os --arch 来指定目标操作系统和CPU架构。例如,在编译ARM架构的FFmpeg时:

./configure --target-os=linux --arch=arm ...

此外,对于特定的硬件加速,如ARM Mali GPU,可以通过编译选项 --enable-mmal --enable-v4l2-m2m 来启用。

FFmpeg的编译选项非常丰富,这里仅展示了几个核心的选项。在实际开发中,开发者应仔细阅读FFmpeg的官方文档,以了解和利用更多高级特性,从而构建出最佳配置的媒体处理库。

6. 使用lipo创建fat binary

6.1 fat binary概念与重要性

6.1.1 fat binary定义

在多架构的计算环境中,fat binary(也称为fat binary)是一种特殊的可执行文件,它包含了针对不同处理器架构编译的多个版本的代码。这样的文件能够在一个包内支持多种CPU架构,例如在ARM和x86架构间切换。在Apple的产品中,常见的fat binary格式包括支持i386、x86_64、ARMv7和ARM64的二进制文件。使用fat binary可以确保应用程序在不同的硬件平台或模拟器上运行时的兼容性和稳定性。

6.1.2 支持多架构的必要性

随着技术的发展,移动设备和服务器硬件变得越来越多样化。例如,苹果的iOS设备从32位架构过渡到64位架构,同时也存在不同版本的ARM处理器。此外,开发者可能需要在模拟器或实际设备上测试他们的应用。为了简化开发和分发流程,支持多种架构是必需的。fat binary允许多个目标架构在单个二进制文件中共存,这让开发者在打包和分发应用时不必区分不同架构的用户。

6.2 lipo工具的使用

6.2.1 lipo命令基本用法

lipo 是Apple提供的一个命令行工具,它可以用来创建、修改以及分析fat binary文件。下面是使用 lipo 的一些基本命令和它们的用途:

  • 创建fat binary: lipo -create [ ...] -output
  • 显示fat binary的信息: lipo -info
  • 删除指定架构: lipo -remove -output

创建一个fat binary的基本命令示例如下:

lipo -create input_x86 input_armv7 input_arm64 -output output_fat

6.2.2 创建与维护fat binary的步骤

创建一个fat binary涉及到多个步骤,以下是一个简化的流程:

  1. 分别针对目标架构编译源代码。这一步骤通常在交叉编译章节中详细介绍,包括了下载源码,配置编译环境,以及执行编译命令。

  2. 使用 lipo 命令合并不同架构的二进制文件。上文提到的创建命令就是这个步骤的体现。

  3. 验证fat binary的正确性。使用 lipo -info 命令可以验证架构是否已经正确合并。

  4. 测试fat binary以确保其在不同架构上能正确运行。这一步骤通常包括在相应架构的模拟器或硬件上运行二进制文件。

  5. 根据需要更新或删除特定架构。如果未来需要对产品进行优化或有新的架构支持需求,可以使用 lipo -remove 或重新创建一个新的fat binary。

6.3 跨架构部署与优化

6.3.1 架构兼容性考量

创建一个跨架构的部署包是一个需要平衡多方面因素的复杂任务。不仅要确保软件在不同的硬件上能够运行,还要考虑以下几点:

  • 性能:不同的CPU架构可能在性能表现上有显著差异,要确保软件在所有目标架构上都有良好的性能表现。
  • 应用大小:如果软件包过大,可能会影响下载和安装速度,进而影响用户体验。
  • 维护成本:维护跨架构的软件需要更多的资源,包括测试和兼容性修复。

6.3.2 性能优化与兼容性平衡

在优化和兼容性之间找到平衡是至关重要的。以下是实现这一点的一些策略:

  • 动态链接库(DLLs) :使用动态链接库可以减小最终的软件包大小,并且在后期维护时只需要替换动态库而不必重新打包整个应用。
  • 可选架构支持 :根据目标用户的设备架构比例来决定支持哪些架构。例如,如果目标市场中较新的ARM64设备占有很大份额,那么优先保证对它的兼容和性能优化。
  • 条件编译 :利用FFmpeg等库支持的条件编译指令,可以为不同的架构定制特定优化。
  • 性能测试 :定期对不同架构进行性能测试,及时发现并修复可能影响兼容性和性能的问题。

下面是一个表格,描述了不同架构的典型应用场景和性能特点:

| 架构 | 应用场景 | 性能特点 | |-----------|------------------------|------------------| | ARMv7 | 旧版iOS设备和部分Android设备 | 较低的性能,较高的兼容性 | | ARM64 | 新款iOS设备和部分Android设备 | 更高的性能,对新特性的支持 | | x86_64 | 开发和模拟器测试 | 优秀的兼容性,较差的移动设备性能 | | i386 | 模拟器测试,老旧设备 | 兼容性较好,性能有限 |

请注意,性能优化和兼容性平衡是一个持续迭代的过程,随着硬件和软件环境的不断变化,需要定期评估和调整策略。

7. iOS开发中FFmpeg的集成与测试

随着移动设备性能的飞速提升,多媒体应用成为了日常生活中不可或缺的一部分。FFmpeg作为一款功能强大的多媒体处理框架,在iOS平台上的集成与测试尤为重要。本章将探讨FFmpeg在iOS开发中的集成与测试流程,确保开发者能够顺利地在iOS项目中使用FFmpeg。

7.1 FFmpeg集成到iOS项目

7.1.1 集成FFmpeg到Xcode项目

要在iOS项目中集成FFmpeg,首先需要将FFmpeg库文件集成到Xcode项目中。开发者可以通过以下步骤完成这一过程:

  1. 下载FFmpeg源码并解压。
  2. 打开终端,切换到FFmpeg源码目录。
  3. 运行 ./configure 命令,配置FFmpeg编译选项。
  4. 使用 make 命令编译FFmpeg。
  5. 运行 make install 命令将编译后的库文件安装到指定目录。
  6. 在Xcode项目中添加FFmpeg库文件到项目设置中的“Link Binary with Libraries”。
  7. 配置“Library Search Paths”和“Header Search Paths”以便编译器能够找到FFmpeg的库文件和头文件。
# 示例:编译并安装FFmpeg
./configure --enable-shared --disable-static --prefix=/path/to/your/installation/directory
make
make install

7.1.2 配置项目以支持FFmpeg

集成FFmpeg库后,需要确保Xcode项目正确配置以支持FFmpeg:

  1. 在Xcode项目中配置“Other Linker Flags”,添加必要的库链接标志。
  2. 为了确保项目能够使用FFmpeg的API,需要包含FFmpeg的头文件路径。
  3. 验证构建设置确保链接器和编译器能找到FFmpeg库文件及头文件。

7.2 在iOS设备上测试FFmpeg

7.2.1 测试环境的搭建

在iOS设备上测试FFmpeg应用,需要一个能够运行FFmpeg命令和脚本的环境。测试环境的搭建步骤包括:

  1. 在Mac上配置好Xcode和iOS SDK。
  2. 创建一个新的iOS应用项目或使用现有项目。
  3. 将FFmpeg集成到项目中,按照7.1节中的说明操作。
  4. 搭建一个适用于iOS设备的构建和部署环境。

7.2.2 测试案例与性能评估

测试FFmpeg集成是否成功,可以采取以下步骤:

  1. 在项目中创建一个测试用例,调用FFmpeg库进行简单的视频处理。
  2. 使用Xcode提供的调试和性能分析工具进行测试。
  3. 在真实iOS设备上部署应用,进行全面的功能和性能测试。
  4. 收集测试数据并进行分析,评估FFmpeg在iOS设备上的表现。

7.3 App Store审核政策与FFmpeg

7.3.1 审核政策中对多媒体的要求

在将集成了FFmpeg的应用提交到App Store时,需要符合Apple的审核政策,特别是与多媒体相关的部分:

  1. 确保应用中使用的所有多媒体内容都拥有适当的版权和权限。
  2. 确保应用不包含违规内容,如色情、暴力或违法信息。
  3. 提供良好的用户体验,例如合理的视频缓冲时间和播放质量。

7.3.2 FFmpeg集成的合规性检查

在提交应用之前,开发者应确保FFmpeg的集成符合Apple的要求:

  1. 检查FFmpeg库是否包含任何违反App Store政策的组件或功能。
  2. 确认FFmpeg的版本是最新稳定版本,并且未包含任何已知的安全漏洞。
  3. 提供关于如何使用FFmpeg进行多媒体处理的详细文档,并保证这些功能不违反任何隐私政策。
  4. 测试应用在不同iOS版本上的兼容性和性能,确保没有异常崩溃或性能问题。

通过遵循这些步骤,开发者可以确保他们的iOS应用在集成FFmpeg的同时,也满足了App Store的相关政策和要求,顺利通过审核,为用户提供优质的应用体验。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:FFmpeg是用于处理多媒体数据的开源框架,涵盖转换、编码、解码等多种功能。针对iOS设备上不同处理器架构(armv7, armv7s, arm64, i386)的特殊需求,本文详细介绍了如何进行FFmpeg的交叉编译。从FFmpeg的基本介绍到不同架构的特点,再到64位编译和交叉编译的详细步骤,本文为iOS开发者提供了一个全面的编译流程。编译过程中还涵盖了如何配置编译选项、使用工具链和合并目标文件为fat binary。文章最后提示了在App Store审核政策下的注意事项,以及如何根据项目需求对FFmpeg进行适当的裁剪。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

你可能感兴趣的:(FFmpeg跨平台编译指南:为armv7/armv7s/arm64/i386架构优化)