ffmpeg常用库、术语、API、数据结构总结

简介: ffmpeg常用库、术语、API、数据结构总结

一、常用音视频术语和概念

  • 容器/文件(Conainer/File):指特定格式的多媒体文件,比如mp4、flv、mov等视频格式;
  • 媒体流(Stream):一个容器(如mp4文件)中可存在多个流,可以是视频流音频流字幕流
  • 数据帧/数据包(Frame/Packet):一个流媒体是由大量的数据帧构成的。
  • 编码器/解码器:编解码器是以帧为单位进行压缩数据和复原数据的,对原始数据和压缩的数据进行转换。

例如:通过如下命令可以查看一个视频文件的信息:

zhenghui@zh-pc:~/视频$ ffprobe 1080P.mp4 
ffprobe version N-104612-g3188b606d7 Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
  configuration: --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-filter=delogo --enable-debug --disable-optimizations --enable-libspeex --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --cc=gcc --host-cflags= --host-ldflags= --disable-x86asm
  libavutil      57.  9.100 / 57.  9.100
  libavcodec     59. 13.100 / 59. 13.100
  libavformat    59.  9.101 / 59.  9.101
  libavdevice    59.  0.101 / 59.  0.101
  libavfilter     8. 17.100 /  8. 17.100
  libswscale      6.  1.100 /  6.  1.100
  libswresample   4.  0.100 /  4.  0.100
  libpostproc    56.  0.100 / 56.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1080P.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
    description     : Packed by Bilibili XCoder v2.0.2
  Duration: 00:03:46.53, start: 0.000000, bitrate: 3087 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2951 kb/s, 30 fps, 30 tbr, 16k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
zhenghui@zh-pc:~/视频$

可以看到这个视频中有两路流

  • Stream #0:00x1: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2951 kb/s, 30 fps, 30 tbr, 16k tbn (default)
  • Stream #0:10x2: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)

一路是视频流Video: h264,一路是音频流Audio: aac。

二、常用概念

音视频领域-复用器和解复用器

  • 复用器:把多路原始流按一定的规则组成成一个新的音视频文件(例如:把一个纯视频流、一个纯音频流和一个纯字幕流组合成一个mp4文件);
  • 解复用器:把一个新的音视频文件按一定的规则拆分成多路原始流(例如:把一个mp4文件,拆分成纯视频流、纯音频流和纯字幕流)。

三、FFmpeg库简介

ffmpeg常用的库:

  • libavutil

核心工具库,例如log模块。在ffmpeg中很多功能模块都会依赖avutil库作一些基本的音视频操作。

  • libavformat*重要

文件格式和协议库,该模块是最重要的模块之一,封装了Protocol层和Demuxer、Muxer层。

  • libavcodec*重要

编解码库,封装了一些基本的Codec层。但是一些Codec是具备自己的License的,所以ffmpeg是没有默认把这类的库添加进来的,例如:libx264,FDK-AAC等库。ffmpeg就像一个平台一样,可以将第三方的Codec以插件的方式添加进来,然后为开发者提供统一的接口,进行使用。

  • libswresample*重要

该模块用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息进行转换。例如:把一段音频的声道由双声道转换成单声道的数据,就可以通过该库进行操作。

  • libswscale*重要

该模块提供了将图像进行格式信息转换的模块。例如:可以将YUV数据转换成RGB数据,可以将1280720的尺寸的数据缩放尺寸至800480的数据。

  • libavfilter

音视频滤镜库,该库提供了音频和视频特效的处理功能。

  • libavdevice

输入输出设备库。编译时需要先编译SDL,因为此库是以来SDL的,该设备模块库播放声音与播放视频使用的都是SDL库。

  • libpostproc

该年模块用于后期处理,与libavfilter库配合使用。

四、ffmpeg常用函数简介

(一)关于初始化和注册相关的函数

  • av_register_all():注册所有的组建,4.0及以上版本已经弃用了;
  • avdevice_register_all():对设备进行注册,如果我们要捕捉屏幕进行录制屏幕,捕捉摄像头进行录制视频,捕捉麦克风录制麦克风声音时,就需要使用到该函数,首先进行注册。例如(windows下的dshow,Linux下的V4L2等);
  • avformat_network_init():初始化网络库以及网络加密协议相关的库,我们在推流或者拉流时就会使用到。

