2021/06/27(日) [n年前の日記]
#1 [love2d] love2dで動画ファイルを再生してみる
2Dゲームエンジン love2d は Theora and Vorbisフォーマット(拡張子 .ogv)の動画を再生できるらしい。試してみた。
動作確認環境は Windows10 x64 20H2 + love2d 11.3。
こんな感じになった。
ソースは以下。
_main.lua
_conf.lua
使用画像、使用動画ファイルは以下。CC0 / Public Domain ってことで。
_bg.ogv
_enemy11_96x96.png
念のため、ソース、画像、動画ファイルを zip にまとめて置いときます。
_play_video.zip
動作確認環境は Windows10 x64 20H2 + love2d 11.3。
こんな感じになった。
- 起動後、Pキーを押すと動画の再生が始まる。
- カーソルキーで、手前に表示しているスプライトを動かせる。
ソースは以下。
_main.lua
function love.load() scrw = love.graphics.getWidth() scrh = love.graphics.getHeight() -- load video(.ogv) video = love.graphics.newVideo("bg.ogv") -- video:play() -- video:pause() videostep = 0 -- init sprite player = {} player.img = love.graphics.newImage("enemy11_96x96.png") player.x = scrw / 2 player.y = scrh / 2 player.spd = scrw / 3 player.update = function(self, dt) if love.keyboard.isDown("left") then self.x = self.x - self.spd * dt elseif love.keyboard.isDown("right") then self.x = self.x + self.spd * dt end if love.keyboard.isDown("up") then self.y = self.y - self.spd * dt elseif love.keyboard.isDown("down") then self.y = self.y + self.spd * dt end end player.draw = function(self) local ox = self.img:getWidth() / 2 local oy = self.img:getHeight() / 2 love.graphics.setColor(1,1,1,1) love.graphics.draw(self.img, self.x - ox, self.y - oy) end end function love.update(dt) if videostep == 1 then -- play video video:play() videostep = 2 elseif videostep == 2 then if not video:isPlaying() then -- loop play video:rewind() video:play() end end player:update(dt) end function love.draw() -- canvas clear love.graphics.clear(0, 0, 0, 1) -- draw video love.graphics.setColor(1, 1, 1, 1) love.graphics.draw(video, 0, 0) -- draw sprite player:draw() -- draw text love.graphics.setColor(1, 1, 1, 1) love.graphics.print("ESC to exit.", 8, 4) love.graphics.print("P : movie play", 8, 20) end function love.keypressed(key, scancode, isrepeat) if key == "escape" then love.event.quit() elseif key == "p" then if videostep == 0 then videostep = 1 end end end
_conf.lua
function love.conf(t) t.window.width = 1280 t.window.height = 720 t.window.title = "Play Video Sample" t.window.fullscreen = false -- t.window.fullscreentype = "exclusive" end
使用画像、使用動画ファイルは以下。CC0 / Public Domain ってことで。
_bg.ogv
_enemy11_96x96.png
念のため、ソース、画像、動画ファイルを zip にまとめて置いときます。
_play_video.zip
◎ 解説。 :
公式ドキュメントを見れば分かるとは思うけど…。
_love.graphics.newVideo - LOVE
_Video:play - LOVE
_Video:isPlaying - LOVE
_Video:rewind - LOVE
ちなみに、.ogv は ffmpeg で作れる。
_ffmpegでogvに変換
ただ、今回、1秒程度の .ogv をループ再生してみたものの、ループするタイミングで見た目が滑らかに繋がってないのが問題ではあるなと…。
love.update(dt) の中でループ再生処理をしていて…。「再生してないということは、再生が終了したのだろう。即巻き戻して再生せよ」てな感じで処理させてるけど…。「もしや、最後のフレームをまだ表示してないのに巻き戻して再生しちゃってるのでは?」と想像して、ループ再生開始のタイミングを1フレーム(?)遅らせるよう試したりもしたのだけど、それでも滑らかにループ再生されなくて。
このあたり、解決策があるのかどうか分からんなと…。
_love.graphics.newVideo - LOVE
_Video:play - LOVE
_Video:isPlaying - LOVE
_Video:rewind - LOVE
- video = love.graphics.newVideo( "hoge.ogv" ) で動画ファイル(.ogv) を読み込み。
- video:play() で再生開始。
- video:isPlaying() で再生中かどうかチェック。再生中なら true が返る。
- video:rewind() で先頭まで巻き戻し。
ちなみに、.ogv は ffmpeg で作れる。
_ffmpegでogvに変換
ただ、今回、1秒程度の .ogv をループ再生してみたものの、ループするタイミングで見た目が滑らかに繋がってないのが問題ではあるなと…。
love.update(dt) の中でループ再生処理をしていて…。「再生してないということは、再生が終了したのだろう。即巻き戻して再生せよ」てな感じで処理させてるけど…。「もしや、最後のフレームをまだ表示してないのに巻き戻して再生しちゃってるのでは?」と想像して、ループ再生開始のタイミングを1フレーム(?)遅らせるよう試したりもしたのだけど、それでも滑らかにループ再生されなくて。
このあたり、解決策があるのかどうか分からんなと…。
◎ 使い道で悩む。 :
でもまあ、とりあえず、動画を再生しつつ、その手前に任意のスプライトを描画して処理することが可能、ということは分った。
こういうことができるのであれば、もしかして MEGA-CD版シルフィードみたいなモノも作れるのではないか、と夢想したところで気がついた。今はもうスマホですらリアルタイムに3DCG描画している時代なのにお前は一体何を言っているのか、みたいな。 *1
考えてみたら…。2Dゲームの中で動画が再生できたとして、それってどういう使い道があるのだろうなと…。立体的な空間の中をウロウロする系のソレを作りたかったら最初から3DCGゲームとして作ればいいのだし。
アレかな。アラビアンファイトのボム攻撃みたいなソレで使える、とか…。
_アラビアンファイト | ゲーセン店員の懐古主義で行こう
いや、他にも何か使い道があったりするんじゃないのか。自分はちょっと思いつかないけど。
こういうことができるのであれば、もしかして MEGA-CD版シルフィードみたいなモノも作れるのではないか、と夢想したところで気がついた。今はもうスマホですらリアルタイムに3DCG描画している時代なのにお前は一体何を言っているのか、みたいな。 *1
考えてみたら…。2Dゲームの中で動画が再生できたとして、それってどういう使い道があるのだろうなと…。立体的な空間の中をウロウロする系のソレを作りたかったら最初から3DCGゲームとして作ればいいのだし。
アレかな。アラビアンファイトのボム攻撃みたいなソレで使える、とか…。
_アラビアンファイト | ゲーセン店員の懐古主義で行こう
いや、他にも何か使い道があったりするんじゃないのか。自分はちょっと思いつかないけど。
*1: そもそもシルフィードも、PS2版はリアルタイムに3DCGを描画して動いてたわけで…。昔、ゲームの背景を動画にしていたのは、低スペックなハードウェアしかなかったから、だよなあ…。
[ ツッコむ ]
以上、1 日分です。