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

原文 ffmpeg编解码_Kkuri1104的博客-CSDN博客

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/134785018