首页 > 技术文章 > 视频的播放

wukun16 2015-10-16 04:51 原文

//

//  ViewController.m

//  UI-NO-21

//

//  Created by Bruce on 15/8/21.

//  Copyright (c) 2015年 Bruce. All rights reserved.

//

 

#import "ViewController.h"

//播放视频 导入<MediaPlayer/MediaPlayer.h>

#import <MediaPlayer/MediaPlayer.h>

 

//如果想使用AVAssetImageGenerator 获得截图 必须导入AVFoundation

#import <AVFoundation/AVFoundation.h>

//AVAsset 通过URL 获得视频的资源

//AVAssetImageGenerator 可以得到 视频里面的图片

 

@interface ViewController ()

{

    

    MPMoviePlayerController *moviePlayer;

}

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor blackColor];

    

    

//    moviewPlayer 可以通过 通知 来检测到  视频播放的状态  MPMoviePlayerPlaybackStateDidChangeNotification

    

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeSate:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];

    

    

    

    NSString *path = [[NSBundle mainBundle] pathForResource:@"IMG_8435" ofType:@"m4v"];

    

    UIImage *image = [self thumbnailImage:path];

    

    self.view.backgroundColor = [UIColor colorWithPatternImage:image];

    

    /*

    

//    播放视频的类

    moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:path]];

//    *****还需要 设置 moviePlayer.view   的frame

    moviePlayer.view.frame = CGRectMake(100, 200, 200, 300);

    moviePlayer.view.backgroundColor = [UIColor redColor];

    

//    设置视频显示控制的样式

    moviePlayer.controlStyle = MPMovieControlStyleFullscreen;

    

//    设置 视频 是否循环播放

//    MPMovieRepeatModeNone, 不循环

//    MPMovieRepeatModeOne    循环

    moviePlayer.repeatMode = MPMovieRepeatModeOne;

 

//    *****需要把 视频播放器的view 添加在  需要播放的视图上

    [self.view addSubview:moviePlayer.view];

    

//    是否允许分享到airPlay

    moviePlayer.allowsAirPlay = YES;

    

    NSLog(@"是否 使用了 AirPlay %d",moviePlayer.airPlayVideoActive);

    

//    如果播放的是网络视频  是否需要 自动继续播放

    moviePlayer.shouldAutoplay = YES;

    

//  设置 视频 全屏

//    moviePlayer.fullscreen = YES;

//    [moviePlayer setFullscreen:YES animated:YES];

    

//    播放

    [moviePlayer play];

    

    NSLog(@"是否是全屏 %d",moviePlayer.isFullscreen);

 

    

    

//    获得视频的加载状态

//    MPMovieLoadStateUnknown        = 0, 未知的状态

//    MPMovieLoadStatePlayable       = 1 << 0, 可以播放的状态

//    MPMovieLoadStatePlaythroughOK  = 1 << 1,  Playback will be automatically started in this state when shouldAutoplay is YES   如果使用了shouldAutoplay = YES  有可以播放的 自动播放

//    MPMovieLoadStateStalled        = 1 << 2, // 没有网络数据 可以播放的时候

//    moviePlayer.loadState

     */

    

//    [moviePlayer stop];

}

 

- (void)changeSate:(NSNotification *)not

{

    

    NSLog(@"视频播放的当前时间%f",moviePlayer.currentPlaybackTime);

    

    

//    可以获得 整个视频播放的对象

    MPMoviePlayerController *mp = not.object;

    

//    playbackState 只读的属性   可以通过它  来获取到  视频播放的状态

    

//    MPMoviePlaybackStateStopped, 停止

//    MPMoviePlaybackStatePlaying, 播放

//    MPMoviePlaybackStatePaused, 暂停

//    MPMoviePlaybackStateInterrupted, 中断

//    MPMoviePlaybackStateSeekingForward, 快进

//    MPMoviePlaybackStateSeekingBackward 回退

    

    switch (mp.playbackState) {

        case MPMoviePlaybackStateStopped: {

            NSLog(@"停止");

            break;

        }

        case MPMoviePlaybackStatePlaying: {

            NSLog(@"正在播放");

            break;

        }

        case MPMoviePlaybackStatePaused: {

            NSLog(@"暂停");

            break;

        }

        case MPMoviePlaybackStateInterrupted: {

            NSLog(@"中断");

            break;

        }

        case MPMoviePlaybackStateSeekingForward: {

            NSLog(@"快进");

            break;

        }

        case MPMoviePlaybackStateSeekingBackward: {

            NSLog(@"回退");

            break;

        }

        default: {

            break;

        }

    }

//    通过moviePlayerController  获得截图的方法

//    MPMovieTimeOptionNearestKeyFrame, 获得相对时间截图

//    MPMovieTimeOptionExact 获得绝对时间的截图

//    [moviePlayer requestThumbnailImagesAtTimes:@[@(1),@(5)] timeOption:MPMovieTimeOptionNearestKeyFrame];

//    检测截图成功的通知名字

//    MPMoviePlayerThumbnailImageRequestDidFinishNotification

    

//    可以获得 通知传过来 内容的 图片的key

//    MPMoviePlayerThumbnailImageKey

}

 

//FFMPEG VFL 转码的开源框架

- (UIImage *)thumbnailImage:(NSString *)path

{

//    1、通过URL获得视频的资源

//    AVAsset

//    AVURLAsset

    

    AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:path]];

//    AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:path]];

    

    

//    2、初始化 视频资源图片的持有者

    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc]initWithAsset:asset];

    

//    3、开始截图

//    <#(CMTime)#>  包含了 时间的值

//    帧数

//    copyCGImageAtTime  拷贝哪个时间段的图片(包扣了哪一帧)

//    CGImageRef 是图片的数据  参数

    CGImageRef ref = [generator copyCGImageAtTime:CMTimeMake(1, 2) actualTime:nil error:nil];

    

//    CGImageRef 转换成UIImage

    UIImage *image = [UIImage imageWithCGImage:ref];

    

    return image;

}

 

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end

 

推荐阅读