首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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播放出来

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230228A047F300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券