iOSプロジェクトにFFmpegを組み込む

iPhone

iOSプロジェクトにFFmpegを組み込んでみました。
以下はMac OS X 10.8.5/Xcode 5.0.2で確認した内容です。

FFmpegライブラリのビルド

まず、FFmpegのユニバーサルライブラリをMac上でビルドします。

下記リンク先からgas-preprocessor.plを取得します
https://github.com/mansr/gas-preprocessor.

gas-preprocessor.plに実行権限を付与します

 chmod +x gas-preprocessor.pl 

gas-preprocessor.plを/usr/local/bin/に配置します。

下記からシェルスクリプトを取得します
https://gist.github.com/m1entus/6983547

ダウンロードしたシェルスクリプトを実行するとffmpegがダウンロード・ビルドされます。

 sh build-ffmpeg.sh

下記ディレクトリにユニバーサルライブラリとヘッダーファイルが配置されます。

 build/built/universal/

iOSプロジェクトへの組み込み

Xcodeで新規プロジェクトを作成します。

ライブラリのリンク

build/built/universal/lib以下に生成された.aファイルを
プロジェクトナビゲーターのFrameworksフォルダ以下にドラッグ&ドロップします。
必要に応じて「Copy items into destination group’s folder (if needed)」にチェックをいれます。

ライブラリのヘッダー追加

build/built/universal/includeをプロジェクトナビゲーターのブロジェクト名フォルダ以下にドラッグ&ドロップします。

プロジェクトのビルド設定

プロジェクトナビゲーターのプロジェクトをクリックするとエディタ部分にプロジェクト設定が表示されます。
Build Settingsタブを選択し、”Header Search Paths”を検索して、ffmpegのヘッダーを格納したフォルダ(例 $(SRCROOT))を、recursive(再帰)に設定して追加します。
次にBuild Phasesタブを選択し、libbz2.dylibとlibz.dylibを追加します。

テストコード作成・動作確認

AppDelegation.mを開き下記を追加します。

 #include "avformat.h"

didFinishLaunchingWithOptions関数内に下記を追加します。

 av_register_all();
 

これでビルド・実行すると、libavformatの初期化され、全てのmuxers, demuxers, protocolsの登録ができるところまで動作確認できます。

iOS8.4にアップデート iPhone iTunes 曲をシャッフルできなくなった?(ToT)

iOS8.4にアップデート iPhone iTunes 曲をシャッフルできなくなった?(ToT)な時

みなさんこんにちは。
先日、iOS8.4のアップデートがありましたが、
いかがお過ごしでしょうか。

今回からApple Musicが始まったみたいですが、
こいつのせいでiTunesアプリの使い勝手がガラリと変わってしまいました。

前回までの使い勝手に慣れきっていたし、Apple Musicは使わないから邪魔でしょうがありません:(
一番腹が立ったのは、探せども探せどもシャッフルボタンが見つからないことでした…!

同じ思いをする人が絶対いると思ったのでシャッフルボタンがどこにあるのかの記事を書きました。

以下、手順です。

①何でもいいので曲を再生します
②すると下の方に再生中の曲が表示されます
③その再生中の曲の欄をタップし、指を離さず、ずむむっと上に引っ張り上げます
④そうすると馴染みのある画面がおでましします
⑤この画面の最下部に→が絡み合ってるボタンがあります
⑥こいつがシャッフルボタンです

アルバム毎、アーティスト毎、曲毎でシャッフルしたいと思いますが、
iTunesアプリを立ち上げた一番最初の画面の真ん中のアーティストというボタンがあります。
そこをタップすると曲毎、アルバム毎等変更することができます。

それでは皆さん、良いシャッフルライフを。

by 芦野輝明
twitter→https://twitter.com/teriyakiegg

iPhone

  • アーティストを選んでもアルバム内でしかシャッフルされません。しかも勝手にアルバム内をリピートされている模様・・・ — あああ {2015-07-11 (土) 00:04:26}
  • 画面中心にあるアーティストの赤い文字を押すと選べるんですねこれは気付きにくいので本当助かりました! — 助かりました {2015-07-14 (火) 08:46:37}
  • 本当に助かりました。ありがとうございます。 — {2015-08-10 (月) 23:02:15}

iOS7にするとナビゲーションバーに下のビューが被ってしまう!

iPhone

iPhoneアプリ開発者の方は、iOS7にして作ったアプリを確認してみたら・・・

なんとナビゲーションバーの下にビューがかぶってしまっているのです。
iOS6までなら、ビューのy軸0はナビゲーションバーの下から始まっていたのですが・・・。
でもご安心ください。
以下のコードを書けば、あなたも安心です。

 float systemVersion = [UIDevice currentDevice] systemVersionfloatValue];
 if (systemVersion >= 7.0)
 {
     navigationBar.translucent = NO;
 }

