一. YUV文件转H264编码示例说明:
这个示例将向您展示如何利用FFmpeg库,将YUV文件转换为H264格式,并将结果保存到.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播放出来
Ffmpeg开发环境可以参考之前的文章:
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !