x264编解码库 -介绍和使用示例

目录

1:X264简单介绍

       1.1:编译x264

     1.2:x264简单介绍

      1.3:x264的优势

     1.4:x264与FFmpeg的关系

        1.5:x264 编解码原理

    1.6 进一步学习资源

2:demo效果

3:完整代码

4:附件压缩包代码


1:X264简单介绍

       1.1:编译x264

         上一篇介绍了,如何基于Windows vs环境编译x264的步骤,https://blog.csdn.net/xiaoshuaijinniu/article/details/140712483icon-default.png?t=N7T8https://blog.csdn.net/xiaoshuaijinniu/article/details/140712483

     1.2:x264简单介绍

        x264是一个专门用于H264/MPEG-4 AVC视频编解码的开源库,始于2004年,目标就是为了 提供一个高效 稳定 高质量的H264编解码。在2012年左右大规模用于各个商业场景和开源框架中。

      1.3:x264的优势

        1:x264实现了H.264标准的所有高级特性,相同的图像质量下,实现了更高的压缩率,也就是数据更少了质量更高了,特别是低比特率下,提供更好的质量。

        2:支持多线程编码,可以利用多核处理器,提高编解码速率

        3:开源使用,而且应用平台很多,可以说是成为了行业标准,比如FFmpeg,VLC、YouTube、Twitch等等

     1.4:x264与FFmpeg的关系

        FFmpeg是一个开源的针对多媒体处理的开源库,音视频编解码、复用、流媒体、过滤、播放等功能,FFmpeg内部兼容支持了链接外部x264的使用,也就是在编译FFmpeg时,可以开启x264的模块使用,然后使用时,FFmpeg会遍历已注册的编解码器,找到x264编码器,FFmpeg内部也有自己的h264编解码器,之前性能不如x264,但现在发展的也足够一般情况下去使用了,所有可以根据自身的需求去选择。

通过集成 x264,FFmpeg 可以提供高效的 H.264 编码功能。FFmpeg 的灵活性和多功能性使其成为许多媒体处理任务的首选工具,而 x264 的高效编码能力则进一步增强了 FFmpeg 的性能。

      1.5:x264 编解码原理

x264 的编码过程主要包括以下几个步骤:

  1. 分块与分片:将输入图像分成多个宏块,每个宏块进一步划分为 4x4 或 8x8 的子块。
  2. 预测编码:使用帧内预测和帧间预测减少冗余数据。帧内预测通过相邻像素预测当前块,帧间预测通过参考之前或之后的帧预测当前块。
  3. 变换和量化:对预测残差进行离散余弦变换(DCT)和量化,减少不重要的高频系数。
  4. 熵编码:使用 CABAC 或 CAVLC(上下文自适应变长编码)对量化后的系数进行熵编码,提高压缩效率。
  5. 输出比特流:将编码后的数据打包成 NAL(网络抽象层)单元,形成最终的 H.264 比特流。

通过这些步骤,x264 能够实现高效的视频压缩,同时保持较高的图像质量。

    1.6 进一步学习资源

  • x264 官方文档
  • FFmpeg 官方文档
  • H.264 标准文档

2:demo效果

x264​​​​​​

3:完整代码

#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\\x264demo\\bin\\yuv_420-352x288.yuv", "rb");// 打开输出H.264文件FILE* out_file = fopen("E:\\hs\\hspro\\x264demo\\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(&param, "medium", "zerolatency");param.i_bitdepth = 8;         // 位深度设置为8位param.i_csp = X264_CSP_I420;  // 色彩空间设置为I420param.i_width = 352;          // 视频宽度设置为352param.i_height = 288;         // 视频高度设置为288param.i_fps_num = 25;         // 帧率分子设置为25param.i_fps_den = 1;          // 帧率分母设置为1// 应用高质量的编码配置文件x264_param_apply_profile(&param, "high");// 打开x264编码器,使用设置好的参数encoder = x264_encoder_open(&param);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; // 程序成功结束
}

4:附件压缩包代码

之前有些对这些可能不是太熟悉的朋友说,代码有了,但是环境配置起来有些不一致或者其他情况,不知道怎么处理,我附上完整的代码包,后面的文章,我也尽量把完整的代码包作为附件去发。给需要的各位参考

http://链接:https://pan.baidu.com/s/1y5PJeNVfEQ_dvM2sjCKJ6Q?pwd=elpf 提取码:elpficon-default.png?t=N7T8http://链接:https://pan.baidu.com/s/1y5PJeNVfEQ_dvM2sjCKJ6Q?pwd=elpf 提取码:elpf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6 网络

6 网络 1、概念2 IP地址3、套接字4、TCP协议4.1 TCP协议的基本特征4.2 建立连接4.4 终止连接4.5 编程模型 5、UDP协议5.1 UDP协议的基本特性5.2 常用函数5.3 UDP通信模型 6、域名解析 1、概念 计算机网络是实现资源共享和信息传递的计算机系统 ISO/OSI网络协议模型 TCP/IP协…

C语言进阶 10. 字符串

C语言进阶 10. 字符串 文章目录 C语言进阶 10. 字符串10.1. 字符串10.2. 字符串变量10.3. 字符串输入输出10.4. 字符串数组10.5. 单字符输入输出10.6. 字符串函数strlen()10.7. 字符串函数strc()10.8. 字符串函数strcpy()10.9. 字符串搜索函数10.10. PAT10-0. 说反话 (20)10-1.…

idea中导入外部依赖并打包到jar包中

前言&#xff1a; 很多时候在我们写项目对接三方的时候都需要导入三方jar包&#xff0c;而这时候我们用平常的pom里面写依赖发现导入不了&#xff08;直接把jar包放在本地导入的话打包的话也不会将该依赖打包进我们项目的jar包&#xff09;&#xff0c;我在网上找了几种方法 …

