x264编解码库 -介绍和使用示例
创作时间:
作者:
@小白创作中心
x264编解码库 -介绍和使用示例
引用
CSDN
1.
https://blog.csdn.net/xiaoshuaijinniu/article/details/140747921
X264简单介绍
编译x264
上一篇介绍了,如何基于Windows vs环境编译x264的步骤,点击查看
x264简单介绍
x264是一个专门用于H264/MPEG-4 AVC视频编解码的开源库,始于2004年,目标就是为了 提供一个高效 稳定 高质量的H264编解码。在2012年左右大规模用于各个商业场景和开源框架中。
x264的优势
- x264实现了H.264标准的所有高级特性,相同的图像质量下,实现了更高的压缩率,也就是数据更少了质量更高了,特别是低比特率下,提供更好的质量。
- 支持多线程编码,可以利用多核处理器,提高编解码速率
- 开源使用,而且应用平台很多,可以说是成为了行业标准,比如FFmpeg,VLC、YouTube、Twitch等等
x264与FFmpeg的关系
FFmpeg是一个开源的针对多媒体处理的开源库,音视频编解码、复用、流媒体、过滤、播放等功能,FFmpeg内部兼容支持了链接外部x264的使用,也就是在编译FFmpeg时,可以开启x264的模块使用,然后使用时,FFmpeg会遍历已注册的编解码器,找到x264编码器,FFmpeg内部也有自己的h264编解码器,之前性能不如x264,但现在发展的也足够一般情况下去使用了,所有可以根据自身的需求去选择。
通过集成 x264,FFmpeg 可以提供高效的 H.264 编码功能。FFmpeg 的灵活性和多功能性使其成为许多媒体处理任务的首选工具,而 x264 的高效编码能力则进一步增强了 FFmpeg 的性能。
x264 编解码原理
x264 的编码过程主要包括以下几个步骤:
- 分块与分片:将输入图像分成多个宏块,每个宏块进一步划分为 4x4 或 8x8 的子块。
- 预测编码:使用帧内预测和帧间预测减少冗余数据。帧内预测通过相邻像素预测当前块,帧间预测通过参考之前或之后的帧预测当前块。
- 变换和量化:对预测残差进行离散余弦变换(DCT)和量化,减少不重要的高频系数。
- 熵编码:使用 CABAC 或 CAVLC(上下文自适应变长编码)对量化后的系数进行熵编码,提高压缩效率。
- 输出比特流:将编码后的数据打包成 NAL(网络抽象层)单元,形成最终的 H.264 比特流。
通过这些步骤,x264 能够实现高效的视频压缩,同时保持较高的图像质量。
进一步学习资源
- x264 官方文档
- FFmpeg 官方文档
- H.264 标准文档
demo效果
完整代码
#include <iostream>
#include <string>
#include "stdint.h"
#pragma warning(disable : 4996) // 禁用4996号警告
#pragma comment(lib, "libx264.lib") // 链接x264库文件
extern "C"
{
#include "x264shared/include/x264.h"
#include "x264shared/include/x264_config.h"
}
// 读取 YUV 图像
int read_yuv_frame(FILE *fp, x264_picture_t *pic, int width, int height) {
int y_size = width * height; // 计算Y分量大小
int uv_size = y_size / 4; // 计算U和V分量大小,YUV 4:2:0格式下为Y的四分之一
// 从文件中读取Y分量数据
if (fread(pic->img.plane[0], 1, y_size, fp) != y_size) {
return -1; // 如果读取失败,返回-1
}
// 从文件中读取U分量数据
if (fread(pic->img.plane[1], 1, uv_size, fp) != uv_size) {
return -1; // 如果读取失败,返回-1
}
// 从文件中读取V分量数据
if (fread(pic->img.plane[2], 1, uv_size, fp) != uv_size) {
return -1; // 如果读取失败,返回-1
}
return 0; // 成功读取返回0
}
int main(int argc, char** argv)
{
printf("hello world.\n"); // 打印测试信息
// 打开输入YUV文件
FILE* in_file = fopen("E:\\hs\\hspro\\u00264demo\\bin\\yuv_420-352x288.yuv", "rb");
// 打开输出H.264文件
FILE* out_file = fopen("E:\\hs\\hspro\\u00264demo\\bin\\x.h264", "wb");
if (!in_file) {
fprintf(stderr, "Failed to open input file\n"); // 如果输入文件打开失败,打印错误信息
return -1;
}
if (!out_file) {
fprintf(stderr, "Failed to open output file\n"); // 如果输出文件打开失败,打印错误信息
fclose(in_file); // 关闭已打开的输入文件
return -1;
}
x264_t *encoder; // x264编码器
x264_picture_t pic_in, pic_out; // 输入和输出图像
x264_param_t param; // 编码参数
x264_nal_t *nals; // NAL单元
int num_nals; // NAL单元数量
// 初始化编码参数,使用“medium”预设和“zerolatency”选项
x264_param_default_preset(¶m, "medium", "zerolatency");
param.i_bitdepth = 8; // 位深度设置为8位
param.i_csp = X264_CSP_I420; // 色彩空间设置为I420
param.i_width = 352; // 视频宽度设置为352
param.i_height = 288; // 视频高度设置为288
param.i_fps_num = 25; // 帧率分子设置为25
param.i_fps_den = 1; // 帧率分母设置为1
// 应用高质量的编码配置文件
x264_param_apply_profile(¶m, "high");
// 打开x264编码器,使用设置好的参数
encoder = x264_encoder_open(¶m);
if (!encoder) {
fprintf(stderr, "Failed to open encoder\n"); // 如果编码器打开失败,打印错误信息
fclose(in_file); // 关闭已打开的输入文件
fclose(out_file); // 关闭已打开的输出文件
return -1;
}
// 分配输入图像内存
x264_picture_alloc(&pic_in, param.i_csp, param.i_width, param.i_height);
// 初始化输出图像
x264_picture_init(&pic_out);
int frame_count = 0; // 初始化帧计数器
// 从文件中读取一帧YUV图像并进行编码
while (read_yuv_frame(in_file, &pic_in, param.i_width, param.i_height) == 0) {
pic_in.i_pts = frame_count++; // 设置图像的时间戳(PTS)
// 使用x264编码器编码图像,生成NAL单元
int frame_size = x264_encoder_encode(encoder, &nals, &num_nals, &pic_in, &pic_out);
if (frame_size < 0) {
fprintf(stderr, "Failed to encode frame\n"); // 如果编码失败,打印错误信息
x264_picture_clean(&pic_in); // 清理输入图像内存
x264_encoder_close(encoder); // 关闭编码器
fclose(in_file); // 关闭输入文件
fclose(out_file); // 关闭输出文件
return -1;
}
// 写入编码后的NAL单元到输出文件
for (int i = 0; i < num_nals; i++) {
fwrite(nals[i].p_payload, 1, nals[i].i_payload, out_file);
}
}
// 清理输入图像内存
x264_picture_clean(&pic_in);
// 关闭编码器
x264_encoder_close(encoder);
// 关闭输入文件
fclose(in_file);
// 关闭输出文件
fclose(out_file);
return 0; // 程序成功结束
}
热门推荐
专业康复师详解:卧床患者的全面康复训练指南
儿童使用含氟牙膏全攻略:安全用量与使用方法
传统桂花糕的现代蝶变:四大创新引领百年美食新风尚
如何防治玉米秃尖?从品种到管理的全方位指南
如何有效恢复被拉黑的关系:沟通与理解的重要性
洛阳文化产业年会发布盛世隋唐文创酒,200余位专家共谋发展
黄金周首日台东步行街爆满,这些美食和打卡点最热门
安期生与桃花岛:一段跨越千年的传奇
昆明捞鱼河湿地公园:滇池边的生态奇迹
捞鱼河湿地公园:冬季海鸥陪你赏景
从心智发展模式看任正非:一个商业领袖的自我超越
18个野生动物冷知识:从火烈鸟变色到蚂蚁消毒
秋冬补气血,益血晶颗粒让你告别气血不足
防滑链使用指南:4种类型特点及安装步骤详解
高情商追女生:这样开场最能打动她
五行缺土?试试这些食物,健康UP!
广湛高铁佛山站招标完成,中心城区将迎首个高铁枢纽
从金刚到天人:雪中悍刀行的武道修炼体系
刀郎新年首唱引轰动,传统文化创新获市场肯定
在善良与自私间找平衡,中庸之道助你处理人际关系
盐酸米诺环素胶囊,正确服用指南
不容忽视的十大儿童交通安全隐患,你知道吗?
职场称呼有讲究:Ms. vs Mrs.,你用对了吗?
Ms. vs Mrs.:职场称呼大揭秘
职场女性如何选择称呼:Ms.还是Mrs.?
唐伯虎:从落魄文人到江南第一才子,艺术成就超越风流传说
投服中心首例资金占用代位诉讼胜诉,开创投资者维权新模式
80岁科技巨头与33岁华裔女性结婚,跨越47岁年龄差的婚姻引发全球热议
历史与现状:妈祖文化在中国大陆和东南亚之间的交流互动
油罐车混运食用油与化工品,食品安全隐患亟待解决