2023-03-07:x264的视频编码器,不用ffmpeg,用libx264.dll也行。请用go语言调用libx264.dll,将yuv文件编码成h264文件。
2023-03-07:x264的视频编码器,不用ffmpeg,用libx264.dll也行。请用go语言调用libx264.dll,将yuv文件编码成h264文件。
答案2023-03-07:
使用 github.com/moonfdd/x264-go 库,代码写在了这个库里。
这个库根据头文件编写,不依赖头文件。
执行命令:
go run ./examples/simplest_x264_encoder/main.go
参考了雷霄骅的基于libx264的视频编码器,代码用golang编写。代码如下:
// https://github.com/leixiaohua1020/simplest_encoder/blob/master/simplest_x264_encoder/simplest_x264_encoder.cpp
package main
import (
"fmt"
"os"
"unsafe"
"github.com/moonfdd/ffmpeg-go/ffcommon"
"github.com/moonfdd/x264-go/libx264"
"github.com/moonfdd/x264-go/libx264common"
)
func main0() ffcommon.FInt {
var ret ffcommon.FInt
var y_size ffcommon.FInt
var i, j ffcommon.FInt
//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.h264"
fp_dst, _ := os.Create(fp_dst_file)
//Encode 50 frame
//if set 0, encode all frame
var frame_num ffcommon.FInt = 0
var csp ffcommon.FInt = libx264.X264_CSP_I420
var width, height ffcommon.FInt = 640, 360
var iNal ffcommon.FInt = 0
var pNals *libx264.X264NalT
var pHandle *libx264.X264T
pPic_in := new(libx264.X264PictureT)
pPic_out := new(libx264.X264PictureT)
pParam := new(libx264.X264ParamT)
//Check
if fp_src == nil || fp_dst == nil {
fmt.Printf("Error open files.\n")
return -1
}
pParam.X264ParamDefault()
pParam.IWidth = width
pParam.IHeight = height
/*
//Param
pParam->i_log_level = X264_LOG_DEBUG;
pParam->i_threads = X264_SYNC_LOOKAHEAD_AUTO;
pParam->i_frame_total = 0;
pParam->i_keyint_max = 10;
pParam->i_bframe = 5;
pParam->b_open_gop = 0;
pParam->i_bframe_pyramid = 0;
pParam->rc.i_qp_constant=0;
pParam->rc.i_qp_max=0;
pParam->rc.i_qp_min=0;
pParam->i_bframe_adaptive = X264_B_ADAPT_TRELLIS;
pParam->i_fps_den = 1;
pParam->i_fps_num = 25;
pParam->i_timebase_den = pParam->i_fps_num;
pParam->i_timebase_num = pParam->i_fps_den;
*/
pParam.ICsp = csp
pParam.X264ParamApplyProfile(libx264.X264ProfileNames[5])
pHandle = pParam.X264EncoderOpen164()
pPic_out.X264PictureInit()
pPic_in.X264PictureAlloc(csp, pParam.IWidth, pParam.IHeight)
//ret = x264_encoder_headers(pHandle, &pNals, &iNal);
y_size = pParam.IWidth * pParam.IHeight
//detect frame number
if frame_num == 0 {
fi, _ := fp_src.Stat()
switch csp {
case libx264.X264_CSP_I444:
frame_num = int32(fi.Size()) / (y_size * 3)
case libx264.X264_CSP_I420:
frame_num = int32(fi.Size()) / (y_size * 3 / 2)
default:
fmt.Printf("Colorspace Not Support.\n")
return -1
}
}
//Loop to Encode
for i = 0; i < frame_num; i++ {
switch csp {
case libx264.X264_CSP_I444:
fp_src.Read(ffcommon.ByteSliceFromByteP(pPic_in.Img.Plane[0], int(y_size))) //Y
fp_src.Read(ffcommon.ByteSliceFromByteP(pPic_in.Img.Plane[1], int(y_size))) //U
fp_src.Read(ffcommon.ByteSliceFromByteP(pPic_in.Img.Plane[2], int(y_size))) //V
case libx264.X264_CSP_I420:
fp_src.Read(ffcommon.ByteSliceFromByteP(pPic_in.Img.Plane[0], int(y_size))) //Y
fp_src.Read(ffcommon.ByteSliceFromByteP(pPic_in.Img.Plane[1], int(y_size/4))) //U
fp_src.Read(ffcommon.ByteSliceFromByteP(pPic_in.Img.Plane[2], int(y_size/4))) //V
default:
fmt.Printf("Colorspace Not Support.\n")
return -1
}
pPic_in.IPts = int64(i)
ret = pHandle.X264EncoderEncode(&pNals, &iNal, pPic_in, pPic_out)
if ret < 0 {
fmt.Printf("Error.\n")
return -1
}
fmt.Printf("Succeed encode frame: %5d\n", i)
for j = 0; j < iNal; j++ {
a := unsafe.Sizeof(libx264.X264NalT{})
pNal := (*libx264.X264NalT)(unsafe.Pointer(uintptr(unsafe.Pointer(pNals)) + uintptr(a*uintptr(j))))
fp_dst.Write(ffcommon.ByteSliceFromByteP(pNal.PPayload, int(pNal.IPayload)))
}
}
i = 0
//flush encoder
for {
ret = pHandle.X264EncoderEncode(&pNals, &iNal, nil, pPic_out)
if ret == 0 {
break
}
fmt.Printf("Flush 1 frame.\n")
for j = 0; j < iNal; j++ {
a := unsafe.Sizeof(libx264.X264NalT{})
pNal := (*libx264.X264NalT)(unsafe.Pointer(uintptr(unsafe.Pointer(pNals)) + uintptr(a*uintptr(j))))
fp_dst.Write(ffcommon.ByteSliceFromByteP(pNal.PPayload, int(pNal.IPayload)))
}
i++
}
pPic_in.X264PictureClean()
pHandle.X264EncoderClose()
pHandle = nil
fp_src.Close()
fp_dst.Close()
fmt.Printf("\nffplay %s\n", fp_dst_file)
return 0
}
func main() {
fmt.Println(libx264.X264_POINTVER)
os.Setenv("Path", os.Getenv("Path")+";./lib")
libx264common.SetLibx264Path("./lib/libx264-164.dll")
main0()
}


