1.FFMPEG编译裁剪移植
2.FFmpeg开发笔记(八)Linux交叉编译Android的源码FFmpeg库
3.FFmpeg交叉编译、脚本参数配置
4.Mac平台下的编译FFmpeg的安装编译
5.极智开发 | ubuntu源码编译gpu版ffmpeg
6.msys2编译FFmpeg全网最详细步骤
FFMPEG编译裁剪移植
1.ffmpeg文件结构说明
1.1 ffmpeg模块说明
libavformat
用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的源码格式解析协议,为 libavcodec 分析码流提供独立的编译音频或视频码流源。
libavcodec
用于各种类型声音/图像编解码。源码该库是编译oe 源码 改版本音视频编解码核心,实现了市面上可见的源码绝大部分解码器的功能。
libavdevice
硬件采集、编译加速、源码显示。编译操作计算机中常用的源码音视频捕获或输出设备。
libavfilter
音视频滤波器的编译开发,如宽高比、源码裁剪、编译格式化、源码非格式化伸缩。
libavutil
包含一些公共的工具函数的使用库,包括算数运算、字符操作。
libavresample
音视频封转编解码格式预设等。
libswscale
原始视频格式转换,用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb、rgb 等与 yuv 等之间转换。
libswresample
原始音频格式转码。
libpostproc
同步、时间计算的简单算法,用于后期效果处理;音视频应用的后处理,如图像的去块效应
在编译ffmpeg源码之前,我们可以通过配置编译参数选择是否编译生成如上库。一般而言,要实现最基本的音视频编解码功能,libavformat,libavcodec,libavutil这三个库是不可缺少的。我们通过使能或失能ffmpeg支持的组件,如编解码器、分流器、合流器、解析器、协议类型等,orb源码解析来裁剪库文件的大小。
1.2名词解释
encoder // 编码器
decoder // 解码器
hwaccel // 硬件加速器
muxer // 合流器
demuxer // 分流器
parser // 解析器
bsf // 比特过滤器
protocol // 协议
indev // 输入设备
outdev // 输出设备
filter // 过滤器
相关学习资料推荐,点击下方链接免费报名,先码住不迷路~
音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
免费分享音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 加群免费领取~
2.编译
ffmpeg 编译帮助
主要包含一下选项
Help options // 帮助选项,可以查看全部支持的编解码,硬件加速器,解析器、输入输出设备等参数的列表,一般做裁剪时需要查询;
Standard options // 标准选项,主要是目录路径相关的设置,常用的为--prefix=PREFIX 设置安装路径;
Licensing options // license 相关选项 GPL使能设置相关;
Configuration options // 配置选项,常用的--disable-static关闭静态库 默认是开启静态库编译的--enable-shared 使能动态库编译,编译出动态库--enable-small优化大小而不是注重运行速度;
Program options // 编译出工具文件,一般的bin文件,常用的ffmpeg ffprobe 和ffplay三个工具的bin文件编译;
Documentation options // 文档选项,是否构建文档页面,个人猜测是工具的帮助文件是否编译进去,里面支持html manpage txt等格式文件;
Component options // 组件选项,常用使能或者关闭某些模块的编译,libavformat,libavcodec,libavutil这三个库一般是不可或缺的,还有其他的组件按自己需要使能;
Individual component options // 独立的组件选项,更为具体的组件编译选项,如果需要剪裁一般情况先使用--disable-everything 关闭全部的组件,然后再单独开启需要的组件;
External library support // 扩展库支持,允许FFmpeg链接到相应的外部库;
Toolchain options // 工具链选项,交叉编译常用,比较常用的--arch=ARCH 指定系统架构 --cpu=CPU指定cpu类型 --cross-prefix交叉编译工具链前缀 --enable-cross-compile 使能交叉编译--target-os=OS指定操作系统;
Advanced options (experts only) // 高级选项,一般较少使用,不懂的请慎用,以免引进bug;
Optimization options (experts only): --disable-asm关闭所有的优化选项
Developer options (useful when working on FFmpeg itself): --disable-debug 关闭调试符号信息,减小库大小;
2.1全编配置
采用默认配置 交叉编译,在当前目录下output文件夹生成对应的文件
编译后的文件夹下有bin include lib share 目录bin存放交叉编译后的ffmpeg等工具bin文件,include目录存放头文件,移植需要 lib存放动态和静态库,如何attach源码将lib里面的文件拷贝到板端或者静态库使用即可;
编译后未经裁剪的ffmpeg库实在太大,十几M的大小,需要裁剪;
2.2裁剪库
ffmpeg 库过大,很多功能其实没必要使用的, 裁剪为仅支持mp4 和 avi两种格式的视频,avi:视频采用h编码,音频采用pcm_alaw mp4:视频h,音频aac格式;这个指令其实还可以进一步裁剪,不想麻烦,够用就行,不再裁剪@_@;
裁剪后的文件大小最大也只剩1.1M,大小减少倍;
3.ffmpeg移植问题
3.1时间冲突问题
libavutils/time.h文件名字和linux系统的time.h的名字冲突,在编译的时候会出现time.h文件是有两个,无法区分是哪个time.h,因此会出现报错,如果在ffmepg里将time.h文件重命名可以解决这个问题,但这样太麻烦而且容易出错,采用另外一种方式,将makefile的搜索路径更改为只搜索到include文件夹,然后在include文件夹下放置相关的头文件,而在调用的c文件上路径改为
这样就躲开了搜索文件名字一样的问题,其本质是将ffmpeg的time.h重新命名为libavutils/time.h
3.2函数符号导出问题
由于移植需要单独导出库内部的局部函数,如mov_write_packet mov_write_header mov_write_trailer等函数,将movenc.c对应函数的static去掉,同时在libavformat.h文件声明函数,但是生成的库会发现没有找到对应的函数符号
avi相关的函数也做同样的处理,但是avi有这个函数符号,这个问题只能反推编译过程查找哪里将函数符号屏蔽掉了采用指令
发现在生成库的时候会调用一个脚本文件,这个脚本文件最后在config.mak里面指定了
--version-script这个选项仅仅导出要使用的符号表,这个文件对应libavformat里面的就是libavformat.vlibavformat.verlibavformat.version,后两个文件都是根据第一个文件产生的,查看libavformat.v文件
显然,在这里屏蔽掉了非av开头的全部函数,所有mov开头的函数无法被外部调用,因此更改这个文件,将mov开头的函数也导出
重新编译发现可以调用mov开头的函数了。
不足之处,敬请指出,谢谢^_^
4.参考资料
CSDN 博客 SigmaStarDocs 《ffmpeg基础库编程开发》
原文 FFMPEG编译裁剪移植_ffmpeg编译到移远模块_Kingkim的博客-CSDN博客
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境中进行FFmpeg库的Android交叉编译,首先需要下载Linux版本的android-ndk-re。登录Linux服务器,例如华为云的欧拉系统,执行以下步骤:
1. 进入`/usr/local/src`目录:
cd /usr/local/src
2. 下载并解压ndk:
curl -O dl.google.com/android/r...
unzip android-ndk-re-linux-x_.zip
接下来,你需要将FFmpeg及相关库(如x、freetype、android摄像源码lame)的源码上传到服务器,并进行必要的修改:
- 解压源码,替换`SYSTEM=windows-x_`为`SYSTEM=linux-x_`,并确保sh文件无回车符。
- 修改`config_x.sh`、`config_freetype.sh`等文件,赋予可执行权限:
chmod +x config_*.sh
3. 编译x库,修改configure文件并执行编译:
修改configure文件
./config_x.sh
make -j4
make install
4. 对其他第三方库进行类似操作:
./config_xxx.sh
make -j4
make install
5. 配置环境变量`PKG_CONFIG_PATH`:
在.bash_profile中添加环境变量
source .bash_profile
6. 最后,编译FFmpeg库:
./config_ffmpeg_full.sh
make -j4
make install
完成后,可以在指定目录找到so文件,并将其复制到App工程的jniLibs\arm-v8a目录,然后按照《FFmpeg开发实战:从零基础到短视频上线》的章节“.1.3 App工程调用FFmpeg的so库”进行App的配置、编译和运行。
FFmpeg交叉编译、脚本参数配置
一:下载并解压ffmpeg源码
使用git或wget下载ffmpeg源码到/root/ff目录,安装git或wget后执行命令解压。
检查解压后的文件。
使用tar命令解压ffmpeg-3.4.tar.bz2文件。
使用unzip命令解压NDK压缩包。
查看目录结构。
安装make工具,用于自动化编译工作,提高效率。
二:配置编译脚本
定义环境变量,包括NDK目录、架构下的so库和头文件、交叉编译工具、CPU类型和输出路径。
使用env命令查看环境变量。
解决NDK版本r后gcc兼容问题,通过修改cc路径使用clang。
执行make命令进行编译,使用-j参数指定并行任务数,编译完成后执行make install安装。
在指定路径下生成输出文件。
三:创建Shell脚本
创建并编辑android.sh文件,实现自动化交叉编译流程。
调整脚本参数实现动态配置。
重新执行脚本,生成编译结果。
Mac平台下的cms asp 源码FFmpeg的安装编译
在Mac平台上安装FFmpeg有三种途径:静态库下载、Homebrew安装和源码编译。每种方法各有优劣,适合不同的需求和学习目的。1. 静态库下载安装
从FFmpeg官网下载可执行文件,简单快捷但不利于深入学习。解压后,在终端运行即可,可设置环境变量方便全局使用。2. Homebrew安装
通过Homebrew安装较为简便,但不推荐。首先确保安装了必要的工具如CLT,然后通过brew uninstall卸载旧版本,执行相应指令安装。注意Homebrew 2.0后可能需要第三方仓库来关联编解码器选项。3. 源码编译安装
从官网下载源码,编译过程可能遇到依赖问题,但能深入研究FFmpeg。配置编译路径,然后执行编译安装,最后添加环境变量以使FFmpeg可用。4. iOS平台库编译
为了iOS开发,需要针对平台编译库文件。从指定地址下载编译脚本,对libfdk-aac和libx进行编译,完成后在工程中配置头文件和库文件路径。极智开发 | ubuntu源码编译gpu版ffmpeg
欢迎访问极智视界公众号,获取更多深入的编程知识与实战经验分享。
本文将带你了解在 Ubuntu 系统中,如何进行源码编译,获得 GPU 加速版本的 FFmpeg 工具。
FFmpeg 是一款功能强大的音视频处理工具,支持多种格式的音视频文件,并提供了丰富的命令行工具和库,允许开发者在 C 语言或其他编程语言中进行音视频处理。
然而,FFmpeg 本身并不具备 GPU 加速功能。通过集成 CUDA SDK、OpenCL 或 Vulkan 等第三方库,能够实现 FFmpeg 的 GPU 加速,显著提升处理速度和性能。
在本文中,我们将重点介绍如何在 Ubuntu 系统中编译 GPU 加速版本的 FFmpeg。
首先,确保已安装 nv-codec-hearers,这是 NVIDIA 提供的 SDK,用于在 GPU 上加速 FFmpeg 的操作。
接下来,安装 FFmpeg 编码库和相关依赖,完成 FFmpeg 的编译配置。
最后,运行编译命令,检查 FFmpeg 是否成功安装并验证 GPU 加速功能。
至此,GPU 加速版本的 FFmpeg 已成功编译和安装,能够为你在音视频处理任务中带来显著性能提升。
通过极智视界公众号,获得更多有关人工智能、深度学习的前沿技术与实用知识,欢迎加入知识星球,获取丰富的资源与项目源码,共同探索 AI 领域的无限可能。
msys2编译FFmpeg全网最详细步骤
本文提供详细步骤使用msys2编译FFmpeg源码,无需安装mingw。msys2在Windows上模拟Linux环境,允许使用大多数shell命令,类似于虚拟机但更轻量级。首先,从msys2.github.io下载并安装msys2到D盘,避开系统盘C盘。
在安装过程中,若进度卡住,可取消安装后重新尝试。安装完毕后,进入安装目录启动msys2_shell.cmd,并调整字符集以避免中文乱码。确保设置生效后重启msys2_shell.cmd。
接着,更换msys2的国内源,可参考相关指南。免费音视频学习资源推荐,包括FFmpeg、WebRTC、RTMP等技术,点击下方链接免费报名,先保存学习路径。
使用msys2安装软件,如yasm、make、diffutils、pkg-config。若安装缓慢,多次尝试直至完成。通过命令查看gcc安装状态。
下载最新FFmpeg源码(FFmpeg4.2.2),创建名为“SourceCode”的文件夹,解压源码并存放其中。
通过命令行进入msys2目录,配置FFmpeg编译参数,例如指定安装路径。生成的Makefile文件将用于编译过程。此步骤可使用批处理文件执行以提高效率。
编译完成后,ffmpeg库和可执行文件位于msys/usr/local/ffmpeg/bin目录。将msys\mingw\bin下的dll库复制到msys\usr\local\ffmpeg\bin,以确保依赖性。
需x库时,先编译x库,再编译FFmpeg。遵循本指南的详细步骤,您将成功在Windows上使用msys2编译FFmpeg源码。
FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg
FFmpeg是一款功能强大的多媒体编码和解码工具,支持Linux、macOS、Windows、Android等操作系统,如Ubuntu、Debian、Mint、CentOS、RHEL、Fedora等分支。
在CentOS上编译安装FFmpeg涉及一系列步骤,确保工具包的安装,然后单独安装NASM、Yasm、libx、libx、libfdk_aac、libmp3lame、libopus、libvpx等依赖库。接着,配置并安装libx、libx、libfdk_aac等关键库,最后编译安装FFmpeg。具体步骤包括使用git下载源码,配置编译选项,执行make和make install命令,确保所有依赖正确安装。
对于EulerOS(欧拉系统),基于CentOS源码开发,运行环境兼容CentOS。在欧拉系统上编译安装FFmpeg,同样需要安装一些基础工具和依赖库,如nasm、g++、openssl-devel、curl-devel、cmake、git等。接下来,下载并编译x、x和FFmpeg源码包,使用特定命令配置编译选项,并完成make和make install操作。最终,通过执行ffmpeg -version命令验证FFmpeg安装成功。
通过遵循上述步骤,用户可以在不同操作系统如CentOS和EulerOS上成功编译安装FFmpeg,实现多媒体编码和解码功能。
Windows下编译FFmpeg
在学习FFmpeg时,Linux(Ubuntu)系统或Mac系统因其优势常常被推荐使用,而非Windows系统。原因在于Windows环境下编译FFmpeg较为繁琐,这增加了学习成本。此外,Windows环境下使用FFmpeg所需的依赖库,如fdk-aac、x等,也需要单独编译,进一步增加了操作难度。然而,对于在Windows系统下使用FFmpeg有需求的同学,本文将提供一套详细的编译和使用方法,旨在帮助大家克服这一难题。
首先,搭建编译环境是关键步骤。需要准备一台装有Windows系统的电脑,并安装Visual Studio,推荐使用VS或VS社区版,最新版本更推荐使用VS。安装VS后,还需安装MSYS2,这是一款在Windows环境下模拟Linux的软件,FFmpeg的编译工作在其中进行。需要注意的是,在下载MSYS2时可能需要网络代理,且通过百度盘下载的版本可能较旧,建议有条件的同学从官网下载。
下载并准备FFmpeg源码是下一步。通过MSYS2安装目录下的msys2_shell.cmd文件,通过注释打开以让MSYS2继承Windows控制台环境变量。找到x Native Tools Command Prompt for VS 命令窗口,进入后执行命令安装编译工具。在MSYS2命令窗口中,通过命令进入FFmpeg源码目录并生成Makefile文件,定义编译工具链、编译库位置、编译类型及不生成特定程序。执行Makefile文件生成的编译命令,即可完成FFmpeg编译。
编译完成后,FFmpeg库会被安装到指定目录。在Windows系统中找到该目录的方法是确定MSYS2根目录,通常位于D:\MSYS。编译好的FFmpeg库位于D:\MSYS\usr\local\ffmpeg目录下。
在Visual Studio项目中引用FFmpeg库,首先创建新项目,添加头文件和库文件路径,确保VS能正确编译代码。引入头文件时需注意使用extern "C"关键字,并确保将库正确添加到项目中。运行编译好的程序时,若出现找不到动态库的错误,只需将已编译的FFmpeg库复制到执行程序所在目录即可。
若需编译FFmpeg依赖库如SDL、x等,同样需要在Windows系统下进行编译。以SDL为例,获取源码并使用CMake生成VS工程,编译出适用于Windows的动态库。同样地,x和fdk-aac的编译也遵循类似流程,确保输出目录结构符合FFmpeg的要求。
最后,设置环境变量PKG_CONFIG_PATH,告知FFmpeg相关库的位置。重新生成Makefile文件并重新编译,将编译好的依赖库拷贝到FFmpeg的bin目录下,即可执行ffmpeg.exe或ffplay.exe命令。
综上,本文详细介绍了在Windows系统下编译和使用FFmpeg的方法。对于Windows环境下编译FFmpeg的难点在于搭建编译环境和处理依赖库的编译问题。通过本文提供的步骤和方法,希望可以帮助大家顺利地在Windows系统下使用FFmpeg,克服学习成本和操作难度,进一步推动学习进程。