FFMPEG 编译裁剪移植


author:lyn
date:2022.09.26
version: ffmpeg4.1.3

1.ffmpeg文件结构说明

2.ffmpeg交叉编译

3.ffmpeg移植问题

4.参考资料


1.ffmpeg文件结构说明

1.1 ffmpeg模块说明
  • libavformat
    用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
  • libavcodec
    用于各种类型声音/图像编解码。该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能。
  • libavdevice
    硬件采集、加速、显示。操作计算机中常用的音视频捕获或输出设备。
  • libavfilter
    音视频滤波器的开发,如宽高比、裁剪、格式化、非格式化伸缩。
  • libavutil
    包含一些公共的工具函数的使用库,包括算数运算、字符操作。
  • libavresample
    音视频封转编解码格式预设等。
  • libswscale
    原始视频格式转换,用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565、rgb888 等与 yuv420 等之间转换。
  • libswresample
    原始音频格式转码。
  • libpostproc
    同步、时间计算的简单算法,用于后期效果处理;音视频应用的后处理,如图像的去块效应

在编译ffmpeg源码之前,我们可以通过配置编译参数选择是否编译生成如上库。一般而言,要实现最基本的音视频编解码功能,libavformatlibavcodeclibavutil这三个库是不可缺少的。我们通过使能或失能ffmpeg支持的组件,如编解码器、分流器、合流器、解析器、协议类型等,来裁剪库文件的大小。

1.2名词解释
  • encoder // 编码器
  • decoder // 解码器
  • hwaccel // 硬件加速器
  • muxer // 合流器
  • demuxer // 分流器
  • parser // 解析器
  • bsf // 比特过滤器
  • protocol // 协议
  • indev // 输入设备
  • outdev // 输出设备
  • filter // 过滤器

2.编译

ffmpeg 编译帮助

./configure --help

主要包含一下选项

  • 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
    组件选项,常用使能或者关闭某些模块的编译,libavformatlibavcodeclibavutil这三个库一般是不可或缺的,还有其他的组件按自己需要使能;
  • 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文件夹生成对应的文件

#配置
./configure --prefix=$(pwd)/output --arch=arm --target-os=linux --enable-cross-compile --disable-asm --cross-prefix=arm-linux-gnueabihf- --enable-shared
#编译
make
#安装
make install

编译后的文件夹下有bin include lib share 目录bin存放交叉编译后的ffmpeg等工具bin文件,include目录存放头文件,移植需要 lib存放动态和静态库,将lib里面的文件拷贝到板端或者静态库使用即可;
编译后未经裁剪的ffmpeg库实在太大,十几M的大小,需要裁剪;

2.2裁剪库

ffmpeg 库过大,很多功能其实没必要使用的,
裁剪为仅支持mp4 和 avi两种格式的视频,avi:视频采用h264编码,音频采用pcm_alaw mp4:视频h264,音频aac格式;这个指令其实还可以进一步裁剪,不想麻烦,够用就行,不再裁剪@_@;

#配置
./configure --prefix=$(pwd)/output --arch=arm --target-os=linux --enable-cross-compile --disable-asm --cross-prefix=arm-linux-gnueabihf- \
--disable-gpl --enable-nonfree --enable-error-resilience \--disable-debug --enable-shared --enable-small \
--disable-ffmpeg --disable-ffprobe --disable-ffplay --disable-programs --disable-symver\--disable-doc --disable-htmlpages --disable-manpages --disable-podpages \--disable-txtpages --enable-avformat --enable-avcodec  --enable-swresample \--disable-avresample --disable-avfilter --disable-avdevice --disable-postproc \--disable-swscale --disable-everything --enable-decoder=h264 --enable-decoder=hevc \--enable-decoder=pcm_alaw --enable-decoder=aac  --enable-demuxer=aac \--enable-demuxer=pcm_alaw --enable-demuxer=h264 --enable-demuxer=hevc \--enable-demuxer=m4v --enable-demuxer=avi --enable-demuxer=mov --enable-muxer=m4v \--enable-muxer=aac --enable-muxer=h264 --enable-muxer=hevc --enable-muxer=pcm_alaw \--enable-muxer=avi --enable-muxer=mov --enable-muxer=mp4  --enable-parser=h264 \--enable-parser=aac   --enable-parser=hevc --enable-protocol=file --disable-iconv \--disable-v4l2-m2m --disable-indevs --disable-outdevs
#编译
make
#安装
make install

裁剪后的文件大小最大也只剩1.1M,大小减少10倍;


3.ffmpeg移植问题

3.1时间冲突问题

libavutils/time.h文件名字和linux系统的time.h的名字冲突,在编译的时候会出现time.h文件是有两个,无法区分是哪个time.h,因此会出现报错,如果在ffmepg里将time.h文件重命名可以解决这个问题,但这样太麻烦而且容易出错,采用另外一种方式,将makefile的搜索路径更改为只搜索到include文件夹,然后在include文件夹下放置相关的头文件,而在调用的c文件上路径改为

#include "libavformat/avformat.h"
#include "libavformat/avio.h"
#include "libavformat/movenc.h"

这样就躲开了搜索文件名字一样的问题,其本质是将ffmpeg的time.h重新命名为libavutils/time.h

3.2函数符号导出问题

由于移植需要单独导出库内部的局部函数,如mov_write_packet mov_write_header mov_write_trailer等函数,将movenc.c对应函数的static去掉,同时在libavformat.h文件声明函数,但是生成的库会发现没有找到对应的函数符号

nm -D libavformat.so | grep mov*  #查找库内部函数符号

avi相关的函数也做同样的处理,但是avi有这个函数符号,这个问题只能反推编译过程查找哪里将函数符号屏蔽掉了采用指令

make -n #打印make执行的命令

发现在生成库的时候会调用一个脚本文件,这个脚本文件最后在config.mak里面指定了

SHFLAGS=-shared -Wl,-soname,$$(@F) -Wl,-Bsymbolic -Wl,--version-script,$(SUBDIR)lib$(NAME).ver

--version-script 这个选项仅仅导出要使用的符号表,这个文件对应libavformat里面的就是libavformat.v libavformat.ver libavformat.version,后两个文件都是根据第一个文件产生的,查看libavformat.v文件

LIBAVFORMAT_MAJOR {global:av*;local:*;
};

显然,在这里屏蔽掉了非av开头的全部函数,所有mov开头的函数无法被外部调用,因此更改这个文件,将mov开头的函数也导出;

LIBAVFORMAT_MAJOR {global:av*;mov*;    #增加mov开头的函数local:*;
};

重新编译发现可以调用mov开头的函数了。

不足之处,敬请指出,谢谢^_^


4.参考资料

CSDN 博客
SigmaStarDocs
《ffmpeg基础库编程开发》


FFMPEG编译裁剪移植相关推荐

  1. ffmpeg编译裁剪移植到arm-linux

    源码裁剪参考: ffmpeg源码裁剪移植到arm-linux ffmpeg可以通过配置不同的编译选项来裁剪ffmpeg本身的大小,下面我基于2.1.3版本来说明. 至于支持哪些编译选项,可输入 ./c ...

  2. linux内核的裁剪和移植实验,实验5 linux内核的裁剪移植.doc

    实验5 linux内核的裁剪移植 一.实验目的: 学习利用menuconfig配置文件进行裁减内核,编译内核并移植到开发板上. 二.实验内容 一.开发环境 宿主机:ubuntu10.04 开发板:ti ...

  3. FFMPEG编译及遇到的问题

    1.执行 ./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-static 其中 --prefix=/usr/local/f ...

  4. ffmpeg编译安装

    ffmpeg编译安装 前言 一.下载ffmpeg 二.编译安装 2.1 Linux编译ffmpeg 2.2 Windows编译ffmpeg 总结 前言   Fmpeg是一套可以用来记录.转换数字音频. ...

  5. 在Ubuntu下FFmpeg编译,支持x264和x265(HECV)

    所有下载的源 在Ubuntu下FFmpeg编译,支持x264和x265. Ubuntu 12.04 FFmpeg 2.1 Release 注意: cmake要升级要2.8.8 yasm要升级到1.2. ...

  6. win7下ffmpeg编译动态链接库整理

    1.写在ffmpeg编译前 关于ffmpeg的编译过程google一搜,一大堆,ffmpeg编译真的有那么难么?在我编译成功后回头来看,网上的资料过多,反而使自己走了很多的弯路.即便有些楼主亲自测试后 ...

  7. ffmpeg编译(生成Windows或Win32平台dll, lib)

    ffmpeg编译(生成Windows或Win32平台dll, lib) 介绍:本文简要介绍通过cygwin环境来编译生成ffmpeg. 包括解码组件libfaad与libopencore-amrnb的 ...

  8. ffmpeg编译android,FFMPEG Android(2) 编译编译静态ffmpeg可执行文件

    基础编译,请参考上一篇文章: http://blog.csdn.net/muwesky/article/details/55259945 如果想编译静态ffmpeg可执行文件,编译脚本如下: #!/b ...

  9. 6001. mavlink 编译与移植

    mavlink 编译与移植 1 源码下载 git clone https://github.com/mavlink/mavlink.git --recursive 2 源码配置编译 2.1 配置生成c ...

最新文章

  1. 测试MM32F3277中的MicroPython的Signal功能
  2. LNMP 出现 No input file specified. 的解决方法
  3. msp430入门编程11
  4. opencv 星空_opencv如何将大于5000像素点的轮廓绘制出来?
  5. “轻量级的”Istio,微软开源了一个基于 Envoy 的服务网格
  6. 计算机制作ppt教程,电脑制作ppt详细步骤_新手制作ppt详细步骤图文教程
  7. 超详细|开关电源电路图及原理讲解
  8. 惠普服务器查看主板型号,win10惠普主板型号查看图文教程。
  9. 当实现两个Activity之间的跳转时,发生 XXX has stoped 或者 XXX keeps stopping
  10. [POI2008]KUP
  11. css实现多行文本时显示省略号
  12. 如何实现vue中的列表动画,如何封装vue动画
  13. 使用Oracle sql_trace 工具
  14. 企业高管跳槽区块链,跳的是“坑”还是“槽”?
  15. 苹果注定要输给欧盟,USB-C成为标准接口已是大势所趋
  16. 程序员的四境界、七宗罪与七武器 [转载]
  17. 安科瑞智能操控无线测温装置在江苏某化工产业园项目的应用
  18. 计算机网络被称为什么时候,计算机上的时钟发生装置被称为什么?
  19. shell-脚本集合
  20. MySQL 索引最左匹配原则

热门文章

  1. Geek Talk 038:Duolingo 的发迹史
  2. 清华计算机系最低分,清华大学最低录取分数线是多少?
  3. 鸿蒙2.0内测版手机版,抖音鸿蒙os2.0测试首发体验版下载-抖音华为鸿蒙os2.0最新内测版v12.7.0 最新版-007游戏网...
  4. python获取本月天数_如何获得本月的所有天数?
  5. 解决The code generator has deoptimised the styling of xxxx.js as it exceeds the max of 500kb
  6. web前端-JavaScript(3)
  7. 用Matlab生成扫频Cosine信号
  8. 大坝水库安全监测系统-护航水库安全
  9. 【ORB_SLAM3运行KITTI数据集报错的解决办法】
  10. 在线存储、近线存储、离线存储、数据迁移