2010年08月20日

3時間でiPhoneアプリをiPad対応にした

ま、実際には5時間かかったんですけどね。最初だったから。ちなみに審査は実質5日くらい。

IMG_0010%201.PNG

これはツイキャス・ビュワーの iPad アプリ。というかユニバーサル・バイナリなのでiPhoneと共通です。

夕方5時からiPad化初めて、10時には完成、2時間で試験パターンまわして深夜0時に申請、という流れです。

自分メモですけど、何かの参考に。
(ちなみに内容的には最低限のiPad対応、かと思いますー)


【準備】

実はこれがすごく大事。iPhone アプリを作るときに以下のことに注意して作ります。

- 画面は左右ぐるぐる回転できるようにしておく
- ぐるぐる回転したときに、frame = CGRect なんて使わなくていいように Interface Builder のアラインパラメータを綺麗に設計する
- なので、画面構成要素は極力コードで動的にじゃなくてXIBで作成する。NavigationControllerくらいは動的作成でも影響ないけど。
- 基本、ステータスバーは表示した方がいい。(iOS4になってからゲーム以外でステータスバー隠すのはNGだと思ってるんだけど)
- 設定メニューなど、一貫したグループのXIBファイルは分けておく(超重要)。


で、iPad化します。手順は簡単で、

1. Targets から Project を選択して 「Upgrade Current Target for iPad」を選択
2. Universal アプリを選択して OK

すると、Resources-iPad ってのができるので、中身を確認します。
Main XIB ができてるはず。ただし画面サイズはiPhone サイズ。

で、上記の iPhone 注意点を守ってつくっていれば、これで iPad アプリ、ほぼ完成しているはずです。

なにしろ iPhone 用の XIB がそのまま iPad でも使えるので。
しかもちゃんと設計していれば画面サイズが変更されてても大丈夫。IB万歳!

ただ、やはり個別にちゃんと設計したいよね、ということもあるかと思います、ていうかそうすべきなので IB の File メニューから

- Create iPad Version

を選択します。すると新しい XIB が一つもらえて情報全部コピーされているはずです。
こいつを適当な名前つけて保存して、Info.plist の Main nib file base name (iPad) に新しい XIB のファイル名を指定すればOKです。


あとは Project > Edit Project で Targeted Device Family を iPhone/iPad に変更してください。

コレで完成です。

いや、もっとなんかあるっしょ・・・ということで、詳しくは iPad Human Interface Guideline (日本語) を読んでいただくとして、一番大きいのは

- ナビゲーションで全画面移動じゃなくて PopOver に変更したい!

というものかと思います。上の画面の右側に PopOver してるやつね。

これはドキュメント読んでもらってもいいんですが、めちゃ簡単に使えます。
今まで NavigationController に push してたところを

UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController: 表示したいController];
[nav setToolbarHidden: NO];
[nav setNavigationBarHidden: NO];
// これに初期コントローラーを登録してPopup表示
self.mPopoverController = [[UIPopoverController alloc]initWithContentViewController: nav];
[self.mPopoverController presentPopoverFromBarButtonItem:起動元のButtonItem
permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[nav release];


って変更すればOKです。
なお、mPopoverController を self. で保持している理由ですが、(これは保持してなくてもいいんですが)ユーザーアクションじゃなくてプログラム的にPopOverを消去したいときにポインタ持ってないとPopOver消せないので保持しています。


ツイキャスビュワーの場合、設定メニューとかが PopOver になってるんですが、これ、猛烈に便利な点は横320pxデフォルトなんで、iPhoneのXIBリソースがそのまま使えます。

ツイキャスビュワーだと設定メニューは XIB分けてるので、それをそのまま流用すればおk。つまり、XIBもコードも一切いじることなく、テストもほぼ不要で PopOver の設定メニューが完成します。


あ、あとちょっとはまりそうなところというかポイントだけ。

【iPad化にあたり】

- ステータスバーを隠すとか、ナビゲーションバーを隠すというギミックは極力使わない。
(ステータスバーは、画面の回転とアラートの向きがずれる可能性があるし、ナビゲーションバーは再表示したときにうまく機能しないことがある)
- ヒューマンインターフェースGuidelineは、ガイドラインなので、あまり真剣に悩まない。ボタン類とか、画面上部推奨されてるけど明らかに下にあるほうが(親指操作できるし)便利っしょ。
- PopOver使うと、下の画面がみえた状態になるので更新タイミング注意。つまりiPhoneだとViewが消えたり現れたりする時点で画面更新しておけばよかったけど、PopOver使ってる場合、たとえばPopOver内でログアウトしたら元のビューの表示もその時点で「ログアウト状態」に変更する必要がある、など。


あ、あと最後に用意する画像。ちょい増えましたのでね。

【アイコン画像】

29x29 (設定メニュー: オプション)
58x58 (iPhone4 設定メニュー: オプション)
57x57 (iPhone)
50x50 , 72x72 (iPad)
114x114 (iPhone4 - ファイル名に @2xつける)
512x512 (AppStore)

【起動画面】
Default.png = 320x480
Default@2x.png = 640x960
Default-Portrait.png = 768 x 1004
Default-Landscape.png = 1024 x 748 (※微妙に20px少ないのがポイントです)


と、これだけ用意しておけばおk。

あとは Info.plist の Supported interface orientations (iPad) をちょろりといじればいい感じかと。詳しくは iOS Application Programming Guide: Build-Time Configuration Detailsにて。


以上、ご参考までに。

あ、よろしければ以前の記事もあわせてどーぞ。
iPhone アプリを iPad 対応にする方法(プログラミング編) : 管理人@Yoski


※ユニバーサルアプリにしたら、審査の開始も承認も早かったような気がします!

投稿者 aka : 時刻 14:54 | 固定リンク | コメント (0) | トラックバック (0)

2010年08月05日

フレッシュリーダー終了のお知らせ

お知らせが遅くなってしまったのですが、フレッシュリーダーの開発を終了することにさせていただきました。

- 一部製品・サービス終了のお知らせ - サイドフィード

フレッシュリーダーについては、来年9月末まではサポートを継続しますので、今お使いいただいている方はあと1年間は普通に使っていただけます。
その後は自己責任でお使いいただければと思います(クローラーオプションもその段階で停止します)。

※その他製品・サービスも終了するのですが、フレッシュリーダーの影響が一番大きいかと思いますので代表して。


終了の経緯なのですが、(細かい理由はいくつもありますが)とりまとめていうと事業集中です。

これまで名無しベンチャーがコストをかけずに目立つために様々なサービスを連発してきましたが、そのフェーズも終わり、現状すべてのサービスのクオリティを保つことが難しくなってきました。

フレッシュリーダーについても、みなさまからいただく要望も多くある中、バージョンアップも満足に行えず心苦しい状態が続いていました。


いろいろな選択肢がある中、中途半端に続けるより方針を明確にすることが重要ということで、このタイミングで製品・サービスの終了を案内させていただく次第です。


ということで、これまで支援いただいたユーザーのみなさま、ありがとうございました&終了にともないご迷惑おかけして申し訳ありません。


なんか一時代の終了ということで寂しい限りですが、個人的には次のステップに上がるための手段ととらえています。これから第二幕頑張っていきたいと思いますので引き続きどうぞよろしくお願いいたします。


----

ちなみに起業したときのテーマは「ブログ・RSS・SEO」だったのですが、今のテーマは「モバイル・ソーシャル・リアルタイム」です。いやぁ、、、まだ終了すべきサービスが残っていますね・・・(続く

投稿者 aka : 時刻 21:49 | 固定リンク | コメント (1) | トラックバック (0)

2010年07月08日

iOS4のバックグラウンド処理とiPadの微妙な関係

iOS4 からマルチタスクがサポートされ、これにより現在申請中のツイキャス最新版では、「バックグラウンドでライブ配信」ができるようになります。

IMG_0015.PNG
こんな感じでライブ配信中もブラウザ見たりできますよ、と。


iOS4なにそれ?美味しいの?って思ってたんですが、バックグラウンドで配信できる便利さは凄いです。
初めて iOS4 バンザイ!って思いましたw


で、これを実現するためのメモを残しておきます。ま、大したことないんですけどね。(ていうかちゃんと審査通るかどうかが心配・・・)

あ、ちなみに、iOS4 だとアプリが終了せずにタスクトレイに残るからバッテリーの減りとか大丈夫?という話しもあるんですが、

- ステータスバーが赤くなる(上の画像のような)ケース以外では CPU は使われないから大丈夫
- ただ、メモリは使われる。これは古いものから順に押し出される

ということで、あまり心配する必要はありません。
ただ、アプリが終了せず継続されるということで

- メモリリークしてるようなアプリは大丈夫?

という疑問が残ります。で、メモリリークしてるアプリについては、起動するたびに使うメモリが増えてしまうので最終的には「残念」な結果になります。

メモリリークしてるから使ってはいけないアプリ、的なリストがあればいいんですけどね・・・現時点では開発者を信じるしかありません。


■バックグラウンドでプロセスを残すには

いくつか方法があるのですが、一番多いパターンは「音楽を再生または録音」しているケースです。

この場合は

- Info.plist のマルチタスク記述に App Plays Audio をセットするだけ

で対応が完了します。驚くほど簡単で便利。

で、これによりアプリが切り替わっても(音楽の再生または録音中なら)バックグラウンドで処理を続けます。ただ、カメラなどは落とされるので、ツイキャスでもバックグラウンドで処理している場合は「音声のみ」の配信になります(映像はストップ)。


■音楽はどうやって再生すればいいのか

で、問題はどうやって音楽を再生すればいいのか、です。

WWDCの資料とかでは AVFoundation → AVSession を使うことが推奨されていますが、これを使ってしまうと iPad で動きません (OSが古いから)

で、レガシーな AudioQueue または OpenAL を使うことになります。
ポイントは、AudioQueue や OpenAL を使っても「バックグラウンド動作は有効」になるという点ですね。なーんだ、AVSession 使わなくてもよかったんだ、と。
(デバイスの処理をみてるんですかね)


■iPad の微妙な関係

さて、そこでずぼらな私は「iPad は iPhone シミュレーションモードで動けばいいや」と思うわけです。

そこで、iOS4 でアプリを開発し、Deployment OS を 3.2 と指定します。
これにより iPad では動くけど iOS4 以前の iPhone じゃ動かないからめでたしめでたし!

・・・・と思ったのですが、残念ながら、この設定では Apple がアプリを受け付けてくれません。
iPhone 用のアプリなら、3.1 か 4.0 を Deployment Target に指定しろ、というわけです。
でも 4.0 を指定してしまったら iPad では動きません。

むむむ、、、、ということで仕方なく 3.1 を指定し、OS のバージョンによって処理を振り分けるコードを追加することになります。
まぁ、冷静に考えてみれば iPad の iPhone モードだと OS は 3.1.3 なわけで、3.2 で提出できたとしても iPad では動かないんですけどね(実は純粋な 3.1.3 じゃないんだけど)。

まぁ、iPad で動かしたいなら、ちゃんとユニバーサルバイナリにしなさい、ってことなんでしょうかね。

と、そんな感じで iOS4 結構便利。


ツイキャスも、七夕の日に申請したので、うまくいけば1週間ほどで公開されると思います。

そしたら試してみていただければ、と思います>iOS4なみなさま。


ツイキャス(ライブ)

ツイキャス(ビューワー) (こっちはまだマルチタスク対応してません)

※バックグラウンドで動作している最中に、他のアプリが音楽の再生や録音を開始するとバックグラウンドで動いているアプリは停止してしまいます。これは iOS4 の仕様ですので、どうしようもありません。なお、ツイキャスではこの状態でも 約20 秒以内にアプリに戻ればライブ配信を継続することができるようになっています。

投稿者 aka : 時刻 20:04 | 固定リンク | コメント (2) | トラックバック (0)

Windows から Mac に乗り換えたときのメモ

先月、ついに Windows から Mac に乗り換えたので、その時のメモ。
もはや既出感満点で意味はないと思うのだけど・・・万一、またやらなければいけないときのために・・・完全に自分メモです。


■もともとの環境

- Windows マシンに VMWare Server いれて CentOS
- Mac は iPhone アプリ開発用。

これらを統合してひとつの Mac にしたい!


■手順

- Macの移行は TimeMachine 使ってたので驚くほど簡単。まずこちらから。
- BOOTCAMP で Windows 用パーティション作成する。
- BOOTCAMP に Windows 入れる
- Mac パーティション分割して CentOS 用のパーティション作る
- CentOS コピーして完了(VMWare Image)

■ポイント箇条書き

- BOOTCAMP いれることで、Windowsのライセンス問題はクリア
- OEM版だと、結局 Microsoft に電話することになるんだけどパッケージ版なら電話不要
- で、Mac で Windows 使うために VMWare じゃなくてフリーの VirtualBox を選択。快適。
- VirtualBox でも BOOTCAMP のWindowsイメージをそのまま Mac 環境で起動させることができる
- ただし、起動時には BOOTCAMP ドライブの eject と chmod 666 /dev/disk0s4 (かな、環境により異なる) が必要になる
- CentOS は、さらに Mac 用のパーティションを分割して、そこに作成。これにより Windows を BOOTCAMP で起動したときにも CentOS 動かせるようになる(Macの領域は Winから参照できない)
- CentOS の領域は FAT で作成し、Windows 側で NTFS に変換するのが便利
- Snow Leopard から NTFS 読み書きできるようになった
- なお、3番目のパーティションは先につくってしまうと BOOTCAMP いれられなくなるので注意。
- ちなみに VirtualBox では VMWare のディスクイメージをそのまま起動できるので、VMWare のファイルコピーするだけでOK
- Windowsはシステム移行ツールでさくさくって移行、ってのは期待薄。結局うまく移行できずに手動で全部手動セットアップ
- Windows のフォントはそのまま Mac に移行できるからドロー系ツールの移行もオッケー


■その他、Tips

- キーボードのバインディングは KeyRemap4Macbook 最強。
- Mac には DEL と BS のキーがない(deleteのみ) なので、DVD の Eject ボタンを DEL に割り当てる。
- Windows 側は AppleKbWin いれておけばキーバインディングなんとかなる。
- Windows と Mac で日本語変換統一したかったので、両方でつかえる Google IME いれる


■移行してから思ったこと

- Windows も使えるからいいや、って思ったけど、移行したら「いかに これを Windows じゃなくて Mac で処理するか」ってことに思考が傾く。
- メーラーとか、最初は Windows で使ってたけど、不便だからすぐに Mac のメーラーに移行した。
- Virtual Box や VMWare で動かす Windows、単発アプリなら使えるけど、ウィンドウが増えてきたらもう全然重くてダメ。
- いざというときは BOOTCAMP で Windows 起動すればいいや、って思ってたけど、そんな面倒なこと絶対しない。
- Mac はテキスト編集系のいいアプリが「無料」でころがってなくて苦労
- Windows 7 意外によくできてるよね?
- でも、Mac のこのスリープから最速で復帰するあたりが最高すぎてWindowsには戻れない

という感じでしょうか。って全然自分メモで何の役にもたたないと思いますが、一応残しておきます。

あ、ちなみに Mac は Mac Book Pro 15" SSD 256GB モデルです。
SSD じゃなかったら Windows 起動すらしなかったかも。

投稿者 aka : 時刻 15:38 | 固定リンク | コメント (1) | トラックバック (0)

2010年07月03日

[iPhone][AVFoundation] AVCaptureOutput のメモ


自分専用メモなんで、意味不明かと思いますが是非スルーの方向で。

iOS4 からカメラのフレームバッファをキャプチャすることができるようになったんですが、その取扱がちーと面倒。

で、たまったバッドノウハウ忘れないようにメモ。

- kCVPixelBufferPixelFormatTypeKey

これは基本 kCVPixelFormatType_32BGRA が扱いやすい。iPhone 3G でもOK。あと使うのは YUV ですかね。420v ならモノクロ・フレームバッファも取りやすい。


- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

指定したフレームレートベースでこのdelegateメソッドが呼ばれる。すげー便利。
比較的安定して呼び出し時間を守ってくれるので、あとはパフォーマンスとの戦い。

これは GCD のキューから呼び出される形となるので UIKit と連携するケースなどは別途 MainThread に情報を渡してやる必要がある。
つまり中間バッファが必要。

が、iPhone 4 だと 1280x720 の BGRA とかまでサポートしてるので、ピクセルバッファだけで 3MB を超えてしまう。

で、さて、このピクセルバッファを非同期で処理するためにどっかに格納しようかと思うんだが・・・ここでいろいろ問題発生。


ピクセルバッファは CVPixelBufferRetain で Retain できるので、とりあえず Retain しとけばいいや、と思いきや iPhone 3G さんがそれを許してくれない。
具体的には、Video の PreviewLayer のフレームレートが極端に落ちるなどの影響がでて結構耐えられない状況になる。

あ、ちなみに Retain する前に CVPixelBufferLockBaseAddress でロックも必要です。


じゃぁ、というわけで ピックセルバッファをコピーすることになるんだけど、late copy するために vm_copy かけときゃいいや、と思いきや iPhone 3G さんがそれを許してくれない。
具体的には iPhone 3G さんだけ vm_copy 動かない。

まじで!?memcpy すんの?iPhone 3G 捨てるか?という選択に迫られるわけです・・・。

ただ、どの処理にせよ、iPhone 3G のサポートしている 400x304 というピクセルバッファを処理するのに 0.05秒はかかる。10fps 出すにはすべての処理を 0.1 秒以内に収めないといけないので、バッファをごにょごにょ処理するのは避けたいところ・・・


しかも、iPhone 3G だけは BGRA のアルファチャンネルをサポートしてないらしく、カラースキームにアルファチャンネルを指定すると BitmapContext で CGImage に戻せないという問題もあり、うーむ、なんだかなぁ、と。


と、そんなわけで、超ローテクな方法でしか対応はできないので、できるだけこの dispatch_queue の中で処理を完結させるように書かないとね、という結論でした。


あぁ、完全に意味不明だけど、書いとかないと自分で同じ間違い繰り返しそうだったのでメモのこしときます。。。


あ、その他メモ:

- Front カメラと Rear カメラは同時には起動できない
- フレームバッファをキャプチャしながら同時にムービーを録画、もできない
- その回避策として AVWriter があったんだけど iOS4 beta3 で削除されちゃったからもう無理
- H.264エンコーダー、ハードウェアで対応してるはずなんだけど API は公開されてないから使えない
- 別プロセスで音楽を流すのはできるんだけど、マイクを拾い出した瞬間、音楽配信してたプロセスは強制終了される。


それと、超マニアメモ:CVPixelBufferRef に入っている情報。結構いろんな情報が取れる(iPhone4)

< CVPixelBufferRef 0x1e3d60 width=480 height=360 bytesPerRow=1920 pixelFormat=BGRA attributes=<CFBasicHash 0x1b1180 [0x3e143d5c]>{type = immutable dict, count = 1,
entries =>
1 : <CFString 0x3e53cce4 [0x3e143d5c]>{contents = "PixelFormatDescription"} = <CFBasicHash 0x1b42e0 [0x3e143d5c]>{type = immutable dict, count = 7,
entries =>
0 : <CFString 0x3e53cc54 [0x3e143d5c]>{contents = "CGBitmapContextCompatibility"} = <CFBoolean 0x3e144788 [0x3e143d5c]>{value = true}
1 : <CFString 0x3e53ceb4 [0x3e143d5c]>{contents = "FillExtendedPixelsCallback"} = <CFData 0x1b7a90 [0x3e143d5c]>{length = 12, capacity = 12, bytes = 0x000000004594413300000000}
8 : <CFString 0x3e53ce34 [0x3e143d5c]>{contents = "BlackBlock"} = <CFData 0x1a96f0 [0x3e143d5c]>{length = 4, capacity = 4, bytes = 0x000000ff}
9 : <CFString 0x3e53ce94 [0x3e143d5c]>{contents = "CGBitmapInfo"} = <CFNumber 0x1bace0 [0x3e143d5c]>{value = +8196, type = kCFNumberSInt32Type}
10 : <CFString 0x3e53cc64 [0x3e143d5c]>{contents = "CGImageCompatibility"} = <CFBoolean 0x3e144788 [0x3e143d5c]>{value = true}
11 : <CFString 0x3e53cda4 [0x3e143d5c]>{contents = "PixelFormat"} = <CFNumber 0x197650 [0x3e143d5c]>{value = +1111970369, type = kCFNumberSInt32Type}
12 : <CFString 0x3e53ce24 [0x3e143d5c]>{contents = "BitsPerBlock"} = <CFNumber 0x1ab9b0 [0x3e143d5c]>{value = +32, type = kCFNumberSInt32Type}
}

}
 propagatedAttachments=<CFBasicHash 0x1e3e80 [0x3e143d5c]>{type = mutable dict, count = 4,
entries =>
1 : <CFString 0x1da590 [0x3e143d5c]>{contents = "MetadataDictionary"} = <CFBasicHash 0x1e3890 [0x3e143d5c]>{type = immutable dict, count = 29,
entries =>
0 : <CFString 0x1da5d0 [0x3e143d5c]>{contents = "ExposureTime"} = <CFNumber 0x1e33e0 [0x3e143d5c]>{value = +0.08316987826086956470, type = kCFNumberFloat64Type}
1 : <CFString 0x1da5f0 [0x3e143d5c]>{contents = "ISOSpeedRating"} = <CFNumber 0x1e33f0 [0x3e143d5c]>{value = +419, type = kCFNumberSInt64Type}
3 : <CFString 0x1da610 [0x3e143d5c]>{contents = "Fnumber"} = <CFNumber 0x1e3400 [0x3e143d5c]>{value = +2.79999999999999982236, type = kCFNumberFloat64Type}
4 : <CFString 0x1da630 [0x3e143d5c]>{contents = "sensorDGain"} = <CFNumber 0x1e3410 [0x3e143d5c]>{value = +256, type = kCFNumberSInt64Type}
5 : <CFString 0x1da650 [0x3e143d5c]>{contents = "AGC"} = <CFNumber 0x1e3420 [0x3e143d5c]>{value = +1464, type = kCFNumberSInt64Type}
6 : <CFString 0x1da660 [0x3e143d5c]>{contents = "AEAverage"} = <CFNumber 0x1e3430 [0x3e143d5c]>{value = +169, type = kCFNumberSInt64Type}
7 : <CFString 0x1e3110 [0x3e143d5c]>{contents = "AFStable"} = <CFNumber 0x10cce0 [0x3e143d5c]>{value = +1, type = kCFNumberSInt32Type}
8 : <CFString 0x1e3130 [0x3e143d5c]>{contents = "TemporalMotion"} = <CFNumber 0x1e3880 [0x3e143d5c]>{value = +237247, type = kCFNumberSInt64Type}
9 : <CFString 0x1e3150 [0x3e143d5c]>{contents = "ShutterSpeedValue"} = <CFNumber 0x1e3450 [0x3e143d5c]>{value = +3.58779506948601589755, type = kCFNumberFloat64Type}
10 : <CFString 0x1e3170 [0x3e143d5c]>{contents = "FullyExposed"} = <CFNumber 0x10cce0 [0x3e143d5c]>{value = +1, type = kCFNumberSInt32Type}
11 : <CFString 0x1e3190 [0x3e143d5c]>{contents = "ExposureBias"} = <CFNumber 0x1e3460 [0x3e143d5c]>{value = +0.0, type = kCFNumberFloat64Type}
12 : <CFString 0x1e31b0 [0x3e143d5c]>{contents = "AWBRGain"} = <CFNumber 0x1e3470 [0x3e143d5c]>{value = +133, type = kCFNumberSInt64Type}
13 : <CFString 0x1e31d0 [0x3e143d5c]>{contents = "OverflowOccurred"} = <CFBoolean 0x3e144790 [0x3e143d5c]>{value = false}
14 : <CFString 0x1e31f0 [0x3e143d5c]>{contents = "FocalLength"} = <CFNumber 0x1e3480 [0x3e143d5c]>{value = +3.85000000000000008882, type = kCFNumberFloat64Type}
15 : <CFString 0x1e3210 [0x3e143d5c]>{contents = "AWBGGain"} = <CFNumber 0x1e3490 [0x3e143d5c]>{value = +64, type = kCFNumberSInt64Type}
16 : <CFString 0x1e3230 [0x3e143d5c]>{contents = "ApertureValue"} = <CFNumber 0x1e34a0 [0x3e143d5c]>{value = +3.00000000000000000000, type = kCFNumberFloat64Type}
17 : <CFString 0x1e3250 [0x3e143d5c]>{contents = "SensorID"} = <CFNumber 0x1e34b0 [0x3e143d5c]>{value = +13904, type = kCFNumberSInt64Type}
18 : <CFString 0x1e3270 [0x3e143d5c]>{contents = "SNR"} = <CFNumber 0x1e34c0 [0x3e143d5c]>{value = +35.13407451801569436611, type = kCFNumberFloat64Type}
19 : <CFString 0x1e3280 [0x3e143d5c]>{contents = "OneFrameAEMode"} = <CFNumber 0x10cce0 [0x3e143d5c]>{value = +1, type = kCFNumberSInt32Type}
20 : <CFString 0x1e32a0 [0x3e143d5c]>{contents = "CurrentFocusPosition"} = <CFNumber 0x1e34d0 [0x3e143d5c]>{value = +186, type = kCFNumberSInt64Type}
22 : <CFString 0x1e32c0 [0x3e143d5c]>{contents = "AEStable"} = <CFNumber 0x10cce0 [0x3e143d5c]>{value = +1, type = kCFNumberSInt32Type}
27 : <CFString 0x1e32e0 [0x3e143d5c]>{contents = "ispDGain"} = <CFNumber 0x1e34e0 [0x3e143d5c]>{value = +256, type = kCFNumberSInt64Type}
28 : <CFString 0x1e3300 [0x3e143d5c]>{contents = "AWBBGain"} = <CFNumber 0x1e34f0 [0x3e143d5c]>{value = +198, type = kCFNumberSInt64Type}
30 : <CFString 0x1e3320 [0x3e143d5c]>{contents = "FocusScoresArray"} = <CFArray 0x1e3550 [0x3e143d5c]>{type = immutable, count = 5, values = (
0 : <CFNumber 0x1e3500 [0x3e143d5c]>{value = +4835, type = kCFNumberSInt64Type}
1 : <CFNumber 0x1e3510 [0x3e143d5c]>{value = +5044, type = kCFNumberSInt64Type}
2 : <CFNumber 0x1e3520 [0x3e143d5c]>{value = +5486, type = kCFNumberSInt64Type}
3 : <CFNumber 0x1e3530 [0x3e143d5c]>{value = +5670, type = kCFNumberSInt64Type}
4 : <CFNumber 0x1e3540 [0x3e143d5c]>{value = +189347, type = kCFNumberSInt64Type}
)}
33 : <CFString 0x1e3340 [0x3e143d5c]>{contents = "AFStatus"} = <CFNumber 0x10ccf0 [0x3e143d5c]>{value = +2, type = kCFNumberSInt32Type}
34 : <CFString 0x1e3360 [0x3e143d5c]>{contents = "AELimitsReached"} = <CFNumber 0x10e3a0 [0x3e143d5c]>{value = +0, type = kCFNumberSInt32Type}
37 : <CFString 0x1e3380 [0x3e143d5c]>{contents = "FocusPeakSumArray"} = <CFArray 0x1e35d0 [0x3e143d5c]>{type = immutable, count = 5, values = (
0 : <CFNumber 0x1e3580 [0x3e143d5c]>{value = +8103, type = kCFNumberSInt64Type}
1 : <CFNumber 0x1e3590 [0x3e143d5c]>{value = +8217, type = kCFNumberSInt64Type}
2 : <CFNumber 0x1e35a0 [0x3e143d5c]>{value = +8342, type = kCFNumberSInt64Type}
3 : <CFNumber 0x1e35b0 [0x3e143d5c]>{value = +8461, type = kCFNumberSInt64Type}
4 : <CFNumber 0x1e35c0 [0x3e143d5c]>{value = +24617, type = kCFNumberSInt64Type}
)}
38 : <CFString 0x1e33a0 [0x3e143d5c]>{contents = "BrightnessValue"} = <CFNumber 0x1e3600 [0x3e143d5c]>{value = -0.40476958246484440185, type = kCFNumberFloat64Type}
39 : <CFString 0x1e33c0 [0x3e143d5c]>{contents = "AWBStable"} = <CFNumber 0x10cce0 [0x3e143d5c]>{value = +1, type = kCFNumberSInt32Type}
}

4 : <CFString 0x1e37f0 [0x3e143d5c]>{contents = "CVImageBufferChromaSubsampling"} = <CFString 0x1e3a20 [0x3e143d5c]>{contents = "4:2:0"}
5 : <CFString 0x1e3820 [0x3e143d5c]>{contents = "CVImageBufferChromaLocationTopField"} = <CFString 0x1e3a30 [0x3e143d5c]>{contents = "Center"}
6 : <CFString 0x1e3850 [0x3e143d5c]>{contents = "CVImageBufferChromaLocationBottomField"} = <CFString 0x1e3a30 [0x3e143d5c]>{contents = "Center"}
}
 nonPropagatedAttachments=<CFBasicHash 0x1d1f70 [0x3e143d5c]>{type = mutable dict, count = 0,
entries =>
}
 iosurface=0x0>

投稿者 aka : 時刻 20:46 | 固定リンク | コメント (0) | トラックバック (0)

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _