Playdate用の動画作成
Playdateで動画を再生するにはpdv形式の動画ファイルと音声ファイルに分割されたものを用意する必要があります。
ここではmac環境でのpdvファイルの生成方法を説明します。
以下のdevforumのスレッドに1bitvideo.app.zip
というファイルがリンク付けられていますのでそちらをダウンロードします。
(※こちらのファイル実行は各個人で判断の上行ってください)
解凍するとappファイルが生成されるのでプライバシーとセキュリティから実行を許可した上で開きます。
以下のようなappのGUIが表示されます。

「Open...」から動画を読み込み、下の設定を操作したあと「Save...」で任意の名前で保存します。
ここではmovie.pdv``movie.aif
で保存しました。
ファイル配置
保存したファイルをプロジェクトファイルに配置します。
myProjectName/
source/
main.lua
Videos/
movie.pdv
movie.aif
動画再生スクリプト
動画再生スクリプトはここではmain.luaに記述します。
import "CoreLibs/object"
import "CoreLibs/graphics"
local disp <const> = playdate.display
local gfx <const> = playdate.graphics
local snd <const> = playdate.sound
local video = gfx.video.new("Videos/movie") -- movie.pdv を読み込む
local audio, loaderr = snd.sampleplayer.new("Videos/movie") -- movie.aif を読み込む
local prevframe = 0
function setUp()
disp.setRefreshRate(0) -- フレームバッファが利用可能になったらplaydate.update()を呼び出すように
-- 音声
if audio ~= nil then
audio:play(0)
else
print("audio error:"..loaderr)
end
-- 動画
video:useScreenContext()
video:renderFrame(0)
end
setUp()
function playdate.update()
if audio:isPlaying() == true then
-- 音声の再生位置から動画のフレーム位置を求める
local frame = math.floor(audio:getOffset() * video:getFrameRate())
if frame ~= prevframe then
video:renderFrame(frame)
prevframe = frame
end
end
end
playdate.graphics.video.new("Videos/movie")
でmovie.pdv を読み込み、video
に格納、
playdate.sound.sampleplayer.new("Videos/movie")
でmovie.aif を読み込み、audio
に格納しています。
次にsetUp関数で初期化を行っています。
playdate.display.setRefreshRate(0)
はフレームバッファが利用可能になったらplaydate.update()を呼び出すようにする設定です。
audio:play(0)
で音声の再生を行い、動画の初期化を行います。
video:useScreenContext()
はレンダリングコンテキストとして表示フレームバッファを設定し、
video:renderFrame(0)
は動画の最初のフレームをレンダリングコンテキストに描画しています。
毎フレームの描画処理はplaydate.update()で行います。
音声再生状態のとき、音声の再生位置から動画の現在のフレーム位置を求め、前のフレーム位置と差分があれば描画するようにしています。