21

AVAudioPlayerを使用して動作中のアプリケーションにサウンドを追加すると、prepareToPlayで停止/ハングします。また、プレイ中に停止/ハングすることに注意してください。「プログラム実行の継続」を数回押すと、アプリケーションが再開されます。この問題は、シミュレータでプログラムを実行している場合にのみ発生します。

Xcode4.6の使用

コードスニペット:

ViewController.h

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface ViewController : UIViewController <AVAudioPlayerDelegate>

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()
{
}

@property (nonatomic, strong) AVAudioPlayer *audioPlayer;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self initilizeAudio];
}

- (void)initilizeAudio
{
    NSError *error = nil;
    NSURL *audioURL = [[NSBundle mainBundle] URLForResource:@"Background" withExtension:@"mp3"];

    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error];
    if (error)
    {
        NSLog(@"Error in audioPlayer: %@", [error localizedDescription]);
    }
    else
    {
        [self.audioPlayer setDelegate:self];
        [self.audioPlayer prepareToPlay];
    }
}

@end

スタックトレース

0 __cxa_throw
21 -[AVAudioPlayer prepareToPlay]
22 -[ViewController viewDidLoad]
.
.
.
4

2 に答える 2

68

問題は、通常、ブレークポイントを「すべての例外」に設定して開発し、実際にスローされた例外は__cxa_throwでした。これは、AVAudioPlayerの実装に使用されるC++ライブラリにあることが明らかになりました。ブレークポイントを「AllObjective-CExceptions」に変更すると、プログラムは正常に実行されました。(これは、ブレークポイントを編集し、[例外]フィールドをObjective-Cに変更することで実行できます。

于 2013-03-14T07:27:16.623 に答える
4

私もこの問題を抱えていました。上記の解決策は機能しますが、それを修正するためのより良い方法があると思います。

著者が無視することを提案するエラーは、Macが機能していないデバイスにオーディオを送信しようとしていることを示しています。コードはCで書かれていると思いますので、例外を「objective-conly」にすると例外は無音になります。

本当の解決策は、オーディオデバイスを再び機能させることです。私にとって、失敗の理由は、オーディオの入力と出力を切り替えていたためですが、(どうやら)IOSシミュレーターは古い設定を記憶していました。したがって、このスレッドでさまざまな手順を試したとき:

エラー「!dat」が(null)オーディオデバイスのサンプルレートを設定しようとしています

オーディオが再び機能するようになり、例外のスローが停止しました。

于 2013-08-05T00:21:31.373 に答える