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文件。的更多相关文章

  1. switch结构2016/03/08

    Switch  03/08 一.结构 switch(){  case *: ;break;……default: ;brek;} 练习:输入一个日期,判断这一年第几天? Console.Write(&q ...

  2. http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html

    http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html

  3. ant 介绍 http://blog.csdn.net/sunjavaduke/archive/2007/03/08/1523819.aspx

    转自: 本内容包含了Ant的历史简要介绍,Ant的功能以及Ant框架的介绍,并对下载安装使用Ant进行了示例介绍,同时通过一个Java程序讲解了Ant的基本使用方法. 1.       Ant简介:这 ...

  4. 使用ffmpeg获取视频流后如何封装存储成mp4文件

    int main(int argc,char *argv[]) 02 { 03  AVFormatContext *pFormatCtx; 04  int i,videoStream; 05  AVC ...

  5. 引用AForge.video.ffmpeg,打开时会报错:找不到指定的模块,需要把发行包第三方文件externals\ffmpeg\bin里的dll文件拷到windows的system32文件夹下。

    引用AForge.video.ffmpeg,打开时会报错:找不到指定的模块,需要把发行包第三方文件externals\ffmpeg\bin里的dll文件拷到windows的system32文件夹下. ...

  6. 需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP

    需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP 需求:过滤下面这个网页里共723行 校对中里 行数为两位数 ...

  7. [Weekly] 2014.03.01-2014.03.08

    这周写过好多东西,虽然还没有完全弄明白线段树,但是progress还是有的! 不过有时候真的很想哭,因为自己的梦想连别人看看韩剧.无所事事还要分量轻,实在不明白政治课的Teamwork意义何在,花两分 ...

  8. 打开自定义链接新窗口(safari JS prompt的坑!)2016.03.08

    很简单的一个小练习,但做的过程中发现safari的一个坑,使用prompt()方法的时候,点击取消和不输入一样,会返回空字符' ',而不是null! 要求: 制作新按钮,"新窗口打开网站&q ...

  9. 2018/03/08 每日一个Linux命令 之 chattr/lsattr

    每日一个Linux命令 2018-03-08 Linux 命令 chattr/lsattr chattr [-参数] [+/-属性] [文件或者目录] 经过今天没有对铃,粥熬糊了,我就知道...... ...

  10. 2018/03/08 每日一学PHP 之 常量defind 和 const区别

    常量defind 和 const区别 什么是常量? 如字面理解的,在脚本执行期间不可改变的的量. 定义一个常量应该注意的事项? 1:常量默认大小写敏感,错误的大小写不会被识别为常量. 2:常量只能是标 ...

随机推荐

  1. mysql 设置查询超时配置

    mysql设置查询超时 mysql5.6: max_statement_time (毫秒) mysql5.7: max_execution_time(毫秒) mariadb: max_statemen ...

  2. Python第一次作业(20220909)

    实例01:根据身高.体重计算BMI指数 ①:分别定义两个变量"height"和"weight",用于储存身高(单位:米)和体重(单位:千克).使用内置的prin ...

  3. appium之手机操作的方法

    Appium内置方法,来操作手机.在做app自动化时,可以内置方法的基本上,对一些常用的手机操作进行方法的封装. 常用的方法有: 获取手机分辨率: driver.get_window(size) # ...

  4. element表格样式的修改

    修改表格头部背景 .el-table th{ background: #f00; } 修改表格行背景 .el-table tr{ background: #f00; } 修改斑马线表格的背景 .el- ...

  5. 问道Golang,6月龄必知必会(二)

    在我看来,golnag有许多反直观的设计,而且这些设计通常不能自圆其说,导致gohper一而再再而三的调入陷阱. 网上也有很多gohper总结了一些笔记,我再提炼精简一下,挂在脑图树上便于记忆. 值类 ...

  6. 基于声网 Flutter SDK 实现多人视频通话

    前言 本文是由声网社区的开发者"小猿"撰写的Flutter基础教程系列中的第一篇.本文除了讲述实现多人视频通话的过程,还有一些 Flutter 开发方面的知识点.该系列将基于声网 ...

  7. 基于 Agora SDK 实现 Windows 端的一对一视频通话(基于3.6.2版本)

    前提条件 Microsoft Visual Studio 2019 或以上版本 支持 Windows 7 或以上版本的 Windows 设备 有效的 Agora 账户(免费注册) 注:如果你的网络环境 ...

  8. Error:(x,x) java: 程序包com.xxx.xxx不存在

    [问题描述]:项目为SpringBoot 项目多个 module依赖,对子模块进行 compile/install 时出现了依赖的类(此类是自己写的类)不存在.

  9. Java面试——缓存

    一.什么是缓存 [1]缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存中查询数据,有则直接执行,不存在时从磁盘中获取.由于缓存的数据比磁盘快的多,所以缓存的作用就是帮 ...

  10. Facebook 的 Thrift

    更多内容,前往个人博客 Thrift 源于 Facebook,在 2007 年 Facebook 将 Thrift 作为一个开源项目提交给了 Apache 基金会.对于当时的 Facebook 来说, ...