美文网首页音频专题
FFmpeg笔记(一)-- 简介

FFmpeg笔记(一)-- 简介

作者: rookiesss | 来源:发表于2020-04-16 17:44 被阅读0次

    简介

    FFmpeg是一套可以用来记录、处理数字 音频、视频,并将其转换为流的开源框架,采用LPL或GPL许可证,提供了录制、转换以及流化音视频的完整解决方案。它的可移植性或者说跨平台特性非常强大,可以用在Linux服务器、PC(包括Windows、 Mac OS X等)、移动端设备(Android、iOS等移动设备)等平台。名称中的mpeg来自视频编码标准MPEG,而前缀FF是Fast Forward的首字母缩写。

    安装

    FFmpeg

    pod安装(github上的版本比较老,需要最新版本手动去官网下载吧):

    pod 'FFmpeg'
    

    手动安装要执行脚本,比较繁琐,自行查找吧,比如 这个,亲测可行。需要注意的是无论手动安装还是pod安装都需要添加关联的系统库(各个版本导入的库可能不一样):
    libz.tbd
    libbz2.tbd
    libiconv.tbd
    AudioToolbox.framework
    CoreMedia.framework
    VideoToolbox.framework
    AVFoundation.framework

    x264

    资源包
    执行脚本
    将【build-x264.sh】脚本文件放到和资源包同一级目录下,并将资源包名称改为【x264】(这里是为了和脚本内容匹配,具体可以打开脚本文件看【SOURCE】字段的赋值)。
    如果报错【No working C compiler found.】执行以下代码:

    //如果是i386报这个错直接打开脚本删掉【ARCHS="arm64 x86_64 i386 armv7 armv7s"】中的i386
    sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
    

    执行完后的【x264-iOS】就是最终的iOS库。

    结构

    FFmpeg结构图.png

    FFmpeg分为3个命令行工具(笔记二有详细介绍),8个静态库如下:

    libavutil:核心工具库,该模块是最基础的模块之一,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。

    common.h,ffplay 使用的工具类数据类型定义,宏定义和两个简单的内联函数.
    bswap.h,short 和 int 整数类型字节顺序交换,通常和 CPU 大端或小端有关。
    rational.h,用两整数精确表示分数。常规的可以用一个 float 或 double 型数来表示分数,但不是精确表示,在需要相对比较 精确计算的时候,为避免非精确表示带来的计算误差,采用两整数来精确表示。
    mathematics.h,数学上的缩放运算。为避免计算误差,缩放因子用两整数表示做精确的整数运算。为防止计算溢出,强制转换为 int 64 位整数后计算。
    avutil.h,ffplay 基础工具库使用的一些常数和宏的定义。

    libavformat:文件格式和协议库,该模块是最重要的模块之一,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。

    avformat.h,定义识别文件格式和媒体类型库使用的宏、数据结构和函数,通常这些宏、数据结构和函数在此模块内相对全局有效。
    allformats.c,简单的注册/初始化函数,把相应的协议,文件格式,解码器等用相应的链表串起来便于查找。
    cutils.c,ffplay 文件格式分析模块使用的两个工具类函数,都是对字符串的操作。
    file.c,ffplay 把 file 当做类似于 rtsp,rtp,tcp 等协议的一种协议,用 file:前缀标示 file 协议。 URLContext 结构抽象 统一表示这些广义上的协议,对外提供统一的抽象接口。 各具体的广义协议实现文件实现 URLContext 接口。此 文件实现了 file 广义协议的 URLContext 接口。
    avio.h,文件读写模块定义的数据结构和函数声明,ffplay 把这些全部放到这个.h 文件中。
    avio.c,此文件实现了 URLProtocol 抽象层广义文件操作函数,由于 URLProtocol 是底层其他具体文件 (file,pipe 等) 的简单封装,这一层只是一个中转站,大部分函数都是简单中转到底层的具体实现函数。
    aviobuf.c,有缓存的广义文件 ByteIOContext 相关的文件操作,比如 open,read,close,seek 等等。
    utils_format.c,识别文件格式和媒体格式部分使用的一些工具类函数。
    avidec.c,AVI 文件解析的相关函数。
    注意 1:AVI 文件容器媒体数据有两种存放方式,非交织存放和交织存放。交织存放就是音视频数据以帧为最 小 连续单位,相互间隔存放,这样音视频帧互相交织在一起,并且存放的间隔没有特别规定;非交织存放就是把 单 一媒体的所有数据帧连续存放在一起,非交织存放的 avi 文件很少。
    注意 2:AVI 文件索引结构 AVIINDEXENTRY 中的 dwChunkOffset 字段指示的偏移有的是相对文件开始字节的 偏 移,有的事相对文件数据块 chunk 的偏移。
    注意 3:附带的 avi 测试文件是交织存放的。

    libavcodec:编解码库,该模块也是最重要的模块之一,封装了 Codec层,但是有一些Codec是具备自己的License的,FFmpeg是不会默认添加像libx264、FDK-AAC、lame等库的,但是FFmpeg就像一个平台一样,可以将其他的第三方的Codec以插件的方式添加进来,然后为开发者提供统一的接口。

    avcodec.h,定义编解码器库使用的宏、数据结构和函数,通常这些宏、数据结构和函数在此模块内相对全局有效。
    allcodecs.c,简单的注册/初始化函数,把编解码器用相应的链表串起来便于查找识别。
    dsputil.h,定义 dsp 优化限幅运算使用的查找表及其初始化函数。
    dsputil.c,定义 dsp 优化限幅运算使用的查找表,实现其初始化函数。
    imgconvert_template.h,定义并实现图像颜色空间转换使用的函数和宏。
    imgconvert.c,定义并实现图像颜色空间转换使用的函数和宏。
    msrle.c,此文件实现微软行程长度压缩算法解码器。
    turespeech_data.h,定义 true speed 音频解码器使用的常数。
    turespeech.c,实现 true speed 音频解码器。
    utils_codec.c,编解码库使用的帮助和工具函数。

    libavfilter:音视频滤镜库,该模块提供了包括音频特效和视频特效 的处理,在使用FFmpeg的API进行编解码的过程中,直接使用该模块为 音视频数据做特效处理是非常方便同时也非常高效的一种方式。
    libavdevice:输入输出设备库,比如,需要编译出播放声音或者视频的工具ffplay,就需要确保该模块是打开的,同时也需要libSDL的预先编译,因为该设备模块播放声音与播放视频使用的都是libSDL库。
    libswresample:该模块可用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换。
    libswscale:该模块是将图像进行格式转换的模块,比如,可以将 YUV的数据转换为RGB的数据。
    libpostproc:该模块可用于进行后期处理,当我们使用AVFilter的时 候需要打开该模块的开关,因为Filter中会使用到该模块的一些基础函数。

    相关文章

      网友评论

        本文标题:FFmpeg笔记(一)-- 简介

        本文链接:https://www.haomeiwen.com/subject/omddvhtx.html