目录
🚗本文主要是基于FFMPEG技术解码部分,继续延申,对FFMPEG编码部分进行详细介绍
🚗希望对在学习FFMPEG技术的小伙伴们有所帮助!
一、FFMPEG 编码
1.1编码流程
🔴编码:像素数据➡编码后➡压缩码流数据。
例如:将YUV的像素数据➡编码后➡得到H.264的压缩码流数据。
编码的流程图,如下所示:
编码与解码同理,在使用FFMPEG编码视频文件之前,要确定完成 注册所有组件 这一步骤
其中,包含了相关结构体,本文不做过多阐述,详细可于文末链接,查看解码部分内容。
🔴编码思路分析:
- 注册所有的组件
- 根据需要的码流数据的格式,来猜测的需要的编码器
- 打开目标文件流
- 新建视频流
- 设置编码器上下结构的一系列参数,为编码做好准备
- 查找对应的编码器
- 打开编码器
- 读取普通视频数据 or 摄像头数据,进行解码,保证得到的是YUV的像素数据
- 先写入编码的头部信息
- 正式开始,进行编码,将一帧像素数据压缩成码流数据
- 保存写入文件中
- 得到最终的编码后的码流数据
下面,博主举例说明,对解码后的视频文件来进行编码,究竟是怎么样的操作呢?
1.2编码示例
🟢解码类的定义:
class fecodec
{
public:
fecodec();
//注册组件
void registerFFmpeg();
//编码器 参数初始化
void condeInit(char *flie_out);
//编码
void codecFrame(AVFrame *frame);
//写入尾巴帧
void writeEndFrame();
private:
AVFormatContext *formatContent;//用来保存视频相关信息的结构体
AVCodecContext *codecContent;//用来保存编解码信息的上下文结构体
AVPacket *pkt;//码流包
int pkt_inpex;//每一帧像素序号
int flag;
};
具体实现如下:
🟢注册所有组件
void fdecodec::registerFFmpeg()
{
//注册所有的组件
av_register_all();
}
🟢猜测输出格式