本文介绍: 本文介绍 FFmpeg 骨架:“八大金刚” 核心开发库,重要数据结构与 API上图后者是前者的数据成员,Format Layer 除了 AVInputFormat 外还有一个 AVOutputFormatAVFormatContext 是一个贯穿始终的数据结构,很多函数都用到它作为参数,是输入输出相关信息的一个容器。解协议URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol 存储输入视音频使用的封装格式。每种协议都对应一个 URLProtocol 结构。
前言
本文介绍 FFmpeg 骨架:“八大金刚” 核心开发库,重要数据结构与 API
一、FFmpeg 核心开发库
- libavformat(重要)
- libavcodec(重要)
- libavutil
- libswscale(重要)
- libpostproc
- libavdevice
- libswresmaple(重要)
- libavfilter
二、FFmpeg 重要数据结构与 API
1、简介
FFmpeg 中结构体很多,其中下图所涉及的结构体需要熟记:
上图后者是前者的数据成员,Format Layer 除了 AVInputFormat 外还有一个 AVOutputFormat
AVFormatContext 是一个贯穿始终的数据结构,很多函数都用到它作为参数,是输入输出相关信息的一个容器。
最关键的结构体可以分为以下几类:
- 解协议(http,rtsp,rtmp,mms,hls,file,tcp,udp,…)
- 解封装(flv,avi,rmvb,mp4)
- 解码
AVStream
是继AVFormatContext
之后第二个贯穿始终的数据结构,它保存于数据流相关的编解码器、数据段等信息,还包含“流” 这个概念中的一些信息;- 每个
AVStream
存储一个视频/音频流的相关数据; - 每个
AVStream
对应一个AVCodecContext
,存储该视频/音频流使用解码方式的相关数据; - 每个
AVCodecContext
中对应一个AVCodec
,包含该视频/音频对应的解码器; - 每种解码器都对应一个
AVCodec
结构。AVCodec
记录了所要使用的 Codec 的信息并有 5 个函数: init, encoder, close, decode, flush 来完成编解码工作。
- 存数据
2、FFmpeg 解码流程
①、FFmpeg2.x 解码流程
av_register_all();
//注册所有文件格式和编解码库avformat_network_init();
//打开网络视频流av_open_input_file();
//读取文件头部把信息保存到 AVFormatContext 结构体av_find_stream_info();
//为 pFormatCtx->streams 填充上正确的信息CODEC_TYPE_VIDEO;
//通过判断得到视频流类型avcodec_find_decoder();
//查找解码器avcodec_open();
//打开编解码器avcodec_alloc_frame();
//分配空间保存帧数据av_read_frame();
//不断从流中提取帧数据avcodec_decode_video();
//解码视频流avcodec_close();
//关闭解码器avformat_close_input_file();
//关闭输入文件
②、FFmpeg4.x 解码流程
3、FFMpeg 中比较重要的函数以及数据结构
①、数据结构
- AVFormatContext
- AVOutputFormat
- AVInputFormat
- AVCodecContext
- AVCodec
- AVFrame
- AVPacket
- AVPicture
- AVStream
②、初始化函数
- av_register_all()
- avcodec_open()
- avcodec_close()
- av_open_input_file()
- av_find_input_format()
- av_find_stream_info()
- av_close_input_file()
③、音视频解码函数
- avcodec_find_decoder()
- avcodec_alloc_frame()
- avpicture_get_size()
- avpicture_fill()
- img_convert()
- avcodec_alloc_context()
- avcodec_decode_video()
- av_free_packet()
- av_free()
④、文件操作
⑤、其他函数
三、FFmpeg 流程
1、FFmpeg 主要框架
2、文件处理基本流程(转码流程)
- demuxer:解复用;即将音视频分离出来,上图中的视频流是 AVC(H264)格式,音频流是 AAC 格式;
- decoder:解码器;
- filter: 帧处理,这里将原始 19201080 转换为 1280720;
- encoder:编码器,这里是 H265 的视频格式;
- muxer:复用,将音频和视频进行重新封装。
解码流程图
①、解复用(Demux)
视频文件的音频和视频都是分开进行压缩的,因为音频和视频的压缩算法不一样,所以解码也不一样,所以需要对音频和视频分别进行解码。虽然音频和视频是分别进行压缩的,但是为了传输过程的方便,降压所过的音频和视频捆绑在一起进行传输。所以解复用这一步就是将文件中捆绑的音频流和视频流分开来以方便后面分别对它们进行解码。
②、解码(Decode)
一个音视频文件肯定是经过某种格式压缩的(h264、h265 等),也就是通常所说的音视频编码,编码是为了减少数据量,否则的话对于音视频数据的存储和网络传输将是很难完成的,所以我们必须对音视频文件进行尽可能的压缩。
原文地址:https://blog.csdn.net/qq_41839588/article/details/134621329
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_20938.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。