マルチコアにしたらリソースが倍になるらしいね。
役割分担
core0
・LCDへの描画
・音声出力 ※未実装
core1
・microSDからフレームデータの読み込み
・フレームデータの展開
流れ
準備(電源つけたら1回だけする処理)
core0:sdカードマウント
core0:ランダム再生の準備
core0:core1起動
こっから無限ループ
core0:ランダムにファイルを1つ選択
core1:選択されたファイルをオープン
1ファイル分ループ
core0
バッファが全部空なら待機
バッファを1つ選択
前フレームとの間隔調整のために待機
LCDに描画
今使ったバッファを空にする
core1
microSDから1フレーム分読み出し
DXT1→RGB565に展開してバッファに詰める
バッファ3つ分いっぱいになったらお休み
1ファイル分再生が終わったら、
core0:ランダムにファイルを1つ選択
まで戻る
各セクションの時間を計測
実装の中身は省略しまして。
core0
LCDに描画:10ms
音声再生:これから実装
core1
SDから1フレーム分読み出し:21ms
DXT1 → RGB565の展開:15ms
計:36ms
24fps ≒ 41.7ms/f には届いてるね~
結構ギリだけど
総再生時間を計測
元の動画ファイルが約89.94秒のbinファイルを再生した

約89.89秒
0.05秒の差は計測誤差で片付けちゃってもいいのかな・・・
もっと長い動画で確認してみた
元の動画ファイルが約24分0秒94の長さのbinファイルを再生した
秒に直すと1440.94秒

約1439.56秒
1秒以上短い。ヤバいじゃん。
フレームレートを見直し
「テレビアニメ フレームレート」で検索したら「24fpsです」って書いてあるページが多かったらそれに倣って1/24=0.0416666….としてヘッダファイルにフレーム間隔を宣言してる

でも実際に動画ファイルのプロパティを確認したらもう少しだけ遅かった。微差だけど。

フレーム間隔の値を1/23.976=0.0417083….に変更してみる

概算してみる
長いほうの動画ファイルのフレーム数をmoviepyで取得した

それぞれのfpsで計算してみた
状況 | fps | フレーム間 | 総再生時間 |
---|---|---|---|
修正前 | 24.000 | 41,667us | 1439.5秒 |
修正後 | 23.976 | 41,708us | 1440.9秒 |
ドンピシャじゃん。
再度実測

約1440.98秒
元の動画ファイルが1440.94秒だから
0.04秒くらいのズレ
これなら最後まで音声とのズレも気にならなそう
再生してるとこ
なめらかで大変よい。