良许Linux教程网 干货合集 Ffmpeg编码实战!

Ffmpeg编码实战!

一. YUV文件转H264编码示例说明:

这个示例将向您展示如何利用FFmpeg库,将YUV文件转换为H264格式,并将结果保存到.h264文件中。

二. 代码模块详解:

需要留意的是:在这里我们将忽略文件创建的部分,只关注于YUV数据的读取和编码过程。

2.1. 初始化AVFrame并赋值

image-20240425220359098
image-20240425220359098

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

2.2. 初始化编码器

image-20240425220449259
image-20240425220449259

上面的代码主要是初始化编码器的工作,这里要用到两个结构体成员。一个是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原始数据

image-20240425220453074
image-20240425220453074

使用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编码并保存

image-20240425220455956
image-20240425220455956

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

三.整体代码显示:

image-20240425220504300
image-20240425220504300
image-20240425220511407
image-20240425220511407
image-20240425220515630
image-20240425220515630

四.演示效果:

image-20240425220519431
image-20240425220519431

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

Ffmpeg开发环境可以参考之前的文章:

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部