iOS视频功能模块的开发(一)

简介: iOS视频功能模块的开发

iOS视频功能模块的开发


一、使用MPMoviePlayerController进行视频播放


       MPMoviePlayerController是iOS中进行视频播放开发的一个控制类,里面涵盖了视频播放中大部分的需求功能,在使用这个框架时,需要导入头文件<MediaPlayer/MediaPlayer.h>。


1、初始化方法


       MPMoviePlayerController可以播放网络视频,也可以播放本地视频,通过不同的URL来进行初始化,例如本地视频的初始化如下:


//视频文件路径

   NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mp4"];

   //视频URL

   NSURL *url = [NSURL fileURLWithPath:path];

   //视频播放对象

   MPMoviePlayerController * movie = [[MPMoviePlayerController alloc] initWithContentURL:url];


初始化和完成相关配置后,我们需要将MPMoviePlayerController对象的View添加在我们需要的UI视图上,这个控制器只提供的控制的相关功能,外部的UI并没有为我们提供好。


2、相关属性与方法



@property (nonatomic, copy) NSURL *contentURL;


视频文件的url地址




@property (nonatomic, readonly) UIView *view;


播放器view,在使用之前,必须设置frame大小,然后将其添加在我们的UI视图上




@property (nonatomic, readonly) UIView *backgroundView;


播放器背景颜色




@property (nonatomic, readonly) MPMoviePlaybackState playbackState;


播放器的当前播放状态,枚举定义如下:


typedef NS_ENUM(NSInteger, MPMoviePlaybackState) {

   MPMoviePlaybackStateStopped,//停止播放

   MPMoviePlaybackStatePlaying,//正在播放

   MPMoviePlaybackStatePaused,//暂停播放

   MPMoviePlaybackStateInterrupted,//中断播放

   MPMoviePlaybackStateSeekingForward,//快进

   MPMoviePlaybackStateSeekingBackward//快退

};



@property (nonatomic, readonly) MPMovieLoadState loadState;


播放器的网络缓存状态,枚举定义如下:


typedef NS_OPTIONS(NSUInteger, MPMovieLoadState) {

   MPMovieLoadStateUnknown        = 0,//状态未知

   MPMovieLoadStatePlayable       = 1 << 0,//缓存数据足够开始播放,但是视频并没有缓存完全

   MPMovieLoadStatePlaythroughOK  = 1 << 1, //已经缓存完成,如果设置了自动播放,这时会自动播放

   MPMovieLoadStateStalled        = 1 << 2, //数据缓存已经停止,播放将暂停

};




@property (nonatomic) MPMovieControlStyle controlStyle;


播放器风格,枚举如下:


typedef NS_ENUM(NSInteger, MPMovieControlStyle) {

   MPMovieControlStyleNone,       // 无控制器

   MPMovieControlStyleEmbedded,   // 嵌入视频风格

   MPMovieControlStyleFullscreen, // 全屏播放风格

 

   MPMovieControlStyleDefault = MPMovieControlStyleEmbedded

};





@property (nonatomic) MPMovieRepeatMode repeatMode;


播放器的循环模式,枚举如下:


typedef NS_ENUM(NSInteger, MPMovieRepeatMode) {

   MPMovieRepeatModeNone,//播放结束后不循环

   MPMovieRepeatModeOne//循环

};



@property (nonatomic) BOOL shouldAutoplay;


是否开启自动播放




@property (nonatomic, getter=isFullscreen) BOOL fullscreen;


设置是否充满屏幕



- (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated;


设置是否充满屏幕,带动画效果



@property (nonatomic) MPMovieScalingMode scalingMode;


设置播放器的填充方式,枚举定义如下:


typedef NS_ENUM(NSInteger, MPMovieScalingMode) {

   MPMovieScalingModeNone,       // 无缩放

   MPMovieScalingModeAspectFit,  // 适应大小模式

   MPMovieScalingModeAspectFill, // 充满可视范围,可能会被裁剪

   MPMovieScalingModeFill        // 缩放到充满视图

};



@property (nonatomic, readonly) BOOL readyForDisplay NS_AVAILABLE_IOS(6_0);


返回YES说明数据栈已经缓存好数据,返回NO则没有缓存好




@property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes;


数据文件的格式,枚举如下:


typedef NS_OPTIONS(NSUInteger, MPMovieMediaTypeMask) {

   MPMovieMediaTypeMaskNone  = 0,//格式未知

   MPMovieMediaTypeMaskVideo = 1 << 0,//音频格式

   MPMovieMediaTypeMaskAudio = 1 << 1//视频格式

};




@property (nonatomic) MPMovieSourceType movieSourceType;


视频的数据类型,枚举如下:


typedef NS_ENUM(NSInteger, MPMovieSourceType) {

   MPMovieSourceTypeUnknown,//类型未知

   MPMovieSourceTypeFile,     // 文件类型

   MPMovieSourceTypeStreaming // 数据流

};




@property (nonatomic, readonly) NSTimeInterval duration;


视频文件的时长




@property (nonatomic, readonly) NSTimeInterval playableDuration;


缓存完成能够播放的时长




@property (nonatomic, readonly) CGSize naturalSize;


视频的原始大小




@property (nonatomic) NSTimeInterval initialPlaybackTime;


播放器开始播放的时间




@property (nonatomic) NSTimeInterval endPlaybackTime;


播放器结束播放的时间




@property (nonatomic) BOOL allowsAirPlay;


是否允许云端播放




- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)optio;


