web-dev-qa-db-ja.com

AVAudioPlayerでサウンドが再生されない

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を使用することに関連していませんか?

前もって感謝します。

57
msoler

私は解決策を見つけましたが、それは言及も考えもしなかった何かに関連しています。自動参照カウント(ARC)でコンパイルしています。

ARCはリリースコールをオーディオプレーヤーに挿入するため、作成されたメソッドを離れた直後に割り当てが解除されます。 AVAudioPlayerとは関係ありませんが、ARCとは関係ありません。

この問題を解決するため、サウンドを処理するクラスにAVAudioPlayer属性を作成し、ARCによってリリースされないようにしました。少なくとも、このクラスのインスタンスがリリースされるまでリリースされません。

ARCの詳細については、 Automatic Reference Counting:Zeroing Weak References にこの問題が発生した理由の詳細を参照してください。

151
msoler

そのとおり; ARCも私のコードの理由でした。

プロパティを導入しました:

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

そしてそれはすべてがうまくいくようにしました。

35
uem

これを使用すると、確実に動作します。..

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];
26
Anshul

AVAudioSessionを構成しましたか?

私は同様の問題を抱えていて、次のようなものを使用して修正しました:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];

または

[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];

それが役に立てば幸い。

17
nano

クラススコープでaudioPlayer varが宣言されていても、再生されません。少なくともiOS 10 iPhone 5c物理デバイス。

play()結果はtrueであるため、エラーは発生していないようです。

これを追加する必要がありました(Swift 3、4)。これでサウンドが正しく再生されます。

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayback)
3
Vito Valov

同じ問題がありました。 .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];
0
Pinal Panchani

シンプルなオーディオプレーヤー用のオープンソースプロジェクトを作成しました。 iOSでのオーディオの再生に問題がある場合(バックグラウンドでも)、それを見てください: https://github.com/wzbozon/DKAudioPlayer

0
wzbozon

AVPlayerViewControllerfromAVKitの代わりに、オーディオとビデオの両方に使用できます。コードはSwiftとObjective C here の両方で利用可能です。

0
zeeawan

私は同じ問題に直面していたので、しばらくページにとどまってください。スリープを使用して解決します。


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);

0
Sumit Shastri