Ffmpeg编码实战!

一. 读取YUV文件并编码成H264的DEMO介绍:

本次的DEMO是通过读取YUV文件,并利用FFMPEG编码成H264格式并输出到文件上面,保存的格式是·xxxx.h264的文件。

二. 代码模块的讲解:

要注意:这里的讲解忽略了文件创建部分,只讲重点的读取YUV数据和编码过程。

2.1. 初始化AVFrame并进行赋值

图片

AVFrame是指未压缩前的音视频原始数据,首先要av_frame_alloc对AVframe进行初始化分配工作。分配完AVFrame之后,对每一个成员变量进行赋值。首先,先用av_image_fill_arrays(av_image_fill_arrays的主要功能是根据图像参数初始化avframe的数据指针)对avframe的data成员变量进行赋值,另外还要对AVFrame的**width、height、图像格式(format)**等进行赋值。

2.2. 初始化编码器

图片

上面的代码主要是初始化编码器的工作,这里要用到两个结构体成员。一个是AVCodec(编码器)、AVCodecContext(编码器上下文),AVCodec需要用av_codec_find_encoder找到对应的编码器,并使用这个编码器(AVCodec)去创建编码器上下文(AVCodecContext),使用的API是avcodec_alloc_context3

创建完AVCodecContext上下文之后,对其成员变量进行赋值。这些成员变量包括:bit_rate(码率)、width(长度)、height(高度)、time_base(时间基)、framerate(帧率)、gop_size(GOP关键帧间隔)、max_b_frames(B帧的数量)、pix_fmt(原始数据格式)。设置完之后,使用avcodec_open2把编码器上下文和编码器相互关联起来。

2.3. 读取每一帧YUV原始数据

图片

使用fread去读取每一帧YUV数据,对于YUV视频原始数据每一帧的大小是:width * height * 3 /2。读取每一帧数据后,就要把读到的数据向avframe的data进行赋值,avrame的data的数据拷贝需要向Y,U,V三个变量分别赋值。frame_in->data[0]指的是Y变量frame_in->data[1]指的是U变量frame_in->data[2]指的是V变量。还有一点注意的是,对于AVFrame还需要对pts进行叠加,否则画面质量将会非常模糊。

2.4. 将每一帧原始数据进行H264编码并保存

图片

使用avcodec_encode_video2的API对每一帧AVFrame进行H264编码压缩,并把对应的H264数据存储到文件里面。

三.整体代码显示:

图片
图片
图片

四.演示效果:

图片

上图这个是编码出来的H264的文件,并用ffplay播放出来

作者:陈工,公众号:txp玩Linux。如果对嵌入式音频开发感兴趣的朋友,可以加入星球来学习,教程都是视频讲解。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论