我对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
我添加了AudioToolbox Framework
,在.plist文件中激活了iTunes文件共享,并将AudioMemo.m4a
文件加载到文档文件夹中。
它显示两个NSLog(前+后),但不会产生任何噪音。我知道我没有启用iPhone的扬声器,我想在这种情况下保持简单。 当然我检查了音量,静音模式等。
当我将所有内容都放在本地时(将所有内容放在ViewController.m
中),就像网上的大多数教程一样,它运行正常。
我搜索过,但之前没有发现这个问题,所以如果有人能帮助我,我会非常感激。
答案 0 :(得分:2)
我认为你正在使用ARC,所以这个对象:
AudioPlayer *myPlayer = [[AudioPlayer alloc] init];
在您分配后立即发布。将它保存在属性而不是局部变量中,它应该可以工作。