(二)封装格式相关函数

  • avformat_alloc_context():负责申请一个AVFormatContext上下文结构体的内存,并进行简单的初始化,以提供给其他函数使用;
  • avformat_free_context():释放不使用的AVFormatContext;
  • avformat_close_input():关闭解复用器。如果使用该函数进行关闭的话,就可以不使用avformat_free_context()进行释放;
  • avformat_open_input():打开输入视频文件;
  • avformat_find_stream_info():获取视频文件信息;
  • av_read_frame():读取音视频包;
  • avformat_seek_file():根据时间戳定位文件的位置;例如我们托方播放器的进度条进行快近和快退时,就可以使用此函数进行定位播放;
  • av_seek_frame():根据流的大小定位文件的位置;

封装格式步骤:

1、分配解复用器上下文(avformat_alloc_context());

2、根据url打开本地文件或网络流(avformat_open_input());

3、读取媒体的数据包,查找流信息(avformat_find_stream_info());

4、遍历数据

(4-1)、从文件中读取数据包(av_read_frame());

(4-2)、或者 定位文件位置进行遍历(avformat_seek_file()、av_seek_frame());

5、关闭解复用器(avformat_close_input())或释放不使用的资源;

(三)解码相关函数

  • avcodec_alloc_context3();分配解码器上下文;
  • avcodec_find_decoder();根据ID查找解码器;
  • avcodec_find_decoder_by_name();根据解码器名字查找解码器;
  • avcodec_open2();打开编解码器;
  • avcodec_send_packet();发送编码数据包;
  • avcodec_receive_frame();接受解码后的数据;
  • avcodec_free_context();释放解码器上下文,此函数包含了avcodec_close();
  • avcodec_close();关闭解码器;

五、ffmpeg常用数据结构简介

  • AVFormatContext; 封装格式上喜爱文结构体,统领全局的结构体,保存了视频文件封装格式等相关信息;
  • AVInputFormat; 输入的format;封装格式(例如:FLV、MP4),每个封装格式都对应一个该结构体;
  • AVOutputFormat;输出的format,例如:输出到网络流,输出到文件等;
  • AVStream;一个视频容器(即文件)中存在多路流数据,每路流都对应一个该结构体,例如:视频流、音频流、字幕流等;
  • AVCodecContext; 编解码器上下文结构体,保存了音视频编解码相关的信息;
  • AVCodec; 每一种音视频编解码器(例如:H.264解码器)都对应一个该结构体;
  • AVPacket;存储一帧压缩编码数据;
  • AVFrame; 存储一帧解码后的数据(可以是视频解码后的像素数据,也可以是音频采样后的数据);

还得跟着0声Darren哥学着走阿!

目录
相关文章
|
6月前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
223 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
6月前
|
存储 编解码 网络协议
FFmepg 核心开发库及重要数据结构与API
FFmepg 核心开发库及重要数据结构与API
59 0
|
6月前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
332 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
16天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
62 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
26天前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。
|
2月前
|
JSON 资源调度 JavaScript
Vue框架中Ajax请求的实现方式:使用axios库或fetch API
选择 `axios`还是 `fetch`取决于项目需求和个人偏好。`axios`提供了更丰富的API和更灵活的错误处理方式,适用于需要复杂请求配置的场景。而 `fetch`作为现代浏览器的原生API,使用起来更为简洁,但在旧浏览器兼容性和某些高级特性上可能略显不足。无论选择哪种方式,它们都能有效地在Vue应用中实现Ajax请求的功能。
34 4
|
3月前
|
API 数据库 索引
indexedDB 操作库IDBWRAPPER 教程翻译及API翻译第二部分part2
indexedDB 操作库IDBWRAPPER 教程翻译及API翻译第二部分part2
|
3月前
|
JSON API 网络架构
【Azure Developer】Azure REST API: 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk
【Azure Developer】Azure REST API: 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk
|
4月前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
|
4月前
|
自然语言处理 PyTorch API
`transformers`库是Hugging Face提供的一个开源库,它包含了大量的预训练模型和方便的API,用于自然语言处理(NLP)任务。在文本生成任务中,`transformers`库提供了许多预训练的生成模型,如GPT系列、T5、BART等。这些模型可以通过`pipeline()`函数方便地加载和使用,而`generate()`函数则是用于生成文本的核心函数。
`transformers`库是Hugging Face提供的一个开源库,它包含了大量的预训练模型和方便的API,用于自然语言处理(NLP)任务。在文本生成任务中,`transformers`库提供了许多预训练的生成模型,如GPT系列、T5、BART等。这些模型可以通过`pipeline()`函数方便地加载和使用,而`generate()`函数则是用于生成文本的核心函数。