Linux网络-ss命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器&#xff0c;主要的作用就是向客户端提供网络…

【C++】C++11中R字符串的作用

在 C11 中添加了定义原始字符串的字面量 1.定义和基本使用 定义方式为&#xff1a; R"xxx(原始字符串)xxx"其中 () 两边的字符串可以省略&#xff0c;R只会处理括号中的字符串。 原始字面量 R 可以直接表示字符串的实际含义&#xff0c;而不需要额外对字符串做转义…

谷歌团队新技术Alchemist:使用扩散模型对材料属性进行参数控制

Alchemist是由谷歌团队和麻省理工学院联合研发的一项创新技术&#xff0c;它利用扩散模型对材料属性进行精细的参数控制。这项技术的核心在于能够对真实图像中的物体材料属性进行调整&#xff0c;包括粗糙度、金属感、反照率和透明度等。Alchemist的实现依赖于先进的文本到图像…

【时时三省】(C语言基础)循环语句while(2)

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 getchar和scanf的作用 示例: int main ( ) &#xff5b; char password[20] ( 0 ) ; printf ( "请输入密码&#xff1a;> " )&#xff1b; scanf ( " &#xff05;s…

Sping项目只能勾选17和21 (已解决) 导致的后续Invalid bound statement (not found):

问题发现 今天创建项目的时候发现 idea初始化spring的时候选择不了Java8 解决方案:替换URL为 https://start.aliyun.com/ 将IDEA页面创建Spring项目&#xff0c;其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。 将https://start.spr…

使用 VMware vCenter Server(vSphere Client)迁移 ESXi 虚拟机

我需要将虚拟机 k8s-dev-node4从 ESXi 主机 192.168.1.161 迁移到 ESXi 主机 192.168.1.162 上&#xff0c;使用 VMware vCenter Server&#xff08;vSphere Client&#xff09;在浏览器上可视化操作&#xff0c;将这个需求变的非常简单。 1、选中需要迁移的虚拟机&#xff0c…

【AI落地应用实战】Amazon Bedrock +Amazon Step Functions实现链式提示(Prompt Chaining)

一、链式提示 Prompt Chaining架构 Prompt Chaining 是一种在生成式人工智能&#xff08;如大型语言模型&#xff09;中广泛使用的技术&#xff0c;它允许用户通过一系列精心设计的提示&#xff08;Prompts&#xff09;来引导模型生成更加精确、丰富且符合特定需求的内容。 P…

获取手机当前信号强度(dbm/asu值)解决 getGsmSignalStrength()总是返回99问题

能看到这篇文章说明网上哪些获取 &#xff08;dbm/asu值&#xff09;不适合你&#xff0c;不是他们的代码不正确&#xff0c;而是不符合你的情况 比如安卓6获取android手机信号强度 可以看这篇文章 https://blog.csdn.net/sinat_31057219/article/details/81134030 当然如果你…

Javaweb项目|springboot医院管理系统

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于springboot医院管理系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisVue 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 编号&#xff1a;…

Source insight 配置代码格式化

代码格式化工具&#xff1a;Artistic Style Files Download 配置 Source Insight 添加 Astyle 命令 Tools --> Custom Commands -->Add 在 Run 栏填入格式化命令&#xff1a; "D:\Program Files\astyle-3.5.2-x64\astyle.exe" -A3 -t -xV -w -Y -m0 -p -H …

【Vulnhub系列】Vulnhub_Raven2靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Raven2 渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境准备 从网盘下载该靶机&#xff0c;在vm中选择【打开】 然后设置好存储路径&#xff0c;开机后检查靶机的网络连…

Redis缓存数据库进阶——Redis缓存数据同步问题(8)

Redis缓存使用问题 数据一致性 只要使用到缓存&#xff0c;无论是本地内存做缓存还是使用 redis 做缓存&#xff0c;那么就会存在数据同步的问题。 我以 Tomcat 向 MySQL 中写入和删改数据为例&#xff0c;来给你解释一下&#xff0c;数据的增删改操作具体是如何进行的。 我…

从入门到精通:电商设计师的职业发展指南

在当今数字时代&#xff0c;电商设计师的作用越来越重要。从电子商务网站的整体造型设计到产品页面的具体布局&#xff0c;他们的工作范围是电子商务企业成功的关键因素之一。然而&#xff0c;并不是每个人都对这个职业有深刻的理解。因此&#xff0c;在本文中&#xff0c;我们…

【Git-驯化】一文学会git中对代码进行存储操作:git stash技巧

【Git-驯化】一文学会git中对代码进行存储操作&#xff1a;git stash技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内…

【无标题】DNS域名解析

回顾指令&#xff1a; samba机器&#xff1a; 安装samba Yum -y install samba 自建库&#xff0c;只下载不安装 Yum -y install --downloadonly --downloaddir./soft/ 配置samba Vim /etc/samba/smb.conf [smb_share] comment smb share service path /share/ guest…

python爬虫的基础知识

1.学习爬虫的好处 提升编程技能&#xff1a;爬虫开发需要掌握编程基础&#xff0c;特别是网络请求、HTML/CSS/JavaScript解析、数据存储和异常处理等技能。通过学习爬虫&#xff0c;你可以巩固和提升你的编程技能&#xff0c;特别是Python等编程语言的应用能力。 数据驱动决策…

力扣高频SQL 50题(基础版)第二十四题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十四题1729.求关注者的数量题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十四题 1729.求关注者的数量 题目说明 表&#xff1a; Followers ----------------…