ios-day22-01(ios开发之视频播放)

iOS提供了MPMoviePlayerControllerMPMoviePlayerViewController两个类,可以用来轻松播放视频和网络流媒体\网络音频

提示:网络音频同样使用此控制器播放
YouTobe就是用MPMoviePlayerController实现的

MPMoviePlayerViewController只能全屏播放视频

上述两个类都定义在了MediaPlayer框架中 


MPMoviePlayerController可以播放的视频格式包括:H.264MPEG-4

⽀持的文件扩展名包括:avi,mkv,mov,m4v,mp4

可以从苹果官网:http://support.apple.com/kb/HT1425下载一些用来测试的视频文件,文件都比较⼩

提示:MPMoviePlayerController并不⽀支持所有的视频格式,如果要播放不⽀支持的视频格

式,需要借助第三⽅方框架进⾏行解码,如VLC

https://github.com/videolan/vlc


接下来这个Demo演示了如何使用MPMoviePlayerController来播放视频:


源码下载地址:http://download.csdn.net/detail/liu537192/8579635


效果图:


核心代码:

//
//  JLViewController.m
//  01-视频播放
//
//  Created by Mac on 15-4-9.
//  Copyright (c) 2015年 vxinyou. All rights reserved.
//

#import "JLViewController.h"
#import "JLMoviePlayerController.h"


@interface JLViewController ()
       
       
        
        

@property (weak, nonatomic) IBOutlet UIImageView *imageView1;

@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@end

@implementation JLViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.navigationItem.title = @"主界面";
    
    
}

# pragma mark -代理方法
- (void)moviePlayerDidCaptureFinishedWithImage:(UIImage *)image{

    if (self.imageView1.image == nil) {
        
        self.imageView1.image = image;
    }else{
    
        self.imageView2.image = image;
    }
    
    
}

/**
 *  push前作的准备工作
 */
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    // 获取push的目标控制器
    JLMoviePlayerController *mpc = segue.destinationViewController;
    
    // 设置目标控制器的代理
    mpc.delegate = self;
}

@end

       
       
//
//  JLMoviePlayerController.h
//  01-视频播放
//
//  Created by Mac on 15-4-9.
//  Copyright (c) 2015年 vxinyou. All rights reserved.
//

#import 
       
       
        
        

@protocol JLMoviePlayerControllerDelegate 
        
        
         
         

@optional
/**
 *  截图完成的时候通知代理,并把图片传给代理
 */
- (void)moviePlayerDidCaptureFinishedWithImage:(UIImage *)image;


@end

@interface JLMoviePlayerController : UIViewController

@property (nonatomic, weak)id
         
         
          
           delegate;

@end
//
//  JLMoviePlayerController.m
//  01-视频播放
//
//  Created by Mac on 15-4-9.
//  Copyright (c) 2015年 vxinyou. All rights reserved.
//

#import "JLMoviePlayerController.h"

#import 
          
          
           
           

@interface JLMoviePlayerController ()

@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;

@end

@implementation JLMoviePlayerController


- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.navigationItem.title = @"视频播放";
    
    [self setupPlayer];
    
    [self addNotification];
}

/**
 *  添加对通知的监听
 */
- (void)addNotification{

    // 获取通知中心
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    // 添加对播放状态的监听
    [nc addObserver:self selector:@selector(stateChanged) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
    
    // 添加对播放完成的监听
    [nc addObserver:self selector:@selector(finished) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
    
    // 添加对进入全屏的监听
    [nc addObserver:self selector:@selector(enterFullscreen) name:MPMoviePlayerDidEnterFullscreenNotification object:nil];
    
    // 添加对退出全屏的监听
    [nc addObserver:self selector:@selector(exitFullscreen) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
    
    // 添加对截图完成的监听
    [nc addObserver:self selector:@selector(captureFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil];
    
    // 截取视频第6秒和第20秒的截图
    // MPMovieTimeOptionExact 精确时间
    // MPMovieTimeOptionNearestKeyFrame 大概时间
    [self.moviePlayer requestThumbnailImagesAtTimes:@[@(6.0f), @(20.0f)] timeOption:MPMovieTimeOptionNearestKeyFrame];
}

/**
 *  设置播放器
 */
- (void)setupPlayer{

    //    NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"promo_full.mp4" ofType:nil];
    //    NSURL *movieUrl = [NSURL URLWithString:moviePath];
    
    // 本地视频的url不能用上面两句代码的方式获取。
    NSURL *movieUrl = [[NSBundle mainBundle] URLForResource:@"promo_full.mp4" withExtension:nil];
    
    // 设置播放器要播放的内容的url
    [self.moviePlayer setContentURL:movieUrl];
    
    // 设置播放器frame
    self.moviePlayer.view.frame = self.view.bounds;
    
    // 设置播放器的宽高自动适应屏幕,如果不这样设置,切换横竖屏时,view的大小不会改变。
    self.moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    
    // 将播放器添加到view
    [self.view addSubview:self.moviePlayer.view];
    
    // 播放
    [self.moviePlayer play];
    
}


- (MPMoviePlayerController *)moviePlayer{

    if (_moviePlayer == nil) {
        _moviePlayer = [[MPMoviePlayerController alloc] init];
    }
    
    return _moviePlayer;
}

/**
 *  截图完成
 */
- (void)captureFinished:(NSNotification *)notification{

    NSLog(@"captureFinished");
    
    if ([self.delegate respondsToSelector:@selector(moviePlayerDidCaptureFinishedWithImage:)]) {
    
        // 获取截取到的图片
        UIImage *image = notification.userInfo[MPMoviePlayerThumbnailImageKey];
        
        // 通知代理,并把图片传给代理
        [self.delegate moviePlayerDidCaptureFinishedWithImage:image];
    }
}

/**
 *  退出全屏
 */
- (void)exitFullscreen{

    NSLog(@"exitFullscreen");
}

/**
 *  进入全屏
 */
- (void)enterFullscreen{

    NSLog(@"enterFullscreen");
}

/**
 *  播放完毕
 */
- (void)finished{

    NSLog(@"finished");
    
    // 播放完毕后,把播放视频的控制从控制器栈中移除(出栈)。
    [self.navigationController popViewControllerAnimated:YES];
}

/**
 播放状态改变:
 MPMoviePlaybackStateStopped,           停止
 MPMoviePlaybackStatePlaying,           播放
 MPMoviePlaybackStatePaused,            暂停
 MPMoviePlaybackStateInterrupted,       中断
 MPMoviePlaybackStateSeekingForward,    下一集
 MPMoviePlaybackStateSeekingBackward    上一集
 */
- (void)stateChanged{

    switch (self.moviePlayer.playbackState) {
        case MPMoviePlaybackStatePlaying:
            NSLog(@"播放");
            break;
        case MPMoviePlaybackStatePaused:
            NSLog(@"暂停");
            break;
        case MPMoviePlaybackStateStopped:
            NSLog(@"停止");
            break;
        default:
            break;
    }
}

#pragma mark -生命周期方法
- (void)dealloc{

    NSLog(@"dealloc");
    // 移除所有对通知的监听
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end

          
          
         
         
        
        
       
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值