スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[実験]RGB差分動画

iRemoteで触って以来動画といものに興味がわいております。

■iアプリで動画
iアプリ動画を扱う手段はかなり限られていて、ひとつはアプリ中からネイティブ動画プレイヤーを呼び出し、3gp動画などを再生する、他にはiRemoteでやっているようなjpg画像を高速で切り替える擬似モーションjpeg。

前者はもっとも簡単に実装可能なもので、3gpを使えるので圧縮率、音質、効率などが完璧。ただ、ネイティブ動画プレイヤーに対し、1つの完全な3gpを渡さならずどうしても時間に制約がうまれるし、操作をすべて持っていかれるのでアプリで追加にどうこうするということができない。

そこでアプリで動画、といえば基本的に後者が主流です。
ニコニコ動画アプリをはじめ、各種動画配信サービスにはこちらが使われます。
150KBというDL制限は数秒分ブロックを随時DLし、また音声は擬似着うたであるADPCMを使用、
それらをアプリ中で組み立てるというもの。圧縮効率は3gpに比らべとんでもなく悪い。
キープアライブ接続ができない、アプリ中で指定の動画フォーマットを再生できない、一度のDLサイズに制約がある、DL中のデータは読み取ることができない、jpg描画は基本高速、zip解凍は標準できる、ADPCMは基本再生できる、などなどの数々の条件のなかで考え出されたものです。


■iアプリでどこまでできるのか
DL制約やADPCMの条件で150KB=3秒分の関係は崩しにくい。
となればいじる部分は画像部分くらいしかありません。
この部分を同サイズのままコマ数、画質をアップさせないといけない。
jpgそのままでは不可能。普通の動画コーデックのような動作をさせない限り不可能です。

そこで動画コーデックの基本部分でよくみられる差分画像というものをつくって元画像に適用していく方法を考える。元画像(キーフレーム)を1枚用意し、そこから次のフレームではRGB値それぞれで差分をとって画像化する。これをハフマン符号かなんかをかけて圧縮する、のがいいんだろうけど、そんなものわからないのでとりあえずjpgにする。
すると、jpgでそのフレームをそのまま圧縮するよりもサイズが1/3になりました。
各フレーム間には0.1秒しかなく、画面変化は微々たるもので、実際には差分を取るとほとんどが一色になるようです。となればjpgはこういう画像の圧縮率が高いので圧縮できる、と。
他に動画圧縮といえば移動量だとか難しい話がでてきますが、さっぱりわからないのでとりあえず無視。。

このRGB差分JPGをひとつにまとめたものをアプリに送り、アプリではそれを解凍、個別のファイルにわけたあと、一度Imageに描画し、画素のRGB値を配列で取得、その配列を使って差分を適用して、再度画像化、それを実画面に描画、という流れになる。
うまくいけばとっても高画質化できそうですが、差分に大してjpg圧縮をかけるのでその劣化のせいで差分適用がうまくいかず画面が崩れたり、またなによりそんなことをするスペックが端末にあるかどうかが問題。
10fpsにするならばせいぜい通信含めて100ms以下に抑えこまなければ使えない。


もしこれができたなら一番恩恵があるならそれはリモートモードだと思う。
現在では変化のあったセル画像そのものを別画像に差し替える作業をしますが、
これをRGB差分で転送すれば変化のすくない部分はほぼ一色の画像となり恐ろしく圧縮できる。
まぁこちらも前述と同様の問題がありますが。。


まぁものは挑戦。ちょっとやってみよう。

コメントの投稿

非公開コメント

Go To 物置。
プロフィール

書いてる人:つん

まったりのんびり。書いてる人の息抜きブログです。

多分連絡先↓
metal_tsun@yahoo.co.jp

カテゴリー
リンク
月別アーカイブ
バロメーター
Java歴:2005年2月から今まで。
3DCG歴:2005年8月から数年。
C歴:2006年4月から今まで。
VB歴:2007年3月からちょっと。
Delphi歴:2007年3月からちょっと。
PIC歴:2007年5月から数年。
イラスト歴:2007年12月から今まで。
DTM歴2008年2月からちょっと。
PHP歴2008年4月からちょっと。
C++歴2008年4月から今まで。
C#歴2009年1月から今まで。
Objective-C歴2009年4月から今まで。
CSS歴2012年5月から今まで。

ブログ開始日2005/10/11


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。