windows 10 vs2017 x264的编译和使用测试

2023-11-04

做了一次更新,工具改成vs2019了。

x264这个sdk非常棒!

————————————————————————————————

主页:x264, the best H.264/AVC encoder - VideoLANhttps://www.videolan.org/developers/x264.html

在win10 中,用 git bash中下载github上的x264源代码:

git clone https://code.videolan.org/videolan/x264.git

如果上述链接找不到,可以在此处下载源代码

在 MSYS2的MinGW 64bit中配置好开发环境

然后进入x264源代码目录:

$cd   xxx/x264

然后执行如下命令:

$./configure    --enable-shared     --disable-asm

完毕后,执行make:

$make -j16

$ls

————————————————————————————————

下载pexports 源代码:在 git bash中执行:

git clone  https://github.com/Crystalnix/pexports-0.44.git

如果上述源码链接已经不存在,可以在此处下载

在Msys2中执行:

$make clean

删掉Makefile中第一行里的   -m32,并执行编译命令:

$make

$ls

在CMD中执行 p e x p o r t s . e x e :

拷贝 p e x p o r t s . e x e 放到

D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\Hostx64\x64

打开vs2017开始中的 “VS 2017的x64 Native命令提示符

把libx264-164.dll拷贝到一个独立的文件夹,然后执行:

pexports ./libx264-164.dll > libx264-164.def

再在工具执行:

lib /def:libx264-164.def /machine:x64 /out:libx264-164.lib

把x264/ 文件夹中的include文件夹拷贝到安装目录D:\x264,把其他的libx264-164.dll和libx264-164.lib放到  D:\x264\bin目录和D:\x264\lib目录中。

然后就可以在vs2017的vc项目的x64的release中使用了。

测试环境,下面这个经典的例子已经包含了编码器的主要使用流程,只是参数设置上略显单调,参数的使用需要慢慢掌握。

新建VC 2017的控制台程序,设置为x86项目,配置属性中的 包含目录 和 库目录 以及 链接输入libx264-164.lib:

