スポンサーサイト

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

続・RGB差分

実際に動画中で2枚の時間差のある画像を使って、前回書いたことがアプリでできるのかやってみた。

差分画像は負値を保存できないために値を2で割ったあとに128を足している。
元画像1枚と差分画像をアプリ中で合成すると、ちゃんと画像になれば成功。

差分画像からRGB配列を取得後、128を引き倍化させ、負値を復活。
そのまま全成分足すとしっかりと画像になりました。(あたりまええちゃあたりまえですが)

しかし元画像も差分画像もどちらもjpg圧縮されており、jpg圧縮では見えにくい成分はある程度うやむやにされてしまう傾向があるため、個別で見れば綺麗ですが実際に差分画像を適用するとそれぞれの劣化部分を打ち消せないために結局jpg特有のノイズのような劣化がでてきてしまいました。
1枚の差分適用でかなりのノイズなので、これは何枚と重ねるとみるに耐えなくなるのは容易に想像できます。

最初の一枚のクオリティを保つには差分画像をほぼ可逆で圧縮しなくてはならないと思う。
っていってもそんなことはなかなか厳しい。ほぼ同じ色になるっていってもかなりの割合で別の色のためbmpのままでは圧縮率は悪い。


アプリで心配だった速度ですが、一応F-01Aでは差分適用、表示で50msを切る程度でできるらしい。
10fpsはなんとか、でるのかも?まぁ通信しながらではきびしい数字。


結局iアプリで差分タイプの動画はきびしいものがありそうだ。
スポンサーサイト

[実験]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差分で転送すれば変化のすくない部分はほぼ一色の画像となり恐ろしく圧縮できる。
まぁこちらも前述と同様の問題がありますが。。


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

[iRemote]ver0.9.2公開開始[バグ修正]

デフォルトキー配置以外では正しく機能しないバグを修正しました。
拡大率スライダがデフォルト配置ではない場合うまく表示されなかったり、
範囲選択時に強制で5キーが選択ボタンになってしまうのを解消。

[iRemote]ver0.9.1公開開始[バグ修正]

■現在までに確認している不具合
・リモートモードで拡大縮小時に画面が一瞬黒くなるなる場合がある。・一定以下の拡大率で起動した場合画像を表示できない。
・動画モードで突然アプリエラーが発生し、強制終了する。・動画モードで設定を変更したのちのバッファリングで画像管理に失敗し中途半端な状態になる。
・動画モードでバッファリング後音声がずれる場合がある。(メニュー⇒適用で直る場合あり)
・QRコード読み込みができないことがある。(キーが不正。PC側でキーを生成しなおしてください。)
・音声モードで設定を変更をするとそのままフリーズする。
・デフォルトキー配置以外で正しく動作しない機能がある。
(線はいってるのが対応済み)

3つほど修正完了。
音声モード設定変更時フリーズとか盆ミスすぎる;
PCサイドのプログラムは変更がないのでver0.9.0のままです。
アプリはver0.9.1。

そういえばver0.9.0からですが、アプリを変えるときに一端アプリを削除してくださいね。
セーブデータの形式がまるっきり違うので、そのままバージョンアップすると不具合連発のはず。

■余談
動画は7fps、大サイズあたりの設定が一番バランスがいいとの報告がありました。
F905iでは横画面モードにしてもさくさく、ぬるぬるとのこと。

ワタシはF-01Aを使っていますが、見たところ体感fpsはまだ上げることが可能です。
プログラムがカスなので送られてきたデータをまだ完全な形で使いきれてないです。
(まだあるべき力の70%くらいの滑らかさかも。。。)
分散方法を改良し、等間隔で画像を確実に描画できれば同じ設定でもさらに滑らかになります。
単純にスペックの高いケータイではこの問題は発生しないかも・・・

画質に関しては150KB、3秒縛りの現状ではこれ以上あがりません。
画質が低いと感じた場合は容量をあげ、fpsを下げたり、音質を下げたり、ステレオをモノラルにしたり、画像サイズを大きくするなどで対応してください。
基本的に15fpsは飾り機能です。150KBに45枚のjpgなんてたかが知れてます。
jpgをpngなど別形式にしたいですが、jpgとgifしかケータイでは通常は扱えないので形式変更もありえません。(むしろフルカラーで同サイズのまま大幅に容量を削れるのはjpgくらいしか存在しない。)

[iRemote]ver0.9.0公開開始

ver.0.9.0betaの公開を開始しました。
大急ぎでバグ取りしたので見逃しが多々ある可能性があります。
見つけ次第修正版をアップしていきます。

■ver0.8.9⇒ver0.9.0変更点
・キー配置を変更できる(12キー)
 ・カスタム特殊コマンドも割り当て可能
 ・マウスセンターボタンドラッグ、クリックなどを追加
 ・動画モード、音声モードへのショートカットも追加
・任意の特殊コマンドを設定、送信できる(12個まで)
・メニュー構成変更
 ・キー配置の変更メニュー追加
 ・特殊コマンド送信用の設定メニュー追加
 ・領域限定モード、ファイル転送の項目追加(内容は未実装)
 ・メニュー窓のデザイン変更
・動画メニュー構成の変更
 ・リモートモード中で動画モード設定、音声モード設定の変更ができる
・通信間隔に自動を追加
 ・画面の変化が少ない場合は通信間隔を大きめにする
・拡大縮小アニメーションの動作を変更

・動画モードでの読み込み処理の変更
 ・別スレッド化により負荷分散(表示fps安定化によりカタツキ軽減)
 ・通信頻度向上により動画の安定取得
 ・サイズ大の設定が予定よりも大きなサイズになっていたのを修正(実用的になった)


