2023-03-08:x265的视频编码器,不用ffmpeg,用libx265.dll也行。请用go语言调用libx265.dll,将yuv文件编码成h265文件。
2023-03-08:x265的视频编码器,不用ffmpeg,用libx265.dll也行。请用go语言调用libx265.dll,将yuv文件编码成h265文件。
答案2023-03-08:
使用 github.com/moonfdd/x265-go 库,代码写在了这个库里。
这个库根据头文件编写,不依赖头文件。
执行命令:
go run ./examples/simplest_x265_encoder/main.go
参考了雷霄骅的基于libx265的视频编码器,代码用golang编写。代码如下:
// https://github.com/leixiaohua1020/simplest_encoder/blob/master/simplest_x265_encoder/simplest_x265_encoder.cpp
package main
import (
	"fmt"
	"os"
	"unsafe"
	"github.com/moonfdd/ffmpeg-go/ffcommon"
	"github.com/moonfdd/x265-go/libx265"
	"github.com/moonfdd/x265-go/libx265common"
)
func main0() ffcommon.FInt {
	var i, j ffcommon.FInt
	var ret ffcommon.FInt
	var y_size ffcommon.FInt
	var buff []byte
	//FILE* fp_src  = fopen("../cuc_ieschool_640x360_yuv444p.yuv", "rb");
	fp_src, _ := os.Open("./resources/cuc_ieschool_640x360_yuv420p.yuv")
	fp_dst_file := "./out/cuc_ieschool_640x360_yuv420p.h265"
	fp_dst, _ := os.Create(fp_dst_file)
	var pNals *libx265.X265Nal
	var iNal ffcommon.FUint32T = 0
	var pParam *libx265.X265Param
	var pHandle *libx265.X265Encoder
	var pPic_in *libx265.X265Picture
	//Encode 50 frame
	//if set 0, encode all frame
	var frame_num ffcommon.FInt = 0
	var csp ffcommon.FInt = libx265.X265_CSP_I420
	var width, height ffcommon.FInt = 640, 360
	//Check
	if fp_src == nil || fp_dst == nil {
		fmt.Printf("Error open files.\n")
		return -1
	}
	pParam = libx265.X265ParamAlloc()
	pParam.X265ParamDefault()
	pParam.BRepeatHeaders = 1 //write sps,pps before keyframe
	pParam.InternalCsp = csp
	pParam.SourceWidth = width
	pParam.SourceHeight = height
	pParam.FpsNum = 25
	pParam.FpsDenom = 1
	//Init
	pHandle = pParam.X265EncoderOpen207()
	if pHandle == nil {
		fmt.Printf("x265_encoder_open err\n")
		return 0
	}
	y_size = pParam.SourceWidth * pParam.SourceHeight
	pPic_in = libx265.X265PictureAlloc()
	pParam.X265PictureInit(pPic_in)
	if frame_num == 0 {
		fi, _ := fp_src.Stat()
		switch csp {
		case libx265.X265_CSP_I444:
			buff = make([]byte, y_size*3)
			frame_num = int32(fi.Size()) / (y_size * 3)
			pPic_in.Planes[0] = uintptr(unsafe.Pointer(&buff[0]))
			pPic_in.Planes[1] = uintptr(unsafe.Pointer(&buff[0])) + uintptr(y_size)
			pPic_in.Planes[2] = uintptr(unsafe.Pointer(&buff[0])) + uintptr(y_size*2)
			pPic_in.Stride[0] = width
			pPic_in.Stride[1] = width
			pPic_in.Stride[2] = width
		case libx265.X265_CSP_I420:
			buff = make([]byte, y_size*3/2)
			frame_num = int32(fi.Size()) / (y_size * 3 / 2)
			pPic_in.Planes[0] = uintptr(unsafe.Pointer(&buff[0]))
			pPic_in.Planes[1] = uintptr(unsafe.Pointer(&buff[0])) + uintptr(y_size)
			pPic_in.Planes[2] = uintptr(unsafe.Pointer(&buff[0])) + uintptr(y_size*5/4)
			pPic_in.Stride[0] = width
			pPic_in.Stride[1] = width / 2
			pPic_in.Stride[2] = width / 2
		default:
			fmt.Printf("Colorspace Not Support.\n")
			return -1
		}
	}
	//Loop to Encode
	for i = 0; i < frame_num; i++ {
		switch csp {
		case libx265.X265_CSP_I444:
			fp_src.Read(ffcommon.ByteSliceFromByteP((*byte)(unsafe.Pointer(pPic_in.Planes[0])), int(y_size))) //Y
			fp_src.Read(ffcommon.ByteSliceFromByteP((*byte)(unsafe.Pointer(pPic_in.Planes[1])), int(y_size))) //U
			fp_src.Read(ffcommon.ByteSliceFromByteP((*byte)(unsafe.Pointer(pPic_in.Planes[2])), int(y_size))) //V
		case libx265.X265_CSP_I420:
			fp_src.Read(ffcommon.ByteSliceFromByteP((*byte)(unsafe.Pointer(pPic_in.Planes[0])), int(y_size)))   //Y
			fp_src.Read(ffcommon.ByteSliceFromByteP((*byte)(unsafe.Pointer(pPic_in.Planes[1])), int(y_size/4))) //U
			fp_src.Read(ffcommon.ByteSliceFromByteP((*byte)(unsafe.Pointer(pPic_in.Planes[2])), int(y_size/4))) //V
		default:
			fmt.Printf("Colorspace Not Support.\n")
			return -1
		}
		ret = pHandle.X265EncoderEncode(&pNals, &iNal, pPic_in, nil)
		fmt.Printf("Succeed encode frame: %5d\n", i)
		for j = 0; j < int32(iNal); j++ {
			a := unsafe.Sizeof(libx265.X265Nal{})
			pNal := (*libx265.X265Nal)(unsafe.Pointer(uintptr(unsafe.Pointer(pNals)) + uintptr(a*uintptr(j))))
			fp_dst.Write(ffcommon.ByteSliceFromByteP(pNal.Payload, int(pNal.SizeBytes)))
		}
	}
	//flush encoder
	for {
		ret = pHandle.X265EncoderEncode(&pNals, &iNal, nil, nil)
		if ret == 0 {
			break
		}
		fmt.Printf("Flush 1 frame.\n")
		for j = 0; j < int32(iNal); j++ {
			a := unsafe.Sizeof(libx265.X265Nal{})
			pNal := (*libx265.X265Nal)(unsafe.Pointer(uintptr(unsafe.Pointer(pNals)) + uintptr(a*uintptr(j))))
			fp_dst.Write(ffcommon.ByteSliceFromByteP(pNal.Payload, int(pNal.SizeBytes)))
		}
		i++
	}
	pHandle.X265EncoderClose()
	pPic_in.X265PictureFree()
	pParam.X265ParamFree()
	fp_src.Close()
	fp_dst.Close()
	fmt.Printf("\nffplay %s\n", fp_dst_file)
	return 0
}
func main() {
	os.Setenv("Path", os.Getenv("Path")+";./lib")
	libx265common.SetLibx265Path("./lib/libx265.dll")
	main0()
}

 
2023-03-08:x265的视频编码器,不用ffmpeg,用libx265.dll也行。请用go语言调用libx265.dll,将yuv文件编码成h265文件。的更多相关文章
- switch结构2016/03/08
		
