AVFoundation
フレームワークを使用していくつかのサウンドを再生する必要があるiOSアプリケーションで作業しています。 Xcode 4のワークスペース構造には、2つのプロジェクトが含まれています。
ユーティリティライブラリをビルドすると、メインアプリケーションでフレームワークとして使用される静的ライブラリが作成されます。
そのため、以下のコードを使用してメインアプリケーション内でサウンドを再生しようとすると、期待どおりに動作します。
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *path = [NSString stringWithFormat:@"%@/sound.mp3", resourcePath];
NSURL *url = [NSURL fileURLWithPath:path];
NSError *error = nil;
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url
error:&error];
[audioPlayer play];
対照的に、上記と同じコードを使用してユーティリティライブラリ内でまったく同じサウンド(または他のサウンド)を再生しようとすると、エラーはnilおよび- audioPlayerプロパティ値は正しい値です(チャンネル数、持続時間)。
AVFoundation
フレームワークが両方のプロジェクトにあることを確認しました。
また、私のクラスはAVAudioPlayerDelegate
プロトコルを使用し、次の2つのメソッドを実装します。
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
サウンドを再生しようとした後、これらのメソッドは呼び出されません。
代わりにAudioToolbox
フレームワークを使用すると、サウンドが再生されます。しかし、私はいくつかの理由でAVFoundation
の使用に興味があります。
何が起こっているのか考えていますか? AVFoundation
について何か不足していますか?静的ライブラリ内からAVAudioPlayer
を使用することに関連していませんか?
前もって感謝します。
私は解決策を見つけましたが、それは言及も考えもしなかった何かに関連しています。自動参照カウント(ARC)でコンパイルしています。
ARCはリリースコールをオーディオプレーヤーに挿入するため、作成されたメソッドを離れた直後に割り当てが解除されます。 AVAudioPlayer
とは関係ありませんが、ARCとは関係ありません。
この問題を解決するため、サウンドを処理するクラスにAVAudioPlayer
属性を作成し、ARCによってリリースされないようにしました。少なくとも、このクラスのインスタンスがリリースされるまでリリースされません。
ARCの詳細については、 Automatic Reference Counting:Zeroing Weak References にこの問題が発生した理由の詳細を参照してください。
そのとおり; ARCも私のコードの理由でした。
プロパティを導入しました:
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
そしてそれはすべてがうまくいくようにしました。
これを使用すると、確実に動作します。..
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
NSURL *url = [NSURL fileURLWithPath:@"path of the sound file :)"];
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[_player setDelegate:self];
[_player prepareToPlay];
[_player play];
AVAudioSessionを構成しましたか?
私は同様の問題を抱えていて、次のようなものを使用して修正しました:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];
または
[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];
それが役に立てば幸い。
クラススコープでaudioPlayer varが宣言されていても、再生されません。少なくともiOS 10 iPhone 5c物理デバイス。
play()
結果はtrue
であるため、エラーは発生していないようです。
これを追加する必要がありました(Swift 3、4)。これでサウンドが正しく再生されます。
let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayback)
同じ問題がありました。 .hファイルに次の行を追加して解決しました。
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
そして.mファイルで:
NSError *error;
NSString *soundFilePath = [NSString stringWithFormat:@"%@/dancepechance.mp3",
[[NSBundle mainBundle] resourcePath]];
NSURL *url = [NSURL fileURLWithPath:soundFilePath];
self.audioPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:url
error:&error];
NSLog(@"Error %@",error);
[self.audioPlayer prepareToPlay];
[self.audioPlayer play];
シンプルなオーディオプレーヤー用のオープンソースプロジェクトを作成しました。 iOSでのオーディオの再生に問題がある場合(バックグラウンドでも)、それを見てください: https://github.com/wzbozon/DKAudioPlayer
AVPlayerViewControllerfromAVKitの代わりに、オーディオとビデオの両方に使用できます。コードはSwiftとObjective C here の両方で利用可能です。
私は同じ問題に直面していたので、しばらくページにとどまってください。スリープを使用して解決します。
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"sounds-1027-are-you-kidding"
ofType:@"mp3"]];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:url
error:nil];
[audioPlayer play];
sleep(2);