视频的播放
2015-10-16 04:51 真实16 阅读(257) 评论(0) 编辑 收藏 举报//
// 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