首页 > 其他分享 >go使用SDL例子

go使用SDL例子

时间:2024-12-20 16:11:40浏览次数:4  
标签:width frame len sdl SDL 例子 video go

package main

import (
	"fmt"
	"io/ioutil"
	"time"
	"unsafe"

	sdl "github.com/moonfdd/sdl2-go/sdl2"
	"github.com/moonfdd/sdl2-go/sdlcommon"
)

const REFRESH_EVENT = sdl.SDL_USEREVENT + 1 // 请求画面刷新事件
const QUIT_EVENT = sdl.SDL_USEREVENT + 2    // 退出事件
// 定义分辨率
// YUV像素分辨率
const YUV_WIDTH = 320
const YUV_HEIGHT = 240

// 定义YUV格式
const YUV_FORMAT = sdl.SDL_PIXELFORMAT_IYUV

var s_thread_exit = 0 // 退出标志 = 1则退出

func main() {
	sdlcommon.SetSDL2Path("SDL2.0.16.dll")
	sdl.SDL_Init(sdl.SDL_INIT_VIDEO)
	pixformat := YUV_FORMAT
	// 分辨率
	// 1. YUV的分辨率
	video_width := int32(YUV_WIDTH)
	video_height := int32(YUV_HEIGHT)
	// 2.显示窗口的分辨率
	win_width := int32(YUV_WIDTH)
	win_height := int32(YUV_WIDTH)

	y_frame_len := video_width * video_height
	u_frame_len := video_width * video_height / 4
	v_frame_len := video_width * video_height / 4
	yuv_frame_len := y_frame_len + u_frame_len + v_frame_len

	window := sdl.SDL_CreateWindow("微信公众号:福大大架构师每日一题", sdl.SDL_WINDOWPOS_UNDEFINED, sdl.SDL_WINDOWPOS_UNDEFINED, video_width, video_height, sdl.SDL_WINDOW_OPENGL|sdl.SDL_WINDOW_RESIZABLE)
	if window == nil {
		fmt.Printf("Can't create window, err:%s", sdl.SDL_GetError())
		return
	}
	renderer := window.SDL_CreateRenderer(-1, 0)
	texture := renderer.SDL_CreateTexture(uint32(pixformat), sdl.SDL_TEXTUREACCESS_STREAMING, video_width, video_height)
	var event sdl.SDL_Event
	var rect sdl.SDL_Rect
	fileData, err := ioutil.ReadFile("yuv420p_320x240.yuv")
	if err != nil {
		fmt.Println("读取文件失败", err)
		return
	}
	//创建请求刷新线程
	go func() {
		for s_thread_exit == 0 {
			var event sdl.SDL_Event
			event.Type = REFRESH_EVENT
			event.SDL_PushEvent()
			time.Sleep(40 * time.Millisecond)
		}
		s_thread_exit = 0
		var event sdl.SDL_Event
		event.Type = QUIT_EVENT
		event.SDL_PushEvent()
	}()

	for {
		// 收取SDL系统里面的事件
		event.SDL_WaitEvent()
		if event.Type == REFRESH_EVENT { // 画面刷新事件
			if len(fileData) < int(yuv_frame_len) {
				break
			}
			video_buf := fileData[0:yuv_frame_len]
			for i := y_frame_len; i < yuv_frame_len; i++ {
				video_buf[i] = 128 //彩色变黑白
			}
			fileData = fileData[yuv_frame_len:]
			// 设置纹理的数据 video_width = 320, plane
			texture.SDL_UpdateTexture(nil, uintptr(unsafe.Pointer(&video_buf[0])), video_width)
			// 显示区域,可以通过修改w和h进行缩放
			rect.X = 0
			rect.Y = 0
			//w_ratio := win_width * 1.0 / video_width
			//h_ratio := win_height * 1.0 / video_height
			//320x240 怎么保持原视频的宽高比例
			//rect.W = video_width * w_ratio
			//rect.H = video_height * h_ratio
			rect.W = win_width
			rect.H = win_height

			// 清除当前显示
			renderer.SDL_RenderClear()
			// 将纹理的数据拷贝给渲染器
			renderer.SDL_RenderCopy(texture, nil, &rect)
			// 显示
			renderer.SDL_RenderPresent()

		} else if event.Type == sdl.SDL_WINDOWEVENT {
			window.SDL_GetWindowSize(&win_width, &win_height)
		} else if event.Type == sdl.SDL_QUIT {
			s_thread_exit = 1
		} else if event.Type == QUIT_EVENT {
			break
		}
	}
	texture.SDL_DestroyTexture()
	renderer.SDL_DestroyRenderer()
	window.SDL_DestroyWindow()
	sdl.SDL_Quit()
}

  

标签:width,frame,len,sdl,SDL,例子,video,go
From: https://www.cnblogs.com/xiongwei/p/18619470

相关文章

  • Go使用zap和lumberjack库,实现每小时间轮转日志文件
    创建一个文件夹,命名为 loggerDemo打开这个文件夹打开终端,点击左下角叉和感叹号在弹出的窗口中点击TERMINAL进入终端(也可以使用快捷键CTRL+` 直接打开) 初始化Go的ModulegomodinitloggerDemo点击文件创建图标创建文件创建一个名为main.go的文件,按下回车......
  • 「SP14887」 GOODA
    题意给定一个 \(n\) 个点 \(m\) 条边的有向图,每个点都有点权,求一条从 \(S\) 到 \(E\) 的路径,使路径经过的点权值之和最大。可以多次经过一条边或者一个点,但每个点的权值最多计算一次。分析和P3387很像。对原图缩点后得到一张DAG,然后在图上跑类似最短路,实际是拓扑......
  • golang单元测试和mock框架的介绍和推荐
    背景介绍:探索golang的单元测试框架,看一下哪种框架是结合业务体验更好的。推荐和不推荐使用的框架,我都会在标题中标注出来,没有标注的表示体验一般,但也没有特别的缺点,观望态度单元测试框架介绍原生testing示例funcTestModifyArr(t*testing.T){ arr:=[3]int{0,1,2}......
  • Python旅游信息管理系统v7c4w(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍旅游信息管理系统的现状来进行开发的,具体根据现实的需求来实现旅游信息管理系统网络......
  • Python古玩玉器藏品交易系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍实现了一个古玩玉器交易系统。古玩玉器交易系统的主要用户分为用户、管理员。管理员......
  • Redis缓存中的 雪崩、穿透、击穿、热点和数据倾斜(详细例子)
    在使用Redis作为缓存时,了解一些常见问题是非常重要的,包括雪崩、穿透、击穿、热点和数据倾斜。以下是详细讲解及示例。1.缓存雪崩定义缓存雪崩是指在某一时刻,大量缓存数据同时过期,导致大量请求直接访问数据库,从而造成数据库的压力骤增,可能导致数据库崩溃。示例假设一个......
  • Django使用openpyxl实现数据的导入与导出
    将序列化后的数据导出成excel格式#导入依赖importiofromopenpyxlimportWorkbook#将格式化的数据导出为excel的方法defoutput_excel(data):#创建Excel工作簿wb=Workbook()ws=wb.activews.title="文件标题"#写入表头headers=......
  • golang中延迟函数调用的知识点
    golang中延迟函数调用的知识点个较大的延迟调用队列可能会消耗很多内存。另外,某些资源可能因为某些调用被延迟的太久而未能被及时释放。比如,如果下面的例子中的函数需要处理大量的文件,则在此函数退出之前,将有大量的文件句柄得不到释放。funcwriteManyFiles(files[]File)er......
  • 5.8K star!基于Go的可视化定时任务管理系统!
    *戳上方蓝字“开源先锋”关注我  推荐阅读: 《12.6Kstar!Shell命令即搞定可视化监控,超级6~~》 《5.6Kstar!再见了DocSend,这款开源项目更不错!》 《4.1Kstar!跨屏操作的神器,流畅丝滑!》 《9.1Kstar!国外大神1:1复刻Win11系统,开源牛逼!》 《2.8Kstar!超强音乐管理......
  • Go 监听8080端口
    创建一个文件夹,命名为 HttpServer2,打开这个文件夹打开终端,点击左下角叉和感叹号在弹出的窗口中点击TERMINAL进入终端(也可以使用快捷键CTRL+` 直接打开) 初始化Go的ModulegomodinitHttpServer2点击文件创建图标创建文件创建一个名为main.go的文件,按下回......