#include <cassert>
#include <iostream>
#include <string>
#include "stdint.h"
extern "C"
{
#include "x264.h"
};
unsigned int g_uiPTSFactor = 0;
int iNal = 0;
x264_nal_t* pNals = NULL;
int encode(x264_t* p264, x264_picture_t* pIn, x264_picture_t* pOut);
int main(int argc, char** argv)
{
	int iResult = 0;
	x264_t* pX264Handle = NULL;

	x264_param_t* pX264Param = new x264_param_t;
	assert(pX264Param);
	//* 配置为默认参数
	x264_param_default(pX264Param);
	//* cpuFlags
	pX264Param->i_threads = X264_SYNC_LOOKAHEAD_AUTO;
	//* video Properties
	pX264Param->i_width = 320; //* width
	pX264Param->i_height = 240; //* height
	pX264Param->i_frame_total = 0; //* 视频总帧数,0表示任意
	pX264Param->i_keyint_max = 10;
	//* bitstream parameters
	pX264Param->i_bframe = 5;
	pX264Param->b_open_gop = 0;
	pX264Param->i_bframe_pyramid = 0;
	pX264Param->i_bframe_adaptive = X264_B_ADAPT_TRELLIS;

	//* 比特流参数
	//pX264Param->vui.i_sar_width = 1080;
	//pX264Param->vui.i_sar_height = 720;

	//* Log参数
	pX264Param->i_log_level = X264_LOG_DEBUG;
	//* Rate control Parameters
	pX264Param->rc.i_bitrate = 1024 * 10;//* 码率(Kbps)
	//* muxing parameters
	pX264Param->i_fps_den = 1; //* 帧率分母
	pX264Param->i_fps_num = 25;//* 帧率分子
	pX264Param->i_timebase_den = pX264Param->i_fps_num;
	pX264Param->i_timebase_num = pX264Param->i_fps_den;

	//* 设置编码等级profile : baseline、main、height ( 直播baseline:流畅 、Main:有停顿现象 、本地FLV文件:main)
	x264_param_apply_profile(pX264Param, x264_profile_names[1]);

	//* 创建264编码器。后面可以使用x264_encoder_parameters来编码器参数,可以使用x264_encoder_reconfig更新设置参数
	pX264Handle = x264_encoder_open(pX264Param);
	assert(pX264Handle);

	//* 获取流的PPS和SPS
	iResult = x264_encoder_headers(pX264Handle, &pNals, &iNal);
	assert(iResult >= 0);
	//* PPS SPS 解析
	for (int i = 0; i < iNal; ++i)
	{
		switch (pNals[i].i_type)
		{
		case NAL_SPS:
			break;
		case  NAL_PPS:
			break;
		default:
			break;
		}
	}

	//* 编码器缓存的最大帧数
	int iMaxFrames = x264_encoder_maximum_delayed_frames(pX264Handle);

	//* 编码需要的临时变量
	iNal = 0;
	pNals = NULL;
	x264_picture_t* pPicIn = new x264_picture_t;
	x264_picture_t* pPicOut = new x264_picture_t;

	x264_picture_init(pPicOut);
	x264_picture_alloc(pPicIn, X264_CSP_I420, pX264Param->i_width, pX264Param->i_height);
	pPicIn->img.i_csp = X264_CSP_I420;
	pPicIn->img.i_plane = 3;

	//* 创建264本地视频文件
	FILE* pFile;
	fopen_s(&pFile,"d:\\hellox264.264", "wb");
	assert(pFile);

	//* 一帧中YUV420中Y的数据长度
	int iDataLen = pX264Param->i_width * pX264Param->i_height;
	uint8_t* data = new uint8_t[iDataLen];

	unsigned int  uiComponent = 0;
	while (++uiComponent<1030)
	{
		//* 每一帧的数据构成YUV420
		::memset(data, uiComponent, iDataLen);
		::memcpy(pPicIn->img.plane[0], data, iDataLen);
		::memcpy(pPicIn->img.plane[1], data, iDataLen / 4);
		::memcpy(pPicIn->img.plane[2], data, iDataLen / 4);

		if (uiComponent <= 1000)
		{
			pPicIn->i_pts = uiComponent + g_uiPTSFactor * 1000;
			encode(pX264Handle, pPicIn, pPicOut);
		}
		else
		{
			int iResult = encode(pX264Handle, NULL, pPicOut);
			if (0 == iResult)
			{
				//uiComponent = 0;
				++g_uiPTSFactor;

			}
		}

		//* 编码完成的多帧数据逐一写入视频文件
		for (int i = 0; i < iNal; ++i)
		{
			fwrite(pNals[i].p_payload, 1, pNals[i].i_payload, pFile);
		}
	}
	//* 释放清除图像数据
	x264_picture_clean(pPicIn);
//	x264_picture_clean(pPicOut);
	//* 利用句柄关闭解码器
	x264_encoder_close(pX264Handle);
	pX264Handle = NULL;

	delete pPicIn;
	pPicIn = NULL;

	delete pPicOut;
	pPicOut = NULL;

	delete pX264Param;
	pX264Param = NULL;

	delete[] data;
	data = NULL;
	return 0;
}

