ffmpeg编解码过程
前言
提示:以下是个人记录使用,内容仅供参考
一、简介
ffmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
不同的视频文件后缀代表不同的封装格式。
封装格式:把视频码流和音频码流包成一个文件的规范,按一定格式储存在一个文件里。
码流:使用压缩算法压缩后的视频或者音频流数据。
像素数据 编码压缩后 成为 码流
像素数据:可以直接显示在显示器上的数据。
码流(例如.h264) 解码后 成为 像素数据(例如yuv)
编码作用:将视频像素数据压缩成码流,降低数据量。
压缩编码的常见格式是 yuv。
为什么不是rgb呢?
因为yuv将亮度信息和色度信息分离,并对色度信息采用更狠的压缩方案(人眼对亮度较为敏感),从而提升压缩效率。相较之下数据量比较小。
从数据占比来说,uv的信息数据量是y的1/2。
二、如何显示画面?
已经封装好的数据,例如(.mp4文件)经过解封装。分离为视频压缩数据码流和音频压缩数据码流。
视频码流(h.264)与音频码流将分别解码。
视频解码后得到像素数据(yuv等)。
音频解码后得到音频数据(acc/mp3等)。
接着yuv像素数据将转化为rgb。(计算机显示器只能显示RGB 3原色,所以要将YUV转换成RGB,显卡才能显示)
acc音频数据和rgb数据同步播放便显示出了视频。
三、ffmpeg数据结构与函数
1、重要结构体
AVFrame 结构体一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM)
此外还包含了一些相关的信息。比如说,解码的时候存储了宏块类型表,QP表,运动矢量表等数据。编码的时候也存储了相关的数据。
AVCodec 是存储编解码器信息的结构体
AVFormatContext 是一个贯穿始终的数据结构,保存了视频文件封装格式相关信息,很多函数都要用到它作为参数。它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。
AVIOContext 是FFMPEG管理输入输出数据的结构体
AVStream[2] 是存储每一个视频/音频流信息的结构体
AVCodecContext 编码器上下文结构体,每个AVStream对应一个AVCodeContext,存储对应流的编解码信息
AVPacket 是存储一帧 压缩编码数据相关信息的结构体
AVInputFormat 每种封装格式(FLV、MKV、MP4、AVI)对应一个结构体
2、重要函数
av_register_all():注册所有组件。
avformat_open_input():打开输入视频文件。
avformat_find_stream_info():获取视频文件信息。
avcodec_find_decoder():查找解码器。
av_read_frame():从输入文件读取一帧压缩数据。
avcodec_decode_video2():解码一帧压缩数据。
avcodec_close():关闭解码器。
avformat_close_input():关闭输入视频文件。
四、视频解码过程
1、注册组件。
2、打开视频码流,相关结构体——AVFormatContext。
3、寻找流媒体数据。
4、得到视频流。
5、寻找解码器,相关结构体——AVCodecontext。
6、打开解码器。
7、一帧一帧读取码流。
8、判断一帧数据能否读取成功,相关结构体——AVPacket。
9、将AVPacket解码为像素数据,相关结构体——AVFrame。
10、显示到屏幕上。
11、结束。
五、视频编码过程
1、注册组件。
2、拍摄,猜测码流数据对应的编码器。(类似于查找编码器)
3、打开编码器。
4、写入头部信息。
5、读取像素数据read_frame。
6、判断是否读入数据。
7、编码、打包,将数据存入AVPacket结构体。
8、结束。
总结
对ffmpeg一些基本使用做了一些总结,还有转码部分的内容没有加上。
参考
[1]、https://blog.csdn.net/qq_32430349/article/details/49800957