How to play the next youtube video in a playlist using XCDYouTubeKit for Swift?

て烟熏妆下的殇ゞ 提交于 2019-12-10 11:52:34

问题


I'm using XCDYouTubeKit, written as a subclass of MPMoviePlayerViewController.

I'm having an issue playing the next video in my playlist. When I tap the forward button, the state of the player is stopped, and I'm not sure how to resume it?

Here's my code:

override func viewDidLoad()
{
    super.viewDidLoad()

    youtubeVideoPlayer = XCDYouTubeVideoPlayerViewController(videoIdentifier: videoID)

    self.view.addSubview( (youtubeVideoPlayer?.view)! )

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "moviePlayerNowPlayingMovieDidChange:",
        name: MPMoviePlayerNowPlayingMovieDidChangeNotification,
        object: youtubeVideoPlayer?.moviePlayer)

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "moviePlayerLoadStateDidChange:",
        name: MPMoviePlayerLoadStateDidChangeNotification,
        object: youtubeVideoPlayer?.moviePlayer)

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "moviePlayerPlaybackDidChange:",
        name: MPMoviePlayerPlaybackStateDidChangeNotification,
        object: youtubeVideoPlayer?.moviePlayer)

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "moviePlayerPlayBackDidFinish:",
        name: MPMoviePlayerPlaybackDidFinishNotification,
        object: youtubeVideoPlayer?.moviePlayer)
}

func moviePlayerPlayBackDidFinish(notification: NSNotification)
{
    print("moviePlayerPlayBackDidFinish")
    youtubeVideoPlayer!.view.removeFromSuperview()

    self.dismissViewControllerAnimated(true, completion: nil);
}

func moviePlayerNowPlayingMovieDidChange(notification: NSNotification)
{
    print("moviePlayerNowPlayingMovieDidChange")
}

func moviePlayerLoadStateDidChange(notification: NSNotification)
{
    print("moviePlayerLoadStateDidChange")
    youtubeVideoPlayer?.moviePlayer.play()

    let state: MPMoviePlaybackState = (youtubeVideoPlayer?.moviePlayer.playbackState)!

    switch state
    {
    case MPMoviePlaybackState.Stopped:
        print("stopped")
        break

    case MPMoviePlaybackState.Interrupted:
        print("interrupted")
        break

    case MPMoviePlaybackState.SeekingForward:
        print("forward")
        break

    case MPMoviePlaybackState.SeekingBackward:
        print("backward")
        break

    case MPMoviePlaybackState.Paused:
        print("paused")
        break

    case MPMoviePlaybackState.Playing:
        print("playing")
        break
    }   
}

func moviePlayerPlaybackDidChange(notification: NSNotification)
{
    print("moviePlayerPlaybackDidChange")

    let state: MPMoviePlaybackState = (youtubeVideoPlayer?.moviePlayer.playbackState)!

    switch state
    {
        case MPMoviePlaybackState.Stopped:
        print("stopped")
        videoIDIndex = videoIDIndex + 1
        playNextVideo()
        break

        case MPMoviePlaybackState.Interrupted:
        print("interrupted")
        break

        case MPMoviePlaybackState.SeekingForward:
        print("forward")
        break

        case MPMoviePlaybackState.SeekingBackward:
        print("backward")
        break

        case MPMoviePlaybackState.Paused:
        print("paused")
        break

        case MPMoviePlaybackState.Playing:
        print("playing")
        break
    }
}

func playNextVideo()
{
    if segueIdentifer == "SegueFromPlaylistVideos"
    {
        print("Playlist")
        NSNotificationCenter.defaultCenter().removeObserver(
            self,
            name: MPMoviePlayerPlaybackDidFinishNotification,
            object: youtubeVideoPlayer?.moviePlayer
        )

        print("videoIDs_ARRAY = \(videoIDs_ARRAY)")
        print("videoIDs_ARRAY[videoIDIndex] = \( (videoIDs_ARRAY[videoIDIndex] as String) )")

        youtubeVideoPlayer?.videoIdentifier = videoIDs_ARRAY[videoIDIndex] as String
    }
}

The sequence are as follows when the first video is played in the playlist, and I tap the forward to move to the next video:

moviePlayerNowPlayingMovieDidChange

moviePlayerLoadStateDidChange

moviePlayerPlaybackDidChange

playing

playing

moviePlayerLoadStateDidChange

playing

moviePlayerPlaybackDidChange

stopped

Playlist

videoIDs_ARRAY = ["NztC0z1JNq0", "uqRBijuCZd8"]

videoIDs_ARRAY[videoIDIndex] = uqRBijuCZd8

moviePlayerLoadStateDidChange

stopped

As you can see at the end, the state of the player is stopped.

I'm not sure how to resume it so it will play the next video. I've tried to add youtubeVideoPlayer?.moviePlayer.play() within moviePlayerLoadStateDidChange but the player does not resume playing.

Any thoughts on this?

Thanks


回答1:


