2012-01-27 5 views
1

skipsBackwards 음악 대기열에있는 메서드를 만들 수 있도록 AVPlayer 하위 클래스로 작업 중입니다. 나는 사용자 iPod에서 음악을 사용하는 완전히 기능적인 음악 플레이어를 만들고 싶습니다. 즉, AVAudioPlayer이 나오고 MPMusicPlayerController이 나왔습니다. 또한 Core Audio는 나를 무서워하므로 지금 당장은 그 일을 분명히하기를 희망합니다.어떻게 AVPlayer를 서브 클래 싱합니까?

나는 카테고리를 사용하여 클래스를 확장하는 것으로 생각했지만 클래스를 추가하려면 MPMediaItemCollection을 저장할 클래스가 있어야합니다. 그래서 카테고리를 추가하는 것이 가장 중요합니다.

은 여기 내 예외

입니다! I 설치 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; 
} 

로 서브 클래 싱 된 AVPlayer 내 아주이다 [1]

가 여기 내 AppDelegate에 코드입니다 [여기 이미지 설명을 입력합니다] 기본 서브 클래스 ...

#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 

AVPlayer의 하위 클래스를 사용하여 음악이 재생됩니다. 문제는 skipForward 메서드를 SWPlayer이라고 부르면 인식 할 수없는 선택기 오류가 발생하고 응용 프로그램이 충돌한다는 것입니다. 여기서 내가 무엇을 놓치고 있니?

답변

3

호출하는 playerWithURL 메서드는 AVPlayer에 의해 소유되며 재정의하지 않는 한 서브 클래 싱 될 때도 항상 AVPlayer을 반환합니다. 다음과 같이 생성 해보십시오.

self.bookPlayer = [[SWPlayer alloc] initWithURL:url]; 
+0

문제가 해결되었습니다. 감사합니다 피터. – Aaronium112

+0

님, 다른 사람들이 쉽게 검색 할 수 있도록 질문을 다시 포맷 해 주셔서 감사합니다. –

+0

재 포맷팅은 괜찮지 만 피터가 'playerWithURL'을 참조한다는 사실을 알게되는데 어느 정도 시간이 걸립니다. 원래 게시물에서이 부분을 제거하면 문제가 발생한 곳을보기가 매우 어렵습니다. – amergin