Project1
标题: SINVideo,MPEG Player for RPG Maker [打印本页]
作者: Shy07 时间: 2013-4-22 00:07
标题: SINVideo,MPEG Player for RPG Maker
本帖最后由 Shy07 于 2013-4-22 00:40 编辑
Ace虽说提供了视频播放功能,但是那个毫无互动性可言的播片工具实在是鸡肋。我会告诉你,锅盖娘的默砂开头看得我心里捉急得差点掀桌么。
不过神人总是有的,Syalon 大厨触一拍脑门写出了这个东西。原理是用 DShow 解码视频,然后直接把画面数据复制到 Bitmap 实例的内存区里。这样只要把这个 Bitmap 实例交给 Sprite 就可以做出各种效果了。
然后么,这东西本来是不应该分发的。但是我一个人偷着用也不好意思,而且都已经把代码提交到 SINRGE2 里了,所以还是趁着大半夜的发布到 6R 吧。不过 dll 的源码就不提供了,见谅。
截图和代码就不放了,直接下载范例工程吧
下载地址
作者: 凌童鞋 时间: 2013-4-22 06:30
前排支持,这东西终于面世了←_←……音乐坑可以继续了TAT……
作者: DeathKing 时间: 2013-4-22 14:01
然后直接把画面数据复制到 Bitmap 实例的内存区里
亮点。
作者: yangff 时间: 2013-4-22 17:20
我可以吐槽软解码效率么……
作者: 北极七月熊 时间: 2013-4-22 18:02
看上去很神奇的样子~
作者: 千葉玖濑 时间: 2013-4-22 18:38
前排占桌~
作者: yangff 时间: 2013-4-23 12:28
不支持?不支持再用软解啊……
作者: 当时我就毛了3 时间: 2013-4-23 19:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: viktor 时间: 2013-4-24 12:17
DeathKing 发表于 2013-4-22 14:01
亮点。
楼主请问SinVideo.dll是怎么实现的使用DDraw往RGSSBitmap渲染?
因为在下在考虑这个问题http://rpg.blue/thread-303559-1-1.html
我想看看SinVideo的源码,看看对Shader问题有没有什么帮助{:2_275:}
作者: Shy07 时间: 2013-4-24 14:43
viktor 发表于 2013-4-24 12:17
楼主请问SinVideo.dll是怎么实现的使用DDraw往RGSSBitmap渲染?
因为在下在考虑这个问题http://bbs.66rpg ...
SinVideo 并非用 Shader 实现的,而是直接拿 RGSSBitmap 的内存区作为视频播放的缓冲区。
class ::Bitmap
# API
@@RtlMoveMemory_pl = Win32API.new('kernel32', 'RtlMoveMemory', 'pll', 'l')
@@RtlMoveMemory_lp = Win32API.new('kernel32', 'RtlMoveMemory', 'lpl', 'l')
def _dump(limit)
data = "rgba" * width * height
@@RtlMoveMemory_pl.call(data, address, data.length)
[width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # compress
end
def self._load(str)
w, h, zdata = str.unpack("LLa*")
bmp = new(w, h)
@@RtlMoveMemory_lp.call(bmp.address, Zlib::Inflate.inflate(zdata), w * h * 4)
return bmp
end
# [[[bitmap.object_id * 2 + 16] + 8] + 16] == header
def address
buffer, ad = "rgba", object_id * 2 + 16
@@RtlMoveMemory_pl.call(buffer, ad, 4)
ad = buffer.unpack("L")[0] + 8
@@RtlMoveMemory_pl.call(buffer, ad, 4)
ad = buffer.unpack("L")[0] + 16
@@RtlMoveMemory_pl.call(buffer, ad, 4)
return buffer.unpack("L")[0]
end
end
class ::Bitmap
# API
@@RtlMoveMemory_pl = Win32API.new('kernel32', 'RtlMoveMemory', 'pll', 'l')
@@RtlMoveMemory_lp = Win32API.new('kernel32', 'RtlMoveMemory', 'lpl', 'l')
def _dump(limit)
data = "rgba" * width * height
@@RtlMoveMemory_pl.call(data, address, data.length)
[width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # compress
end
def self._load(str)
w, h, zdata = str.unpack("LLa*")
bmp = new(w, h)
@@RtlMoveMemory_lp.call(bmp.address, Zlib::Inflate.inflate(zdata), w * h * 4)
return bmp
end
# [[[bitmap.object_id * 2 + 16] + 8] + 16] == header
def address
buffer, ad = "rgba", object_id * 2 + 16
@@RtlMoveMemory_pl.call(buffer, ad, 4)
ad = buffer.unpack("L")[0] + 8
@@RtlMoveMemory_pl.call(buffer, ad, 4)
ad = buffer.unpack("L")[0] + 16
@@RtlMoveMemory_pl.call(buffer, ad, 4)
return buffer.unpack("L")[0]
end
end
这个是关键,先获得 Bitmap 的数据区地址,然后 DShow 解码视频- GetCurrentBuffer(&rgssBitmapAddress, NULL)
复制代码 仅此而已。
因为某些原因不能直接公布源码,不过你可以看看这个:
https://github.com/Shy07/SINRGE2/blob/develop/SINRGE2%20Core/sin_video.cpp
和 SinVideo.dll 区别仅在于把 RGSSBitmap 换成了 HTEXTURE。
作者: 北极七月熊 时间: 2013-4-25 20:09
请问怎么在事件中播放视频呢?
作者: 上网本批发i 时间: 2013-4-26 15:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: Sylvania 时间: 2013-4-26 19:40
北极七月熊 发表于 2013-4-25 20:09
请问怎么在事件中播放视频呢?
找到Scene_Base里的
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
update_basic
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
update_basic
end
添加一句
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
update_basic
SIN::SPRITE.update
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
update_basic
SIN::SPRITE.update
end
然后在事件的脚本里用SIN::SPRITE.play播放
但这也只能播放而已,要活用这个dll,会一点脚本是必需的
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |