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开发环境可以参考之前的文章:
相关文章
- R语言PCA主成分、lasso、岭回归降维分析全球气候变化对各国土地面积影响
- 杭州出租车行驶轨迹数据空间时间可视化分析|附代码数据
- 用数据告诉你出租车资源配置是否合理|附代码数据
- 10个实用的数据可视化的图表总结
- 多元时间序列特征工程的指南
- 支持向量机核技巧:10个常用的核函数总结
- 7个有用的Pandas显示选项
- 图像数据的特征工程
- 基于SARIMA、XGBoost和CNN-LSTM的时间序列预测对比
- 时间序列的蒙特卡罗交叉验证
- 振弦采集模块VMTool 配置工具的传感器数据读取
- 计算机视觉面试中一些热门话题整理
- Pandas中高效的选择和替换操作总结
- 基于CNN和LSTM的气象图降水预测示例
- 如何检测时间序列中的异方差(Heteroskedasticity)
- PyTorch的Dataset 和TorchData API的比较
- 降维和特征选择的对比介绍
- Pandas处理大数据的性能优化技巧
- 使用CLIP构建视频搜索引擎
- PyTorch 2.0 推理速度测试:与 TensorRT 、ONNX Runtime 进行对比