SDカードの大容量とせっかく作ったSD-OSを生かしたアプリケーションとして、 動画再生を試してみました。名づけて、Pico Movie(ベタベタ)。1. 現在のバージョン
2. ツールとりあえずBELUGAのカートリッジを利用していますが、 RAMのみで動作させることも可能です。 取れるバッファの大きさが変わるので、後述のバーストモードで違いが出ます。 もちろん、SDカードアダプタは必須です。
準備ができ次第、ダウンロード可能にする予定ですので、少々お待ちください。
2.1. 専用エンコーダ(pmvenc)以下のツールから構成されます。
2.2. プレイヤー(pmv)Windows上でffmpegと一緒に動作させ、 ムービーの独自形式(pmv形式)へのエンコードを行います。
SD-OSのmp6フォーマット(SD-OSの実行バイナリ)の実行ファイルで、 pmv形式の再生を行います。
3. エンコード
3.1 エンコード方法3.2. 使用例とレポート
サポートしている解像度は以下のとおりで、すべて2色です。
- 64x48 (スクリーンモード2)
% ffmpeg -i <ムービーファイル> -s 64x48 -f image2pipe -vcodec bmp [-ss <再生開始>] [-t <長さ>] [-r <fps>] tmp % pmvenc tmp -s [-r <fps>] [-t <カットオフ>] -o <pmvファイル>- 128x96
ffmpeg -i <ムービーファイル> -s 128x96 -f image2pipe -vcodec bmp [-ss <再生開始>] [-t <長さ>] [-r <fps>] tmp % pmvenc tmp [-r <fps>] [-t <カットオフ>] -o <pmvファイル>- 256x192 (スクリーンモード4)
% ffmpeg -i <ムービーファイル> -s 256x192 -f image2pipe -vcodec bmp [-ss <再生開始>] [-t <長さ>] [-r <fps>] tmp % pmvenc tmp [-r <fps>] [-t <カットオフ>] -o <pmvファイル>pmvenc -hでヘルプが出ます。現在プレイヤーではサポートしていないグレイスケールやpbmの出力もおまけでつけてあります。
ポイントはカットオフで、入力されたピクセルの輝度(グレイスケール)がこの数値より大きなもののみビット出力します。 輝度は、入力映像の24ビットRGBの平均値で、0〜255です。 そのため、設定数値が高いほど暗い映像になります。
エンコードの実際を以下に示します。
4. 再生% ffmpeg -i source.mpg -s 128x192 -f image2pipe -vcodec bmp -r 15 tmp.bmp
% pmvenc tmp.bmp -r 15 -o movie.pmv
size= 128x 96, 522941 bytes( 27.02%), 1260 frames
bpf= 415.03(max: 1134), fps= 15 white= 37.42%pmvencの出力は以下を表しています。
- 解像度が128x96
- ヘッダ部分(16バイト)を除く映像のエンコード後のサイズが522,941バイト
- 圧縮率が27.02%(元ファイルに対して27.02%になった)
- フレーム数が1260
- 1フレームあたり平均415.03バイト
- 最大サイズのフレームが1134バイト
- ヘッダに15fpsを指定
- white pixelsが全体の37.42%あった
モノクロエンコードによりどのくらいの映像になったかの参考にするため、エンコーダはホワイトレシオをレポートします。
4.1. プレイヤーの実行
4.2. プレイヤーのオプション
あらかじめ、SDカードにpmvコマンドとエンコード済みムービーファイルを入れておきます。
PC-6001起動後、sdコマンドでSD-OSに入り、以下でムービーを再生します。 ちなみに、プログラム内で画面のアトリビュートや表示をムービーファイルや オプション指定に従って完全にコントロールするため、 "How Many Pages?"に対するページ数は何でもかまいません。% pmv % ex pmv% <pmvファイル> [オプション]
サブディレクトリのpmvファイルを指定する場合は、ex実行前にcdでカレントディレクトリを移動してください。pmvファイル指定時に直接/相対ディレクトリを指定することはできません。途中で止めるときにはSTOPキーが使えます。再度実行するときは、sdコマンド実行後、以下のようにします。
% ex 6431 pmv% <pmvファイル> [オプション]
オプションは以下の3種類をサポートしています。 対応していないオプション文字を入力しても無視されます。
- s (シングルスクリーン指定)
通常、これを指定しなければ2画面使って裏画面に描画するのでより滑らかですが、バッファが21.5kBに減ります.
5. 今後の予定
- b (バーストモード指定)
- フルバッファモード指定で、指定しないとバッファが満杯になるのを待たず、 画面がロード出来次第再生します。 現在のSDカードアダプタのスピードが遅いので、 これだとロード時間が断続的に発生し、コマ送りのような映像になります。
- c (CRT-OFF指定)
- 常にロード時はDMAを止めます。ロード実行中は画面が乱れますが、 bオプションと一緒に使うことにより、あとで結合編集する際に 「ムービー再生中ではない時間」がわかりやすくなります。
5.1. SDカードドライバ
5.2. SDカードアダプタ現在のバージョンのSDカードドライバがスタック領域を大きくとっているため、メモリの有効活用のため、pmvではそのスタックを塗りつぶしてしまいます。 そのため、いったん実行するとSD-OSに戻れなくなっています。 また、再度実行時に開始アドレス(6431)指定が必要です。 これらは、次のバージョンで改善予定です。
SDカードアダプタがジョイスティックポートを使っているため、 転送速度に限界があります。 現在、拡張カードにSDカードアダプタを実装するための開発を行っています。 拡張カード上にAVRを乗せ、FATの管理はこちらに任せるという方法をとる予定です。 こうすると、かなりの高速化が期待できます。
5.3. 手っ取り早く安く高速化?
6. その他AVRバージョンのアダプタは開発中ですが、拡張カードとして実装するために多少コストが上がります。まぁ、部品代は1000円くらいでしょうが。ただ、ROM/RAMカートリッジと共存させるためにPC-6011拡張ユニットが必要です。これはフロッピーインタフェースを無視すれば簡単に自作可能ですが、それでも面倒ですよね。実際私も持っていませんし...。
そのため、いくつか考え中です。
- バイト単位I/Oによるストリーミング
- プリンタポートを使う
まぁ、気長にやります。
できれば音楽も一緒に再生したいのですが、 さすがにPSGでのPCM再生を並行して行うのはCPUパワー、 メモリの両方の面からつらいです。 音楽再生はAVRに任せてPC-6001本体と同期を取るようにするのが妥当でしょうかね。
技術情報は別に書きます。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!