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 的内存区作为视频播放的缓冲区。

RUBY 代码复制
  1. class ::Bitmap
  2.     # API
  3.     @@RtlMoveMemory_pl = Win32API.new('kernel32', 'RtlMoveMemory', 'pll', 'l')
  4.     @@RtlMoveMemory_lp = Win32API.new('kernel32', 'RtlMoveMemory', 'lpl', 'l')
  5.     def _dump(limit)
  6.       data = "rgba" * width * height
  7.       @@RtlMoveMemory_pl.call(data, address, data.length)
  8.       [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # compress
  9.     end
  10.     def self._load(str)
  11.       w, h, zdata = str.unpack("LLa*")
  12.       bmp = new(w, h)
  13.       @@RtlMoveMemory_lp.call(bmp.address, Zlib::Inflate.inflate(zdata), w * h * 4)
  14.       return bmp
  15.     end
  16.     # [[[bitmap.object_id * 2 + 16] + 8] + 16] == header
  17.     def address
  18.       buffer, ad = "rgba", object_id * 2 + 16
  19.       @@RtlMoveMemory_pl.call(buffer, ad, 4)
  20.       ad = buffer.unpack("L")[0] + 8
  21.       @@RtlMoveMemory_pl.call(buffer, ad, 4)
  22.       ad = buffer.unpack("L")[0] + 16
  23.       @@RtlMoveMemory_pl.call(buffer, ad, 4)
  24.       return buffer.unpack("L")[0]
  25.     end
  26.   end


这个是关键,先获得 Bitmap 的数据区地址,然后 DShow 解码视频
  1. 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里的
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 更新画面
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     update_basic
  6.   end

添加一句
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 更新画面
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     update_basic
  6.     SIN::SPRITE.update
  7.   end


然后在事件的脚本里用SIN::SPRITE.play播放
但这也只能播放而已,要活用这个dll,会一点脚本是必需的




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1