2023-02-17:sdl是跨平台的多媒体开发库,请问用go语言如何调用?
2023-02-17:sdl是跨平台的多媒体开发库,请问用go语言如何调用?
答案2023-02-17:
用 github.com/moonfdd/sdl2-go 这个库。
这是我自己写的golang绑定sdl库,只依赖动态链接库,不依赖头文件,接口全部是按照头文件改过来的。
最好用sdl2里的接口,sdl3里的接口,运行有问题。
示例代码如下:
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()
}

2023-02-17:sdl是跨平台的多媒体开发库,请问用go语言如何调用?的更多相关文章
- 多媒体开发库 之 SDL 详解
SDL 简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开发者只要用相同或是相似的 ...
- 使用SWT技术的跨平台移动应用开发库Tabris
1. http://developer.eclipsesource.com/tabris/ 2. 多平台.原生程序级别的性能 3. 开源/教育性的项目免费,意思就是商业项目收费 4. 目标,让懂jav ...
- [转]强悍的跨平台开源多媒体中心XBMC介绍
[转]强悍的跨平台开源多媒体中心XBMC介绍 http://www.cnblogs.com/mythou/p/3220898.html 最近都在了解Android下的音视频,因为最近需要做一个多媒体中 ...
- 强悍的跨平台开源多媒体中心XBMC介绍
强悍的跨平台开源多媒体中心XBMC介绍 最近都在了解Android下的音视频,因为最近需要做一个多媒体中心的APP,其中了解了一个开源项目XMBC,一个十分强大的开源多媒体中心,而且可以应用在多个平台 ...
- LiveVideoStack Meet|深圳 多媒体开发新趋势
2018年初始,音视频技术生态并不平静,Codec争夺愈加激烈,新一代标准的挑战一浪高过一浪:WebRTC的定版也为打通浏览器.移动端乃至IoT带来了机会:此外AI.区块链技术的兴起,催化着与多媒体领 ...
- [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP
前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. 关注订阅号:TongeBlog ,查看移动端跨平台 ...
- juce: 跨平台的C++用户界面库
如果你用过QT和MFC,那你必然知道QT是基于C++的跨平台库,而MFC是微软针对widows平台推出来基础类库.且不论MFC的设计如何,从我个人和身边朋友的经历来看,MFC是一些非常难以理解的类的组 ...
- 跨平台的C++应用和UI开发库 QT
跨平台的C++应用和UI开发库 QT 运行环境: 授权方式:BSD 软件大小:M 下载量:3912 更新日期:2012-04-05 来源地址: 联系作者:Linux Qt是诺基亚开发的一个跨平 ...
- 移动跨平台开发框架Ionic开发一个新闻阅读APP
移动跨平台开发框架Ionic开发一个新闻阅读APP 前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. ...
- Unity3D ——强大的跨平台3D游戏开发工具(六)
第十一章 制作炮台的旋转 大家知道,炮台需要向四周不同的角度发射炮弹,这就需要我们将炮台设置成为会旋转的物体,接下来我们就一起制作一个会旋转的炮台. 第一步:给炮台的炮筒添加旋转函数. 给炮台的炮筒部 ...
随机推荐
- 后端008_配置Security登录授权过滤器
------------恢复内容开始------------ 现在我们就可以去进行springscurity的配置了.首先我们新建一个配置类.然后该类需要添加@Configuration注解,然后还要 ...
- learning rate,exponential decay
(96条消息) Python函数:学习率衰减 tf.train.exponential_decay()_萌萌哒huo的博客-CSDN博客_python 衰减函数 ln即学习率(learning rat ...
- linux虚拟机设置网络显示NetworkManager need to be running
问题描述:在设置一台centOS7虚拟机的网络时出现: 解决方法: 命令行重启NetworkManager systemctl restart NetworkManager 刷新一次就好了
- Android笔记--监听短信内容
监听短信内容 就比如说是在我们用一个软件需要使用"获取验证码"的功能时,能够跟短信的验证码互通,实现较为完整的登录功能: 监听短信内容主要是利用了contentObserver实现 ...
- Android笔记--Application
Application生命周期 在APP运行过程中有且仅有一个Application对象贯穿整个生命周期 Application全局变量 实例化: 声明全局变量:
- 继续Vue的探索
接上集 上次到了想要利用Vue实现隔行变色的请求,但是由于使用的代码过于"高级"导致无法识别,这就需要利用webpack来解决它! webpack的基本使用 1.首先,在项目中安装 ...
- java选择结构-if
java选择结构-if if单选泽结构 if双选择结构 if多选择结构 if嵌套结构 package charpter2; import com.sun.xml.internal.ws.address ...
- 30张图说清楚 TCP 协议
大家好,我是风筝 前两天分享了 20张图说清楚 IP 协议 今天,继续来网管的自我修养之TCP协议,这可是除 IP 协议外另一个核心协议了. TCP 协议是网络传输中至关重要的一个协议,它位于传输层. ...
- php in_array 遍历,in_array大数组查询性能问题
问题最近在实现一个项目接口的时候发现当数组过大的时候,数据返回的速度有点慢.接口数据返回最长反应时间2s,经过反复调试发现代码段耗时最长的部分在in_array()函数.解决过程在stackoverf ...
- gulp中解决es5转es6的方法
1:安装配置文件: cnpm i gulp-babel@7 babel-core -D (@7是因为要使 "gulp-babel": "^7.0.1" 与&q ...