int encode(x264_t* pX264Handle, x264_picture_t* pPicIn, x264_picture_t* pPicOut)
{

	int iResult = 0;
	iResult = x264_encoder_encode(pX264Handle, &pNals, &iNal, pPicIn, pPicOut);
	if (0 == iResult)
	{
		std::cout << "编码成功,但是缓存在编码器中" << std::endl;
	}
	else
		if (iResult < 0)
		{
			std::cout << "编码出错" << std::endl;
		}
		else
			if (iResult > 0)
			{
				std::cout << "编码成功,并需要写入视频文件流" << std::endl;
			}

	
	int iFrames = x264_encoder_delayed_frames(pX264Handle);
	std::cout << "缓冲帧数:" << iFrames << "\n";//因为要进行编码,所以编码器需要缓存很多帧才好生成I、P、B帧
	return iFrames;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows 10 vs2017 x264的编译和使用测试 的相关文章

  • 在Windows 7上安装curl后缺少libcurl-4.dll

    按照这个人的安装curl后指示 https stackoverflow com a 28757477 1186038 除了第 2 步 已安装Win64 OpenSSL v1 0 1u 轻型相反 因为下载页面中缺少版本 k http slpr
  • C++ 使用 Windows 命名管道

    由于某种原因 桅杆和从属装置都失败了 但是我可以找到任何关于它们如何工作的好例子 所以我不确定我哪里出了问题 在 ConnectNamedPipe 之后 主设备永远不会退出 WaitForSingleObject 并且从设备在第一个 boo
  • conio.h 不包含 textcolor()?

    我一直在考虑在我用 C 编写的 DOS 程序中使用颜色 有人告诉我conio h有textcolor 函数 但是当我在代码中使用它时 编译器 链接器会向我抛出错误 说我对该函数有未定义的引用 Does conio h真的有这个功能还是有人告
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • Windows 窗体中的标准 Windows 菜单栏

    我注意到添加了一个MenuStrip 来自工具箱 我的表单设计不会产生像许多本机 Windows 应用程序中那样的菜单栏 相反 我得到了一个像 Visual Studio 自己的菜单栏 没有任何样式设置MenuStrip似乎模仿了更常见的本
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • Visual C++ 找不到“Windows 类型”,如 PVOID、DWORD、ULONG 等

    Windows 似乎无法找到任何这些类型 我完全不知道该怎么办 我在 MSDN 上找到的东西似乎表明它们是默认包含的 但它们在 Native 程序或 CLR 程序中不起作用 我收到的具体错误是
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • 如何为 Windows 构建静态 Qt 库并将其与 Qt Creator 一起使用

    我已经下载了以下 Qt 源 http download qt nokia com qt source qt everywhere opensource src 4 7 3 zip http download qt nokia com qt
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 在 Windows 上查找父进程 ID

    Problem 给定远程 Windows 主机上的进程 ID 和命令行访问权限 如何找到其父进程的 PID Solution 鉴于 Marc B 的回答 我们可以使用 WMIC 命令示例here https learn microsoft
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt
  • Nexus 7 (2013) 和 Win 7 64 - 尽管检查了许多论坛和在线资源,仍无法安装 USB 驱动程序

    我正在尝试设置 Nexus 7 2013 进行调试 但我在安装 USB 驱动程序的步骤中陷入困境 到目前为止 这是我尝试过的 采取的步骤 在 Nexus 7 2013 上打开调试模式 连接设备至 PC 下载 Google USB 驱动程序于
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 运行“npm install”:Node-gyp 错误 - MSBUILD.exe 失败,退出代码:1

    我在跑npm install在 Windows 上安装我的项目中的所有软件包 然后我收到有关 MSBUILD exe 的错误 gyp ERR stack Error C Program Files x86 Microsoft Visual
  • “以管理员身份运行”时的 Windows 批处理文件起始目录

    我有一个位于目录中的批处理文件 也必须从那里运行 因为它会更新该目录中的文件 这工作得很好 除非用户以管理员身份运行批处理文件 Vista 上需要 那么起始目录是C Windows System32 有什么办法仍然能够知道批处理文件是从哪个
  • 如何改变HTML5视频的播放速度?

    如何更改 HTML5 中的视频播放速度 我查过视频标签的属性 https www w3schools com html html5 video asp在 w3school 但无法做到这一点 根据这个网站 http www chipwreck
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一

随机推荐

  • php 数组元素快速去重

    1 使用array unique方法进行去重 对数组元素进行去重 我们一般会使用array unique方法 使用这个方法可以把数组中的元素去重 1 2 3 4 5 6 1 2 3 4 5 6 输出 Array 0 gt 1 1 gt 2
  • 总结磁共振成像的脑龄预测的人工智能模型

    脑龄预测的人工智能模型 介绍 基于神经影像的BA预测 BA预测建模 从统计方法到DL 统计方法 使用统计 最大似然估计方法的BA研究的主要结果 深度学习 使用DL方法进行BA研究的主要结果 可解释的人工智能 即可解释的深度学习方案 可解释的
  • 从简入难makefile文件编写,Linux C++编程,简单vi命令

    1 一个最基本的C 程序 2 第二个c 程序 3 第一个入门级别的简单的makefile 4 在makefile中定义变量 5 编写makefile的依赖 如果start 标识后面的某个 o没有 则重新编译没有编译的那个文件 6 最终的ma
  • 连接git仓库失败解决办法

    问题出现 首先是我在本地建了个项目 写完了之后呢打算用sourceTree推到gitlab的仓库里 奈何这gitlab仓库怎么也连接不上 基于我是第一次使用sourceTree 想着是不是啥东西没配置好 结果各种捣鼓发现gitee和gith
  • vertx文章系列--响应式Mysql操作入门体验

    官网地址 https vertx io 中文文档 https vertx china gitee io Mysql驱动连接练习 https vertx china gitee io docs vertx mysql client java
  • CVPR2018-SRMD-Kai Zhang

    https github com cszn SRMD https github com 2wins SRMD pytorch 创新点 1 设计了一个非盲单一 CNN 网络SRMD 针对多个退化模型 模型的输入除了LR图 还有 degrati
  • Unity UI上的物体跟随场景物体位置变化而变化(人物血条/称号)

    首先看下UI上物体的位置计算 UI上的物体 以下用 血条 代称 这个很简单 无非就是坐标转换 把人物的世界坐标转到屏幕坐标 代码如下 public Transform target public Transform hpSp public
  • Linux系统安装Java

    1 下载JDK 下载网址 https www oracle com technetwork java javase downloads index html 下拉 找到jdk8 使用Xshell远程连接虚拟机 2 先新建一个文件夹 目录是
  • oracle 分区表插入数据_Oracle数据库分区表整理笔记

    关键词 partition 分区subpartition 辅助分区已经存在的表没有方法可以直接转化为分区表 分区索引 一 分区表类型 1 范围分区 1 1 按指定要求划分 假设有一个CUSTOMER表 表中有数据200000行 我们将此表通
  • JS reduce 用法

    定义 reduce 方法接收一个函数作为累加器 数组中的每个值 从左到右 开始缩减 最终计算为一个值 语法 array reduce function total currentValue currentIndex arr initialV
  • HEVC对场编码的支持

    HEVC值得注意的是它没有提供专用于隔行视频的工具 而是将隔行视频的一帧看作两个独立的场 对各个场数据分别进行编码 简化了编码器的实现 这也是因为随着数字视频技术的快速发展 视频的隔行扫描方式日渐式微 https blog csdn net
  • vue+element-ui实现表格里嵌套表格

    效果图 点击某行数据展开另一个嵌套在里面的table 核心代码 从后台请求的数据格式 代码实现
  • table 表格合并

    table 表格合并 开发工具与关键技术 DW JavaScript 作者 刘东标 撰写时间 2019 03 14 div div span colspan和rowspan这两个属性用于创建特殊的表格 span span colspan用来
  • JAVA查搜索文件内容

    上周突然遇到了个要查找历史sql的中是否包含某个字段的问题 Everting虽然可以查找某个后缀的文件 可是并不能搜索文件内容 所以就花费一点功夫自己写一个了 使用起来还是非常方便 1 单文件查找内容 2 单文件夹下读取所有文件 并查找内容
  • 【时间序列预测算法】——ARIMA 算法介绍及代码实现

    基本概念 一阶差分 时间序列在t 与t 1 时刻函数值的差值 提升时序数据的平稳性 ARIMA算法对数据平稳性有要求 二阶差分 在一阶差分的基础上再做一次 一般时序数据最多做两阶 再多则预测意义不大 自回归模型 f t
  • Google Protocol Buffer持久化框架分析

    一 三大主流开源持久化框架介绍 1 1 Google Protocol Buffer protocol buffer是google 的一种数据交换的格式 它独立于语言 独立于平台 google 提供了三种语言的实现 java c 和 pyt
  • The type or namespace name ‘MenuItemAttribute‘ could not be found类似报错处理方法

    类似报错主要是使用了UnityEditor相关的API 解决方法的话 只要将相关脚本放进Asset下的Editor文件夹之中即可 并不涉及其他的逻辑 只与UnityEditor相关 否则在打包的时候还可能会发生类似的报错
  • KEIL编译报错 Error: L6220E: Load region LR_IROM1 size (65552 bytes) exceeds limit (65536 bytes)……

    问题描述 STM32F103CBT6 KEIL编译报错 Error L6220E Load region LR IROM1 size 65552 bytes exceeds limit 65536 bytes Region contains
  • 7107小时时,加入创业公司(没有股份,当作经验吧)

    只是第一个项目是web项目 与vr无关 所以此项目耗费时间不计入1万小时之内 也不算是第五个项目 不过也算是里程碑 至少2017年有稳定项目来源了吧 主要也是学经验 以后如果开自己的公司的话 能有所借鉴 还是要努力的 才能多接触各方面 主要
  • windows 10 vs2017 x264的编译和使用测试

    做了一次更新 工具改成vs2019了 x264这个sdk非常棒 主页 x264 the best H 264 AVC encoder VideoLANhttps www videolan org developers x264 html 在