これをviewDidLoad内のトップに書いてあげれば、ナビゲーションバーの下からちゃんとビューが表示されます!

これで、iOS7でもiOS6でもナビゲーションバーの下からビューが表示されます!

iOS5での顔検証

iPhone

iOS 5 になって CIDetector というクラスを使って画像の顔認識ができるようになりました。
ということで、顔の上にUIViewを表示してみよう!

まず、をインポートします。

※注意として、CoreImageは左下の座標が(0,0)になります。(通常UIKitは、左上が(0,0))

 CIImage* image = [CIImage imageWithCGImage:【顔の写った写真を表示するUIImageView】.image.CGImage];

※精度がhighの顔認識(CIDetectorTypeFace)を生成

 CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:[NSDictionary dictionaryWithObject:
 CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];

※認識された顔のパーツを配列に入れます
 NSArray* features = [detector featuresInImage:image];

※CoreImageは、左下の座標が (0,0) となるので、顔認証された画像を描画する前に、
UIKitと同じ座標関係にしましょう!
この時、そのまま逆さまにしただけだと、他のオブジェクトも逆さまになってしまうので、
わけがわからなくなる!

 CGAffineTransform transform = CGAffineTransformMakeScale(1, -1);
 transform = CGAffineTransformTranslate(transform, 0, -facePicture.bounds.size.height);

※この処理を顔の各パーツごとに繰り返します。
 CIFaceFeature は目、鼻、口が検出されたかをBOOlで返してくれ、
それぞれのサイズも教えてくれるので便利です!
 今回は顔全体と鼻だけを例にとります。

for(CIFaceFeature* faceFeature in features)
{
※顔のRectを取得し、UIKitの座標に合わせます
 const CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform);

※顔と同じ大きさのUIViewを生成します
 UIView* faceView = [[UIView alloc] initWithFrame:faceRect];
 faceView.layer.borderWidth = 1;
 faceView.layer.borderColor = [[UIColor yellowColor] CGColor];
 faceWidth = faceFeature.bounds.size.width;

※これで顔の周りにボーダーを表示され、顔が認証されたとわかります!

 [facePicture addSubview:faceView];

 

※口が検出されてたら・・・の処理
if(faceFeature.hasMouthPosition)
{
※口の座標をゲットして、UIKitの座標に変換!
 const CGPoint mouthPos = CGPointApplyAffineTransform(faceFeature.mouthPosition, transform);

※顔の大きさに応じて口の上に表示するUIViewの大きさを変えよう!

 UIView* mouth = [[UIView alloc] initWithFrame : CGRectMake(mouthPos.x – faceWidth*MOUTH_SIZE_RATE*0.5,
mouthPos.y – faceWidth*MOUTH_SIZE_RATE*0.5,
faceWidth*MOUTH_SIZE_RATE,
faceWidth*MOUTH_SIZE_RATE)];

 mouthPoint = CGPointMake(mouthPos.x – faceWidth*MOUTH_SIZE_RATE*0.5, mouthPos.y – faceWidth*MOUTH_SIZE_RATE*0.5);

 UIColor* pink = [UIColor colorWithRed:1 green: 0.6 blue:0.8 alpha:1];

 mouth.backgroundColor = [pink colorWithAlphaComponent:0.3];
 mouth.layer.cornerRadius = faceWidth*MOUTH_SIZE_RATE*0.5;

 [facePicture addSubview:mouth];

 }
}

これで、顔の周りにボーダー、口にピンクのUIViewが表示されるかと思います!
簡単に顔を認証できます!

iOS UIKeyboardTypeEmailAddressを指定しても日本語キーボードが表示される

iPhone

UITextFieldのkeyboardTypeにUIKeyboardTypeEmailAddressを指定しても日本語キーボードが表示されてしまいます。

ユーザーが手動で英語キーボードに切り替えれば、メールアドレス入力用キーボードが表示されますが、アプリ側で自動で切り替えることはできません。
標準アプリの電話→連絡先でメールを入力する場合でも、同じ挙動です。
人によってフリック入力するか英語キーボードで入力するか好みが分かれるので、このような仕様になっているのではないかと思います。

現時点(iOS 6.1)では、アプリ側でキーボードの言語を切り替えることは許されていないので、カスタムキーボードをつくるしか回避策はありません。

  • 他のサイトではUITextFieldのkeyboardTypeにUIKeyboardTypeEmailAddressを指定すれば出来ると書いてあるので、何故出来ないのか悩んでいました。ここを見つけてやっと納得しました。ありがとうございます。ただ、何故他では出来ると書いているのか?旧iOSなら出来たのかな? — at {2014-02-21 (金) 10:32:48}