我对iOS开发是相对较新的,但对于(面向对象的)编程而言,我并不是新的。

我正在编写一种记录器应用程序,在此方面,我需要您的帮助:
我尝试将AVAudioPlayer对象外包给一个额外的类AudioPlayer,以便可以从不同的控制器访问它。
除了播放任何声音外,我会做所有应做的事情。
这是我的问题的简化项目:
ViewController.m:

- (IBAction)playButtonPressed:(id)sender
{
    NSArray *pathComponents = [NSArray arrayWithObjects:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],@"AudioMemo.m4a",nil];
    NSURL *fileURL = [NSURL fileURLWithPathComponents:pathComponents];

    AudioPlayer *myPlayer = [[AudioPlayer alloc] init];
    [myPlayer myPlayAudio:fileURL];
}

文件的其余部分为空/标准。
ViewController.h:
#import <UIKit/UIKit.h>
#import "AudioPlayer.h"

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UIButton *playButton;

- (IBAction)playButtonPressed:(id)sender;

@end
AudioPlayer.m:
#import "AudioPlayer.h"

@implementation AudioPlayer

@synthesize aPlayer;

-(id) myPlayAudio:(NSURL *)myURL
{
    NSLog(@"in myPlayAudio; before play");

    NSError *err = nil;

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];
    [audioSession setActive:YES error:&err];
    if(err)
    {
        NSLog(@"%@",err);
    }
    aPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:myURL error:&err];
    if(err)
    {
        NSLog(@"%@",err);
    }
    [aPlayer play];

    NSLog(@"in myPlayAudio; after play");

    //[audioSession setActive:NO error:&err];

    return err;
}

@end
AudioPlayer.h:
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

@interface AudioPlayer : NSObject <AVAudioPlayerDelegate> {
    AVAudioPlayer *aPlayer;
}

@property (nonatomic, strong) AVAudioPlayer *aPlayer;

-(id) myPlayAudio:(NSURL *) myURL;

@end

我在.plist文件中添加了AudioToolbox Framework,激活了iTunes文件共享,并将AudioMemo.m4a文件加载到了documents文件夹中。

它显示了两个NSLogs(播放前+播放后),但不会发出任何噪音。我知道我没有启用iPhone的扬声器,在这种情况下,我想使其保持简单。
我当然检查了音量,静音模式等。

当我将所有内容都设置为本地(将所有内容都放入ViewController.m)时,就像网上的大多数教程一样,它可以正常工作。

我进行了搜索,但之前没有发现此问题,因此如果有人可以帮助我,我将非常感激。

最佳答案

如我所见,您正在使用ARC,因此该对象:

AudioPlayer *myPlayer = [[AudioPlayer alloc] init];

分配后不久释放。将其保留在属性中,而不是局部变量中,它应该可以工作。

关于ios - 类外包时无法播放AVAudioPlayer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19706441/

10-16 12:43