Switch 03/08 一.结构 switch(){ case *: ;break;……default: ;brek;} 练习:输入一个日期,判断这一年第几天? Console.Write(&q ...
 - http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html
		
http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html
 - ant 介绍 http://blog.csdn.net/sunjavaduke/archive/2007/03/08/1523819.aspx
		
转自: 本内容包含了Ant的历史简要介绍,Ant的功能以及Ant框架的介绍,并对下载安装使用Ant进行了示例介绍,同时通过一个Java程序讲解了Ant的基本使用方法. 1. Ant简介:这 ...
 - 使用ffmpeg获取视频流后如何封装存储成mp4文件
		
int main(int argc,char *argv[]) 02 { 03 AVFormatContext *pFormatCtx; 04 int i,videoStream; 05 AVC ...
 - 引用AForge.video.ffmpeg,打开时会报错:找不到指定的模块,需要把发行包第三方文件externals\ffmpeg\bin里的dll文件拷到windows的system32文件夹下。
		
引用AForge.video.ffmpeg,打开时会报错:找不到指定的模块,需要把发行包第三方文件externals\ffmpeg\bin里的dll文件拷到windows的system32文件夹下. ...
 - 需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP
		
需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP 需求:过滤下面这个网页里共723行 校对中里 行数为两位数 ...
 - [Weekly] 2014.03.01-2014.03.08
		
这周写过好多东西,虽然还没有完全弄明白线段树,但是progress还是有的! 不过有时候真的很想哭,因为自己的梦想连别人看看韩剧.无所事事还要分量轻,实在不明白政治课的Teamwork意义何在,花两分 ...
 - 打开自定义链接新窗口(safari JS prompt的坑!)2016.03.08
		
很简单的一个小练习,但做的过程中发现safari的一个坑,使用prompt()方法的时候,点击取消和不输入一样,会返回空字符' ',而不是null! 要求: 制作新按钮,"新窗口打开网站&q ...
 - 2018/03/08 每日一个Linux命令 之 chattr/lsattr
		
每日一个Linux命令 2018-03-08 Linux 命令 chattr/lsattr chattr [-参数] [+/-属性] [文件或者目录] 经过今天没有对铃,粥熬糊了,我就知道...... ...
 - 2018/03/08 每日一学PHP 之 常量defind 和 const区别
		
常量defind 和 const区别 什么是常量? 如字面理解的,在脚本执行期间不可改变的的量. 定义一个常量应该注意的事项? 1:常量默认大小写敏感,错误的大小写不会被识别为常量. 2:常量只能是标 ...
 
随机推荐
- java 通过反射以及MethodHandle执行泛型参数的静态方法
			
开发过程中遇到一个不能直接调用泛型工具类的方法,因此需要通过反射来摆脱直接依赖. 被调用静态方法示例 public class test{ public static <T> T get( ...
 - windows下创建虚拟环境
			
创建虚拟环境依赖以下两个模块 virtualenv 和virtualenvwrapper-win 1.下载 2.修改环境变量,增加一条 WORKON_HOME:路径 3. 同步配置 去向Pytho ...
 - 如何通过C++ 将数据写入 Excel 工作表
			
直观的界面.出色的计算功能和图表工具,使Excel成为最流行的个人计算机数据处理软件.在独立的数据包含的信息量太少,而过多的数据又难以理清头绪时,制作成表格是数据管理的最有效手段之一.这样不仅可以方便 ...
 - Python学习笔记--第二阶段啦
			
初识对象 示例: 类的成员方法 上图中的self必须填写!!! 示例: 类和对象 有c和c++语言基础的话,就会发现其实是一样的道理,只是实现代码有差异 构造方法(init) 示例: 注意: 其他内置 ...
 - 分布式CAP_BASE博客参考
			
https://blog.csdn.net/lixinkuan328/article/details/95535691 CAP 一致性(Consistency) 可用性(Availability) 分 ...
 - MySQL学习(二)事务的隔离级别
			
:规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低 read uncommitted(未提交读):事务中的修改,即使没有 ...
 - Flask框架使用蓝图划分目录、g对象、使用数据库连接池链接数据库
			
目录 一.使用蓝图划分项目目录 1.蓝图的介绍 2.蓝图的使用 二.介绍flask框架的g对象 1. g对象是什么? 2. 使用代码再次解释g对象 三.使用数据库连接池链接数据库 1. 引入数据库连接 ...
 - 线性规划与整数规划—R实现
			
线性规划的R语言实现 R语言在针对各类优化模型时都能快速方便的求解,对运输问题.生产计划问题.产销问题和旅行商问题等都有专门的R包来解决.线性规划与整数规划的区别主要在于对决策变量的取值约束有所不同. ...
 - QtDesigner第一个程序
			
用QTDesigner设计界面简单多了,而且更加直观.先看下效果图,是不是比我们用代码写的布局要美观多了 制作.ui界面 (1).打开Pycharm的界面设计工具QTDsigner Pycharm-& ...
 - EF Core 使用Azure App Service中的In-App MySQL服务
			
Azure App Service 提供了一个应用内的MySQL,可以供测试.开发使用. 前提条件是需要使用Windows的操作系统. 创建完App Server 之后,只需要在设置下开启 MySQL ...