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语言如何调用?的更多相关文章

  1. 多媒体开发库 之 SDL 详解

    SDL 简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开发者只要用相同或是相似的 ...

  2. 使用SWT技术的跨平台移动应用开发库Tabris

    1. http://developer.eclipsesource.com/tabris/ 2. 多平台.原生程序级别的性能 3. 开源/教育性的项目免费,意思就是商业项目收费 4. 目标,让懂jav ...

  3. [转]强悍的跨平台开源多媒体中心XBMC介绍

    [转]强悍的跨平台开源多媒体中心XBMC介绍 http://www.cnblogs.com/mythou/p/3220898.html 最近都在了解Android下的音视频,因为最近需要做一个多媒体中 ...

  4. 强悍的跨平台开源多媒体中心XBMC介绍

    强悍的跨平台开源多媒体中心XBMC介绍 最近都在了解Android下的音视频,因为最近需要做一个多媒体中心的APP,其中了解了一个开源项目XMBC,一个十分强大的开源多媒体中心,而且可以应用在多个平台 ...

  5. LiveVideoStack Meet|深圳 多媒体开发新趋势

    2018年初始,音视频技术生态并不平静,Codec争夺愈加激烈,新一代标准的挑战一浪高过一浪:WebRTC的定版也为打通浏览器.移动端乃至IoT带来了机会:此外AI.区块链技术的兴起,催化着与多媒体领 ...

  6. [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP

    前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. 关注订阅号:TongeBlog ,查看移动端跨平台 ...

  7. juce: 跨平台的C++用户界面库

    如果你用过QT和MFC,那你必然知道QT是基于C++的跨平台库,而MFC是微软针对widows平台推出来基础类库.且不论MFC的设计如何,从我个人和身边朋友的经历来看,MFC是一些非常难以理解的类的组 ...

  8. 跨平台的C++应用和UI开发库 QT

    跨平台的C++应用和UI开发库 QT 运行环境: 授权方式:BSD 软件大小:M 下载量:3912 更新日期:2012-04-05 来源地址: 联系作者:Linux     Qt是诺基亚开发的一个跨平 ...

  9. 移动跨平台开发框架Ionic开发一个新闻阅读APP

    移动跨平台开发框架Ionic开发一个新闻阅读APP 前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. ...

  10. Unity3D ——强大的跨平台3D游戏开发工具(六)

    第十一章 制作炮台的旋转 大家知道,炮台需要向四周不同的角度发射炮弹,这就需要我们将炮台设置成为会旋转的物体,接下来我们就一起制作一个会旋转的炮台. 第一步:给炮台的炮筒添加旋转函数. 给炮台的炮筒部 ...

随机推荐

  1. 动力节点的MySQL的34题目的第7题的我的参考答案

    以下是:薪水的平均等级最低的部门的名称 select t4.t4deptno,t4.t4grade,d1.dname from( ##求出各部门平均等级begin select avg(t3.t3gr ...

  2. Fastboot_Cmd

    /* -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- */adb命令:/* -*-* ...

  3. Go_day04

    Go基础语法 指针 指针式存储另一个变量内存地址的变量 &a 取出a的内存地址 *b 若指针b存放的式a的地址 那么 *b就直接指向a的内存 可以直接操作其中的值 指针的使用 func mai ...

  4. python之pyqt5-第一个pyqt5程序-图像压缩工具-小记

    (如想转载,请联系博主或贴上本博地址) 此为学习pyqt5的第一个程序,图像压缩工具. 因为比较简单,下面直接贴上代码. 效果图如下: # -*- coding: utf-8 -*- import s ...

  5. el-admin角色编辑功能详解

    1.首先el-admin中的编辑和删除功能重新写成为了一个组件 data和permission都是父组件向子组件传参.data传的是当前表格中选中行的这条数据,permission是定义的一个对象. ...

  6. Strus框架

    一.框架概述 1.框架的意义与作用: 所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的经历放到业务需求的分析和理解上面. 特点:封装了很多细节,程序员在使用的时候会非常简单. 2 ...

  7. 归一化,正则化,标准化,dropout的联系与区别

    归一化(Normalization)是指将数据缩放到一定范围内,一般是将数据映射到[0,1]或[-1,1]之间.这样可以避免不同特征的数值差异过大而导致的训练困难,同时也有助于加快梯度下降的收敛速度. ...

  8. Python学习笔记--列表来啦!

    列表的定义格式 示例: 列表的下标索引(千万别超出范围!!!) 示例: 正向和反向 取出嵌套列表的元素:(二维数组) 列表的常用的操作方法 查找某元素的下标 示例: 修改元素 插入元素 示例: 追加元 ...

  9. Mathematica的Combinatorica`程序包使用笔记

    目录 官方给出的程序包使用指南和一些示例 引论 步骤 0x00 导入程序包 0x01 Integer Partitions 0x02 Integer Compositions 0x03 partiti ...

  10. Flink基本概念及架构

    1.基本概念 无界和有界数据.任何类型的数据都可以形成一种事件流.信用卡交易.传感器测量.机器日志.网站或移动应用程序上的用户交互记录,所有这些数据都形成一种流.数据可以被作为 无界 或者 有界 流来 ...