Ios 如何将AVPlayer子类化?
我正在创建一个子类Ios 如何将AVPlayer子类化?,ios,design-patterns,avplayer,subclassing,Ios,Design Patterns,Avplayer,Subclassing,我正在创建一个子类AVPlayer,这样我就可以创建一个方法,在音乐队列中向后跳过。我想建立一个功能齐全的音乐播放器,使用来自用户iPod的音乐。因此,这意味着AVAudioPlayer以及MPMusicPlayerController已退出。核心音频也让我感到害怕,所以我希望现在能避开它 我已经考虑过使用categories来扩展AVPlayer类,但是我需要我的子类有一个class变量来存储mpmediateitemcollection,所以我认为子类比添加一个categority更有意义
AVPlayer
,这样我就可以创建一个方法,在音乐队列中向后跳过
。我想建立一个功能齐全的音乐播放器,使用来自用户iPod的音乐。因此,这意味着AVAudioPlayer
以及MPMusicPlayerController
已退出。核心音频也让我感到害怕,所以我希望现在能避开它
我已经考虑过使用categories来扩展AVPlayer
类,但是我需要我的子类有一个class变量来存储mpmediateitemcollection
,所以我认为子类比添加一个categority更有意义
这是我的例外
!![在此处输入图像描述][1]
这是我的appDelegate代码,我在这里设置了AVPlayer
,它被子类化为SWPlayer
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
#import "SWPlayer.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,retain)SWPlayer *bookPlayer;
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Setup AudioSession
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
// Allow the audio to mix with other apps (necessary for background sound)
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);
//Grab some Songs to Test with
MPMediaQuery *query = [MPMediaQuery songsQuery];
NSArray *collection = [query items];
//Setup bookPLayer to Test
MPMediaItem *item = [collection objectAtIndex:5];
NSLog(@"%@",[item valueForProperty:MPMediaItemPropertyTitle]);
NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
self.bookPlayer = [[SWPlayer alloc]initWithURL:url];
[bookPlayer play];
[bookPlayer skipForwards];
return YES;
}
#导入
#进口
#进口
#进口
#导入“SWPlayer.h”
@接口AppDelegate:UIResponder
@属性(强,非原子)UIWindow*window;
@财产(非原子,保留)SWPlayer*bookPlayer;
@结束
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
{
//设置音频会话
n错误*会话错误=nil;
[[AVAudioSession sharedInstance]setDelegate:self];
[[AVAudioSession sharedInstance]设置类别:AVAudioSessionCategoryPlayback错误:&sessionError];
//允许音频与其他应用程序混合(背景声音所需)
UInt32默认路由=1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMix with Others、sizeof(doChangeDefaultRoute)和doChangeDefaultRoute);
//抓取一些歌曲进行测试
MPMediaQuery*query=[MPMediaQuery-songsQuery];
NSArray*集合=[查询项];
//设置要测试的bookPLayer
MPMediaItem*item=[集合对象索引:5];
NSLog(@“%@,[item valueForProperty:MPMediaItemPropertyTitle]);
NSURL*url=[item valueForProperty:MPMediaItemPropertyAsetUrl];
self.bookPlayer=[[SWPlayer alloc]initWithURL:url];
[图书播放器播放];
[bookPlayer skipForwards];
返回YES;
}
这是我最基本的子类
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
@interface SWPlayer : AVPlayer
@property(nonatomic,retain)MPMediaItemCollection *mediaItemCollection;
-(void)skipForwards;
-(void)skipBackwards;
@end
#import "SWPlayer.h"
@implementation SWPlayer
@synthesize mediaItemCollection;
-(void)skipForwards{
NSLog(@"SWPlayer called skipForward method");
}
-(void)skipBackwards{
NSLog(@"SWPlayer called skipBackward method");
}
@end
#导入
#进口
@界面SWPlayer:AVPlayer
@属性(非原子,保留)MPMediaItemCollection*mediaItemCollection;
-(无效)向前滑行;
-(无效)向后滑动;
@结束
#导入“SWPlayer.h”
@SWPlayer的实现
@综合媒体收藏;
-(无效)向前滑行{
NSLog(@“SWPlayer称为skipForward方法”);
}
-(无效)向后滑动{
NSLog(@“SWPlayer调用skipBackward方法”);
}
@结束
音乐使用我的
AVPlayer
子类播放。问题是,只要我调用SWPlayer
的skipForward
方法,就会出现无法识别的选择器错误,应用程序就会崩溃。我错过了什么 问题在于,您正在调用的playerWithURL
方法归AVPlayer
所有,并且将始终返回AVPlayer
,即使在子类化时也是如此,除非您重写它。尝试使用以下工具创建它:
self.bookPlayer = [[SWPlayer alloc] initWithURL:url];
np,感谢您重新设置问题格式,以便其他人可以轻松搜索它!重新格式化很好,但我花了一段时间才注意到Peter提到了“playerWithURL”-从原始帖子中删除它使我很难看出问题出在哪里。