2023-03-07:x264的视频编码器,不用ffmpeg,用libx264.dll也行。请用go语言调用libx264.dll,将yuv文件编码成h264文件。的更多相关文章
- C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- NPOI 导入导出excel 支持 03 07
因为微软的office成本太高了,所以开发项目的时候电脑上没安装office,而是安装了wps.但开发语言用的是C#,所以直接调用微软的office组件是很方便的,但一方面慢,一方面成本高,所以从网上 ...
- 原!操作 excel 03/07
参考 所用jar包: poi-3.11.jar poi-ooxml-3.11.jar poi-ooxml-schemas-3.11.jar /* * Project: fusion-may-open- ...
- 使用ffmpeg获取视频流后如何封装存储成mp4文件
int main(int argc,char *argv[]) 02 { 03 AVFormatContext *pFormatCtx; 04 int i,videoStream; 05 AVC ...
- [X264] MinGW编译x264,VC中调用libx264.dll-------------<参考转>
1. 下载并按照MinGW,最好就缺省按照 http://sourceforge.net/projects/ ... ler/mingw-get-inst/ 把C:\MinGW\bin添加 ...
- 引用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行 校对中里 行数为两位数 ...
- 2018/03/07 每日一个Linux命令 之 cat
每日一个Linux命令 2018-03-07 Linux 命令 cat cat [-参数] fileName 在之前的Linux使用中 cat 命令一直作为文本输出指令来使用,很少可以深入学习的该命令 ...
- 2020软件工程作业01 Deadline: 2020/03/07 20:00pm
1.建立博客 https://github.com/smithLIUandhisbaby 20177572 https://www.cnblogs.com/smith324/ 2.回顾——我的初心 对 ...
- x264 n-th pass编码时候Stats文件的含义
x264 n-th pass(一般是2pass)编码时所用的文件包括下述x264参数生成.stats文件 options: 1280x816 fps=2997/125 timebase=125/299 ...
随机推荐
- windows监控web程序连接数
运行: win+R->perfmon.msc 右键,添加计数器 选择webservice中的current connection选项,再选中对应实例即可~
- avx
编译选项: CXXFLAGS += -mavx2 #include <immintrin.h> #include <cmath> void reset_xy(int *x, i ...
- MyCat中间件的坑
首先说一下为什么选择MyCat,mysql分表分库的工具还有sharding-jdbc,是jar包的形式集成到项目的,可以相对灵活的配置自定义分片策略(PS:其实大部分业务场景是分片策略越简单越好啊, ...
- mysql5.7主从搭建过程
1.下载程序包 mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz ,解压至/opt/app/mysql2.配置/etc/my.cnf[mysql]socket=/o ...
- Windows 下TCP长连接保持连接状态TCP keepalive设置
TCP长连接建立完成后,我们通常需要检测网络的连接状态,以反馈给客户做响应的处理.通过设置TCP keepalive的属性,打开socket的keepalive属性,并设置发送底层心跳包的时间间隔.T ...
- SpringBoot3.0 + SpringSecurity6.0+JWT
JWT_SpringSecurity SpringBoot3.0 + SpringSecurity6.0+JWT Spring Security 是 Spring 家族中的一个安全管理框架. 一般We ...
- SpringBoot笔记--自动配置(高级内容)(中集)
@Enable*注解 使用该注解,需要导入相应的依赖坐标,其中的groupId标签里面写入Bean的Java文件所在的包的路径下面 spring-enable-other 还需要在SpringBoot ...
- Javaweb学习笔记第六弹
本章节的存在意义是:学到PreparedStatement反应较慢,理解不透彻,来做个比较,加深印象 详细讲述PrepareStatement 与 Statement 连接数据库的部分区别 在我学习的 ...
- Markdown合并单元格
参考博客:https://blog.csdn.net/qq_32042527/article/details/88084130
- JS中我们为什么要new个实例而不直接执行
正常情况:<script> function sayHello() { alert("hello") } sayHello();直接调用他 </script> ...