エラー詳細と解決した方法についてメモしておきます。
エラー詳細
iPod touch (3rd Generation) で映像・音声を受信+再生する場合にのみエラーが発生。
マイク付きイヤフォン接続時は、エラーとならない。
マイクなしイヤフォン接続時は、エラーとなる。
イヤフォン非接続時は、エラーとなる。
エラー時のデバッグコンソールは次の通り。
2011-02-17 21:49:30.800 SamplePlayer[340:307] An instance 0x1ecd00 of class AVPlayerItem was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info: <NSKeyValueObservationInfo 0x1edbe0> ( <NSKeyValueObservance 0x1e9920: Observer: 0x1d4ac0, Key path: timedMetadata, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x1d4ef0> <NSKeyValueObservance 0x1edba0: Observer: 0x1e8600, Key path: presentationSize, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x115540> )
各端末のオーディオスペックは次の通り。
- iPhone 3G/3GS/4
- マイク、スピーカー内蔵
- iPod touch 3rd Generation
- スピーカーのみ内蔵
- iPod touch 4th Generation
- マイク、スピーカー内蔵
- iPad 1st/2nd Generation
- マイク、スピーカー内蔵
解決した方法
受信再生するソースの中に次のコードがあったのですが、ここをコメントアウトすることで解決しました。
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);「kAudioSessionCategory_PlayAndRecord」というのは録音再生両方必要なときの設定です。
録音送信するアプリと受信再生するアプリでいくつかのソースコードを共有していたのですが、その影響で、本来録音は関係ないはずの再生側アプリで「kAudioSessionCategory_PlayAndRecord」を設定してしまっていたようです。
動作対象端末のほとんどにマイクが内蔵されているため、上記の間違った設定でもほとんどの端末では問題なく動作できていたが、iPod touch 3rdのみマイクが内蔵されていないためにエラーが発生した、というわけでした。
------
iPhoneオーディオプログラミングに関しては次の本がオススメ。
永野 哲久 / ソフトバンククリエイティブ / 売り上げランキング: 28301
おすすめ度の平均:
iPhoneプログラマは持っていて損のない良書オーディオ系アプリ開発のバイブル
あまり知られたくない本です。
必要な事は書かれてます。
明快な説明と実践的なサンプルコードがすばらしい
posted with amazlet at 2011.2.18
0 件のコメント:
コメントを投稿