I don't know syntax in Swift so please translate objective-c to swift 

I have 2 solutions for you problem :- 

    1. You can stop current playing video syntax in objective-c like 
    [self.youtubeVideoPlayer.moviePlayer stop]; 
    and then you can set new video 

    self.youtubeVideoPlayer.videoIdentifier=videoIdentifier;
            self.youtubeVideoPlayer.moviePlayer.shouldAutoplay=TRUE;
            [self.youtubeVideoPlayer presentInView:self.playerView];
            [self.youtubeVideoPlayer.moviePlayer prepareToPlay];
            self.youtubeVideoPlayer.moviePlayer.shouldAutoplay=TRUE;

     2. You can do like this 
    set nil to your XCDYouTubeVideoPlayerViewController reference and set it again 

    self.youtubeVideoPlayer = nil;
    self.youtubeVideoPlayer = [[XCDYouTubeVideoPlayerViewController alloc] init];
            self.youtubeVideoPlayer.moviePlayer.shouldAutoplay=TRUE;
            self.youtubeVideoPlayer.moviePlayer.controlStyle= MPMovieControlStyleNone;
            self.youtubeVideoPlayer.moviePlayer.scalingMode = MPMovieScalingModeFill;

     and then you can set new video 

    self.youtubeVideoPlayer.videoIdentifier=videoIdentifier;
            self.youtubeVideoPlayer.moviePlayer.shouldAutoplay=TRUE;
            [self.youtubeVideoPlayer presentInView:self.playerView];
            [self.youtubeVideoPlayer.moviePlayer prepareToPlay];
            self.youtubeVideoPlayer.moviePlayer.shouldAutoplay=TRUE;

Example: -
#import "ViewController.h"

#import "XCDYouTubeVideoPlayerViewController.h"

@interface ViewController ()
{
    NSArray *urlArray;
    int arrindex;
}
@property (weak, nonatomic) IBOutlet UIView *playerView;
@property (nonatomic, strong) XCDYouTubeVideoPlayerViewController *videoPlayerViewController;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    urlArray = [[NSArray alloc] initWithObjects:@"zVyEPNIR-yk",@"r5RXlY3at-E",@"sUFKakydp2c",@"1xvLHxFUwIk", nil];
    arrindex = 0;
    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter addObserver:self selector:@selector(moviePlayerPlaybackStateDidChange1:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
    [defaultCenter addObserver:self selector:@selector(moviePlayerLoadStateDidChange1:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
    [self setVideo];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (void)setVideo
{
    self.videoPlayerViewController = [[XCDYouTubeVideoPlayerViewController alloc] init];
    self.videoPlayerViewController.moviePlayer.shouldAutoplay=TRUE;
    self.videoPlayerViewController.moviePlayer.controlStyle= MPMovieControlStyleNone;
    self.videoPlayerViewController.moviePlayer.scalingMode = MPMovieScalingModeFill;

    [self.playerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    NSString *videoIdentifier =[urlArray objectAtIndex:arrindex];
    self.videoPlayerViewController.videoIdentifier=videoIdentifier;

    self.videoPlayerViewController.moviePlayer.shouldAutoplay=TRUE;
    [self.videoPlayerViewController presentInView:self.playerView];
    [self.videoPlayerViewController.moviePlayer prepareToPlay];
    self.videoPlayerViewController.moviePlayer.shouldAutoplay=TRUE;
}
- (IBAction)Next:(id)sender {
        arrindex++;
    if (arrindex<urlArray.count) {
        self.videoPlayerViewController=nil;
        [self setVideo];
    }
}
- (void) moviePlayerLoadStateDidChange1:(NSNotification *)notification
{
    MPMoviePlayerController *moviePlayerController = notification.object;
    MPMovieLoadState state = moviePlayerController.loadState;
    if (state & MPMovieLoadStatePlayable)
    {
        [self.videoPlayerViewController.moviePlayer play];
    }
    else if (state & MPMovieLoadStatePlaythroughOK)
    {
    }
    else if (state & MPMovieLoadStateStalled)
    {
    }
}

- (void) moviePlayerPlaybackStateDidChange1:(NSNotification *)notification
{
    long reason=(long)self.videoPlayerViewController.moviePlayer.playbackState;
    if (reason==0)
    {
        NSLog(@"I'm Not Playing");
    }
    else if (reason==1)
    {
        NSLog(@"I'm Playingggggggggggggggg");
    }
    else if (reason ==2)
    {
        NSLog(@"pause....................................");
    }
    else if (reason ==3)
    {
        //NSLog(@"Interrupteddddddddddddddddd");
    }
    else if (reason ==4)
    {
        //NSLog(@"Seeking Forward");
    }
    else if (reason ==5)
    {
        //NSLog(@"Seeking Backward");
    }
}

@end

I hope this helps you.


来源:https://stackoverflow.com/questions/35666063/how-to-play-the-next-youtube-video-in-a-playlist-using-xcdyoutubekit-for-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!