mieki256's diary



2021/06/27() [n年前の日記]

#1 [love2d] love2dで動画ファイルを再生してみる

2Dゲームエンジン love2d は Theora and Vorbisフォーマット(拡張子 .ogv)の動画を再生できるらしい。試してみた。

動作確認環境は Windows10 x64 20H2 + love2d 11.3。

こんな感じになった。




ソースは以下。

_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

  • 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ゲームとして作ればいいのだし。

アレかな。アラビアンファイトのボム攻撃みたいなソレで使える、とか…。

_アラビアンファイト | ゲーセン店員の懐古主義で行こう

いや、他にも何か使い道があったりするんじゃないのか。自分はちょっと思いつかないけど。

*1: そもそもシルフィードも、PS2版はリアルタイムに3DCGを描画して動いてたわけで…。昔、ゲームの背景を動画にしていたのは、低スペックなハードウェアしかなかったから、だよなあ…。

以上です。

過去ログ表示

Prev - 2021/06 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project