こんなところでしょうか。
未実装の項目が2~3箇所くらいあり、その項目は選択しても何も起きません。
デバッグ情報オンオフをメニューに入れようとおもってましたが、忘れてそのまま公開。
前と同じで起動画面でオンオフの設定ができます。


■現在までに確認している不具合
・リモートモードで拡大縮小時に画面が一瞬黒くなるなる場合がある。
・一定以下の拡大率で起動した場合画像を表示できない。
・動画モードで突然アプリエラーが発生し、強制終了する。
・動画モードで設定を変更したのちのバッファリングで画像管理に失敗し中途半端な状態になる。
・動画モードでバッファリング後音声がずれる場合がある。(メニュー⇒適用で直る場合あり)
・QRコード読み込みができないことがある。(キーが不正。PC側でキーを生成しなおしてください。)
・音声モードで設定を変更をするとそのままフリーズする。

■特殊キーについて
http://msdn.microsoft.com/ja-jp/library/cc364423.aspx
iRemoteの特殊キーで編集・送信できるものはWin32APIのSendKeysのコードと同様のものです。
このページにコード一覧とその使い方があるので参考にしてください。
誤ったコードを送信した場合は何も起きません。


■解説について
今バージョンからメニュー配置などが変更になり解説が通用しない部分があります。
気が向き次第書き直すのでそれまでお待ちください。

[iRemote]残り時間

明日には実家を離れ、実機テストができなくなるので今日にも完成させないといけない。

あれから動画モードの改良に四苦八苦してしまい、未だどうにも納得できるデキになっていません。
負荷分散をさらに細かくやってみましたが、負荷が全フレーム満遍なくかかってしまい、結局まんべなくかたついてる気がする。多分前よりははるかにましなのかもしれないけど、、、
あまり満遍なく分散しないで、序盤に一気に読み込んでしまって負荷を集中させ、後半は滑らかに再生させる方が結果的にはよいのかもしれない。ハイスペック機に関しては満遍なく分散させたほうが効率がいいことが多く、逆に低スペック機ではすーっとカタツクことになる。


この分散させるプログラムのせいでバッファリング関連で不具合がでてる模様。
これを修正したら目立ったバグはなくなるとおもうのでいよいよ公開ってことになりそう。

[iRemote]動画モード改良

画像解凍用スレッドを新たに追加してみた。
これまで通信スレッドに含まれていた処理系を外に出したことで、次の通信を開始するまでの時間を短縮できることから、長い時間で見た場合のビットレートが上昇する。
これにより150KB設定でも安定してDLできるようになる、かもしれない。

また、解凍処理は負荷がまとまって発生するのか、スレッド優先度にほぼ関係なくそちらに処理がとられて描画が遅れ、結局動画がカタツクということが発生していたので、解凍系を描画フレームにあわせて間隔をあけて解凍していくことで負荷の分散をはかり、カタツキを抑えるというのもやってみている。


ケータイで3スレッドとかワタシには結構未知な領域。
同時に3スレッドが動作するってことは少なくなるようにはしてるが、、、


■追記
どうやら作戦は成功のようでカクツキはかなり抑えられた。
10fps設定の動画ではこれまで端末では20fpsで書き換えていたところを30fpsにしたことで一回の更新遅れの影響を減らすことができてるみたい。負荷分散をしない場合は30fpsが安定してでるものの、通信が完了した瞬間に限り大幅にfpsは低下し一桁にまで落ちる。これがカタツキの正体。負荷分散により30fpsが安定してでなくなるものの、全体を通せば負荷の波は小さく、20fps近辺が出続けることで描画遅れが減る。動画そのものの設定である10fpsの倍程度の描画fpsが常に出続ければ滑らかに描画することができる。(描画も設定通りにぴったり10fpsで描画しようとすると、突発的な遅れであっさり1フレーム飛ばすことになってしまう。)

バッファブロック切り替え時に誤って前ブロックの画像を一瞬描画してしまうバグもある模様。
バッファ管理方法を変更すれば解決できそう、かも。

■追記
負荷分散的なスレッド利用が有効で便利なものであることがわかったので、今度はリモートモード中でこれを使うか検討中。
それを実装すると具体的にどんな利点があるかっていうと、それはカーソル移動の瞬間的な固まりを防ぐこと。その他アニメーション関連のすべてがスムーズになります。
ただ動画モードと違って欠点もあって、それは画像更新が遅れるという点。
ゆっくりと画像を解凍していく関係で反映までに時間がかかります。
すばやさを優先するリモートモードでは結構致命的。しかし滑らかさは快適さにつながるのでそこそこ重要な点。


■追記
サーバーアプリ側に正しく終了できないことのある不具合を発見。
現在調査中。⇒修正完了

[iRemote]バグ取り中

物置が復活したようです。
忍者ツールでスペース確保してましたが、使用しなくて済んでなにより。

iRemoteはサウンドソフトのおかげで遅れてますが、順調にバグ取り中。
内部をかなりいじってるので、これまでは大丈夫だった部分にもバグがあったりします。
主に表示系が多い感じで、ソフトキーラベルがうまく遷移してくれなかったり、デバッグ用の表示がうまくいってなかったり、そんなのが多い。

メインはリモートモードですが、動画モードにも多少手を入れています。
音量を20段階から10段階に減らしたり、描画フレームレートを落とした場合操作がしにくくなるのを防ぐために全フレームで描画フレームレートを20~30程度にするようにしたり。そのおかげで若干ですが動画が滑らかに動くようになったような、気がします。気持ち程度の違い。


■追記
目立ったバグはあらかたつぶせたかな。
もう少しで公開な気がする。
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。