家で動画系のアプリを作っているのですが、AVFoundationフレームワークを使えば実装できるということはわかっていたので、
とりあえず重要そうなAVCapture系のクラスをちょこちょこと調べてました。
[obj-c] AVFoundationのAVCapture〜クラスのメモ
AVFoundationのリファレンスをがんばって翻訳しつつクラスの役割を見ていくところからはじまり、
appleのサンプルであるAVCamを読み解いていく感じでスタート。
読んで試してなんとなくAVFoundationのAVCapture〜系のクラスの基本的な処理は理解できてきて、
いざ作りたいもののテスト版を作っていこうという感じだったのですが、
- ・AVCaptureVideoDataOutputクラス
- ・AVCaptureMovieFileOutputクラス
の2つのアウトプットが共存できないという、、、
2つを同時に使っているサンプル無いな~とは思っていたのですが、できないんですね。
この2つを組み合わせればいけるじゃん!とか内心思ってたのが外れ、ちょっとどうしようという感じでした。
で、気を取り直して別方向からのアプローチに切り替え、またちょこちょこ調べるうちに、
AVAssetWriterを使えばいけそうという感じになったので、
- ・AVAssetWriterクラス
- ・AVAssetWriterInputクラス
を使った実装を中心で調べました。 やっぱり日本語の情報は少ないですね、、
appleのサンプルのRosyWritterというのが、自分のやりたいことに近かったのでそれを参考に勉強。
RosyWritterを見て、要は、
CMSampleBufferRefさえ用意できれば、どんなに加工したものでも最終的に動画データとして保存できる。
という感じのことがわかりました。
その考えを元に良いやり方ないかな〜とググっていたら、
- ・openGLからCMSampleBufferRefを創りだす方法
- ・CGImageからCVImageBufferに変換する方法
がStack Overflow上でみつかりました。 さすが!
後者の方法からテストし、
結果的には
AVAssetWriterInputPixelBufferAdaptor
というクラスも使うことで
移している映像を毎フレームキャプチャして、それを画像に変換、最終的にそれを全部くっつけて1つにしたmovデータで保存
という実装ができました。
最終的なものには画像に変換したものに加工処理を加える予定です。
保存された動画はいいのですが、プレビュー用のリアルタイムでキャプチャしているものをUIViewで表示している方の処理速度的にちょっと微妙で、
そこだけopenGLで描画しようかなというところです。
今ここ
ここまでくるのになんだかんだで結構時間かかった、、
頭の整理をかねてメモ書き。
またちょっと進んだ〜
自分の管理してるFacebookページの広告を3月〜4月の間でだしてみました。
- ・予算 : 3,000
- ・タイプ : CPC(クリック回数によって支払額を決めるクリック単価広告)
結果
予算がかなり低いので全体的な数値は低いですが、、
広告をクリックしてくれた人の半分以上がFacebookページをいいね!してくれた結果になりました。
これは思ってた以上です。
CTR(インプレッション数に対するクリック率)が低いのは何か修正の余地がありそうですが、もうちょっと試してみないとなんとも。
インプレッション数がこの予算でこの数字がいいのかどうなのかももうちょっと様子みですね。
また来月CPCで広告だしてみようかと思います。 5000円くらいは、、!
iOS Developer ProgramにあるAVCamを理解しないと次に作りたいアプリをしっかりと作れないので、
理解するためにいろいろとメモっていく予定です。
最初はやっぱりAVFoundationのAVCapture〜を理解するところから!今更感もありますが、きにしません。
ググればいろいろと情報は出てくるけども、とりあえず参考サイト見たり翻訳しながらメモ。
AVFoundation の AVCapture〜クラス
オーディオデータやビデオデータを扱うクラス
必要なフレームワークは
- ・AVFoundation
- ・CoreVideo
- ・CoreMedia
各クラスの使いそうなメソッドやプロパティ
AVCaptureSession
入力データと出力データの調整をする
中心的クラス
– canAddInput:
与えられた入力データがセッションに追加できるかどうか
– addInput:
与えられた入力データをセッションに追加する
– removeInput:
与えられた入力データをセッションから削除
– canAddOutput:
与えられた出力データがセッションに追加できるかどうか
– addOutput:
与えられた出力データをセッションに追加する
– removeOutput:
与えられた入力データをセッションから削除
– startRunning:
フローの開始
– stopRunning:
フローの停止
beginConfiguration
呼び出した後にキャプチャデバイスの削除や追加をする
commitConfiguration
beginConfigurationの変更をまとめて適用する
running
セッションが実行中かどうか確認
AVCaptureDevice
入力データ(オーディオやビデオのデバイス)を取得
オブジェクトは入力デバイスごとに1つずつ存在する
+ defaultDeviceWithMediaType:
指定したタイプのメディアデバイスを取得する事ができる
+ devicesWithMediaType:
指定したタイプのキャプチャを入力できるメディアデバイスの配列を取得する事ができる
(カメラの表と裏)
AVCaptureDeviceInput
取得した入力データをAVCaptureSessionに渡す
リファレンスに載ってないクラス?
deviceInputWithDevice:
AVCaptureDeviceのインスタンスとエラー処理用のインスタンスを渡す
AVCaptureVideoDataOutput
出力データを受け取る
videoSettings
圧縮の設定を行う
alwaysDiscardsLateVideoFrames
処理が遅れるばあいにビデオフレームを落とすかどうか?
デフォルトはYES
– setSampleBufferDelegate:queue:
デリゲートとコールバック用のキューの設定
AVCaptureConnection
入力データと出力データの接続状態
videoMirrored
鏡像表示されているかどうか
videoOrientation
データの向き
AVCaptureStillImageOutput
メタデータを使って静止画をキャプチャするために使用する
– captureStillImageAsynchronouslyFromConnection:completionHandler:
静止画のキャプチャをする
+ jpegStillImageNSDataRepresentation:
キャプチャしたデータの取得
outputSettings
圧縮の設定を行う
AVCaptureVideoPreviewLayer
カメラで録画している内容を表示する
AVCaptureMovieFileOutput
ムービーファイルに出力する場合に使用
startRecordingToOutputFileURL:recordingDelegate:
QuickTimeムービーの録画を開始する
AVCaptureAudioDataOutput
キャプチャ中のオーディオデータを処理する場合に使用
間違ってたり、このメソッド重要だろうとかあったら教えてください。
ちょこちょこ書き足していく予定です。
参考
・リファレンス
・http://news.mynavi.jp/column/iphone/040/index.html
・http://news.mynavi.jp/column/iphone/041/index.html


picrollはスクロールフォトビューワーです。
写真の閲覧を快適にします。
横スワイプでは無く、縦スクロールで写真を閲覧します。
よかったら使ってみてください。
早速紹介していただきました。
・横スワイプではなく、縦スクロールで閲覧するフォトビューワー『picroll』 – リニューアル式
本当にありがとうございます!
support page
http://apps.azzip-azzip.com/ios/jp/picroll/