获取视频某一些时间点的缩略图,参数枚举如下,生成缩略图的数据回调在后面的通知中详说:


typedef NS_ENUM(NSInteger, MPMovieTimeOption) {

   MPMovieTimeOptionNearestKeyFrame,//使用最近的关键帧生成缩略图

   MPMovieTimeOptionExact//使用精确的当前帧生成缩略图

};



与播放控制相关的方法如下:


//调用这个方法进行播放视频的准备工作

- (void)prepareToPlay;

//获取播放器的准备工作是否就绪

@property(nonatomic, readonly) BOOL isPreparedToPlay;

//调用此方法进行视频的播放

- (void)play;

//调用此方法进行视频播放的暂停操作

- (void)pause;

//调用此方法停止视频播放

- (void)stop;

//当前视频已播放的时间

@property(nonatomic) NSTimeInterval currentPlaybackTime;

//当前视频的播放速度

@property(nonatomic) float currentPlaybackRate;

//调用此方法进行快进操作

- (void)beginSeekingForward;

//调用此方法进行快退操作

- (void)beginSeekingBackward;

//调用此方法结束快进或者快退操作

- (void)endSeeking;



3、系统相关通知


       MPMoviePlayerController的系统回调并没有采用代理的设计模式,而是采用的系统发通知,我们注册观察者,接收我们需要的通知。举例几种常用通知如下:



NSString * const MPMoviePlayerScalingModeDidChangeNotification;


播放器缩放产生改变时发送的通知




NSString * const MPMoviePlayerPlaybackDidFinishNotification;


播放结束时发送的通知




NSString * const MPMoviePlayerPlaybackStateDidChangeNotification;


播放状态改变时发送的通知




NSString * const MPMoviePlayerLoadStateDidChangeNotification;


缓冲状态改变时发送的通知




NSString * const MPMoviePlayerNowPlayingMovieDidChangeNotification;


当前播放的视频改变时发送的通知




NSString * const MPMoviePlayerWillEnterFullscreenNotification;


将要进入全屏模式时发送的通知




NSString * const MPMoviePlayerDidEnterFullscreenNotification;


已经进入全屏时发送的通知




NSString * const MPMoviePlayerWillExitFullscreenNotification;


将要退出全屏时发送的通知




NSString * const MPMoviePlayerDidExitFullscreenNotification;


已经退出全屏时发送的通知




NSString * const MPMoviePlayerThumbnailImageRequestDidFinishNotification;


获取缩略图完成时发送的通知



目录
相关文章
|
27天前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
97 1
|
1月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
1月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
61 1
|
2月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
2月前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
3天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第28天】在这篇技术性文章中,我们将一起踏上一段探索iOS开发的旅程。无论你是刚入门的新手,还是希望提升技能的开发者,这篇文章都将为你提供宝贵的指导和灵感。我们将从基础概念开始,逐步深入到高级主题,如设计模式、性能优化等。通过阅读这篇文章,你将获得一个清晰的学习路径,帮助你在iOS开发领域不断成长。
25 2
|
8天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
11天前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
21 3
|
10天前
|
Swift iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】在苹果生态系统中,SwiftUI的引入无疑为iOS应用开发带来了革命性的变化。本文将通过深入浅出的方式,带领读者了解SwiftUI的基本概念、核心优势以及如何在实际项目中运用这一框架。我们将从一个简单的例子开始,逐步深入到更复杂的应用场景,让初学者能够快速上手,同时也为有经验的开发者提供一些深度使用的技巧和策略。
35 1
|
28天前
|
移动开发 前端开发 Swift
iOS 最好的应用程序开发编程语言竟然是这7种
iOS 最好的应用程序开发编程语言竟然是这7种
73 8