最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中視頻播放的基本方法總結(jié)

 更新時(shí)間:2018年07月22日 10:47:10   作者:風(fēng)恣  
這篇文章主要給大家介紹了關(guān)于iOS中視頻播放的基本方法的相關(guān)資料,文中分別介紹了MPMoviePlayerController、MPMoviePlayerViewController、AVPlayer以及AVPlayerViewController四種方法,需要的朋友可以參考下

前言

本文總結(jié)了iOS中最常見(jiàn)的視頻播放方法,不同的方法都各具特點(diǎn),我希望能夠總結(jié)它們的不同,方便在開(kāi)發(fā)中選擇合適的技術(shù)方案。

Apple為我們提供了多種方法來(lái)實(shí)現(xiàn)視頻播放,包括MPMoviePlayerController,MPMoviePlayerViewController,AVPlayer,AVPlayerViewController等。而值得注意的是,上述的MPMoviePlayerController與MPMoviePlayerViewController在iOS9.0之后被棄用。雖說(shuō)如此,這還是將它們的用法總結(jié)了一下,下面我們簡(jiǎn)單來(lái)了解一下四種播放方式的區(qū)別:

iOS播放視頻.png

溫馨提示:代碼更直觀,首先附上本文Demo (本地下載

一、MPMoviePlayerController

1.播放視頻

MPMoviewPlayerController繼承于NSObject,使用它播放視頻需要將其自帶的視頻View添加到視圖控制器的View上才能顯示視頻,使用步驟如下:

第一步:引用MediaPlayer框架,聲明視圖控制器屬性PlayerController
#import <mediaplayer mediaplayer.h>

@property(nonatomic,strong)MPMoviePlayerController *playerController;
//第二步:獲取視頻路徑,創(chuàng)建播放器
//本地視頻路徑
NSString* localFilePath=[[NSBundle mainBundle]pathForResource:@"不能說(shuō)的秘密" ofType:@"mp4"];
NSURL *localVideoUrl = [NSURL fileURLWithPath:localFilePath];
//網(wǎng)絡(luò)視頻路徑
NSString *webVideoPath = @"http://api.junqingguanchashi.net/yunpan/bd/c.php?vid=/junqing/1115.mp4";
NSURL *webVideoUrl = [NSURL URLWithString:webVideoPath];
self.playerController =[[MPMoviePlayerController alloc]initWithContentURL:webVideoUrl];
//第三步:設(shè)置Frame將播放器View添加到視圖控制器View上
self.playerController.view.frame = CGRectMake(0, 10, kDeviceWidth, 300);
[self.view addSubview: self.playerController.view];
//第四步:設(shè)置播放器屬性
//設(shè)置控制面板風(fēng)格:無(wú),嵌入,全屏,默認(rèn)
self.playerController.controlStyle = MPMovieControlStyleDefault;
//設(shè)置是否自動(dòng)播放(默認(rèn)為YES)
self.playerController.shouldAutoplay = NO;
//設(shè)置播放器顯示模式,類似于圖片的處理,設(shè)置Fill有可能造成部分區(qū)域被裁剪
self.playerController.scalingMode = MPMovieScalingModeAspectFit;
//設(shè)置重復(fù)模式
self.playerController.repeatMode = MPMovieRepeatModeOne;
//第五步:播放視頻
//播放前的準(zhǔn)備,會(huì)中斷當(dāng)前正在活躍的音頻會(huì)話
[ self.playerController prepareToPlay];
//播放視頻,設(shè)置了自動(dòng)播放之后可以不調(diào)用此方法
//[ self.playerController play];
//第六步:在退出界面的時(shí)候,關(guān)閉播放器,移除通知
- (void)dealloc{
 //當(dāng)前視圖控制器pop之后并不會(huì)關(guān)閉播放,需要手動(dòng)關(guān)閉
 [self.playerController stop];
 self.playerController = nil;
 //移除播放器相關(guān)的通知
 [[NSNotificationCenter defaultCenter] removeObserver:self];
}

2.視頻播放相關(guān)的通知

MPMoviePlayerController有關(guān)視頻播放的很多狀態(tài)控制都是通過(guò)通知完成的,尤其是播放在線視頻的時(shí)候,我們不僅監(jiān)控視頻加載是否成功,也會(huì)監(jiān)控是視頻緩存進(jìn)度等。這里演示一些常用的通知如下:

//關(guān)于通知的使用(還有很多通知可以監(jiān)聽(tīng),可查看SDK)
NSNotificationCenter *notificaionCenter = [NSNotificationCenter defaultCenter];
//監(jiān)聽(tīng)播放器狀態(tài)的變化
[notificaionCenter addObserver:self
 selector:@selector(playerStateChanged:)
 name:MPMoviePlayerPlaybackStateDidChangeNotification
 object:nil];
//監(jiān)聽(tīng)播放完成
[notificaionCenter addObserver:self
 selector:@selector(playerFinished) name:MPMoviePlayerPlaybackDidFinishNotification
 object:nil];
//監(jiān)聽(tīng)切換到全屏
[notificaionCenter addObserver:self
 selector:@selector(palyerChangeFullScreen) name:MPMoviePlayerDidEnterFullscreenNotification
 object:nil];
//監(jiān)聽(tīng)截屏操作完成
[notificaionCenter addObserver:self
 selector:@selector(playerCaptureFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification
 object:nil];
#pragma mark - 監(jiān)聽(tīng)通知的響應(yīng)方法
//播放狀態(tài)變化,注意播放完成時(shí)的狀態(tài)是暫停
- (void)playerStateChanged:(NSNotification *)notificaion{
 switch (self.playerController.playbackState) {
 case MPMoviePlaybackStateStopped:{
 NSLog(@"播放停止");
 break;
 }
 case MPMoviePlaybackStatePlaying:{
 NSLog(@"播放器正在播放");
 break;
 }
 case MPMoviePlaybackStatePaused:{
 NSLog(@"播放器暫停");
 break;
 }
 case MPMoviePlaybackStateInterrupted:{
 NSLog(@"播放器中斷");
 break;
 }
 case MPMoviePlaybackStateSeekingForward:{
 NSLog(@"播放器快進(jìn)");
 break;
 }
 case MPMoviePlaybackStateSeekingBackward:{
 NSLog(@"播放器快退");
 break;
 }
 default:
 break;
 }
}

//視頻播放結(jié)束
- (void)playerFinished{
 NSLog(@"playerFinished:播放結(jié)束");
}

//播放器切換到了全屏
- (void)palyerChangeFullScreen{
 NSLog(@"palyerChangeFullScreen:播放器進(jìn)入全屏");
}

//播放器截屏結(jié)束
- (void)playerCaptureFinished:(NSNotification *)notification{
 //獲取并顯示截圖
 UIImage *image=notification.userInfo[MPMoviePlayerThumbnailImageKey];
 self.captureImgView.image = image;
}

3.實(shí)現(xiàn)截屏

//添加一個(gè)按鈕,點(diǎn)擊開(kāi)始截屏
_captureBtn = [[UIButton alloc] initWithFrame:CGRectMake(30, CGRectGetMaxY(self.playerController.view.frame) + 30, kDeviceWidth - 30 * 2, 50)];
_captureBtn.backgroundColor = [UIColor purpleColor];
[_captureBtn setTitle:@"截圖當(dāng)前屏幕" forState: UIControlStateNormal];
[_captureBtn addTarget:self action:@selector(captureCurrentScreenImg) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_captureBtn];
//添加一個(gè)ImgView 顯示截屏后的圖片
_captureImgView = [[UIImageView alloc] initWithFrame:CGRectMake((kDeviceWidth - 150)/2, CGRectGetMaxY(_captureBtn.frame) + 20, 150, 150)];
 _captureImgView.contentMode = UIViewContentModeScaleAspectFit;
_captureImgView.backgroundColor = [UIColor grayColor];
[self.view addSubview:_captureImgView];
//截取當(dāng)前屏幕
- (void)captureCurrentScreenImg{
 [self.playerController requestThumbnailImagesAtTimes:@[@(self.playerController.currentPlaybackTime)] timeOption:MPMovieTimeOptionNearestKeyFrame];
}
//監(jiān)聽(tīng)通知:播放器截屏結(jié)束,得到圖片并顯示截圖
- (void)playerCaptureFinished:(NSNotification *)notification{
 UIImage *image=notification.userInfo[MPMoviePlayerThumbnailImageKey];
 self.captureImgView.image = image;
}

二、MPMoviePlayerViewController

MPMovicePlayerViewControlle只能全屏幕播放視頻,它是一個(gè)包含了MPMoviePlayerController類型屬性的特殊視圖控制器,因此它是通過(guò)模態(tài)視圖彈出的方式顯示視頻的。理解了這個(gè),我們就可以知道在使用MPMovicePlayerViewController的時(shí)候我們可以通過(guò)它的MPMoviePlayerController屬性設(shè)置很多播放器的屬性了,具體用法和MPMoviePlayerController相同,就不過(guò)多的解釋了,播放視頻的代碼示例如下;

//第一步:獲取視頻路徑
//本地視頻
NSString* localFilePath=[[NSBundle mainBundle]pathForResource:@"不能說(shuō)的秘密" ofType:@"mp4"];
NSURL *localVideoUrl = [NSURL fileURLWithPath:localFilePath];
//在線視頻
//NSString *webVideoPath = @"http://api.junqingguanchashi.net/yunpan/bd/c.php?vid=/junqing/1115.mp4";
//NSURL *webVideoUrl = [NSURL URLWithString:webVideoPath];

//第二步:創(chuàng)建視頻播放器
MPMoviePlayerViewController *playerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:localVideoUrl];

//第三步:設(shè)置播放器屬性
//通過(guò)moviePlayer屬性設(shè)置播放器屬性(與MPMoviePlayerController類似)
playerViewController.moviePlayer.scalingMode = MPMovieScalingModeFill;

//第四步:跳轉(zhuǎn)視頻播放界面
[self presentViewController:playerViewController animated:YES completion:nil];

三、AVPlayer

AVPlayer相比上述兩種方式,播放視頻功能更加強(qiáng)大,使用也十分靈活,因?yàn)樗咏咏讓印5茿VPlayer本身是不能直接顯示視頻的,必須創(chuàng)建一個(gè)播放層AVPlayerLayer并將其添加到其他的視圖Layer上才能顯示。

1. 使用AVPlayer需要了解的常用類

  • AVAsset:一個(gè)用于獲取多媒體信息的抽象類,但不能直接使用
  • AVURLAsset:AVAsset的子類,可以根據(jù)一個(gè)URL路徑創(chuàng)建一個(gè)包含媒體信息的AVURLAsset對(duì)象
  • AVPlayerItem:一個(gè)媒體資源管理對(duì)象,用于管理視頻的基本信息和狀態(tài),一個(gè)AVPlayerItem對(duì)應(yīng)一個(gè)視頻資源
  • AVPlayer:負(fù)責(zé)視頻播放、暫停、時(shí)間控制等操作
  • AVPlayerLayer:負(fù)責(zé)顯示視頻的圖層,如果不設(shè)置此屬性,視頻就只有聲音沒(méi)有圖像

2. AVPlayer的使用步驟

//第一步:引用AVFoundation框架,添加播放器屬性
#import <AVFoundation/AVFoundation.h>
@property (nonatomic,strong)AVPlayer *player;//播放器對(duì)象
@property (nonatomic,strong)AVPlayerItem *currentPlayerItem;
//第二步:獲取播放地址URL
//本地視頻路徑
NSString* localFilePath=[[NSBundle mainBundle]pathForResource:@"不能說(shuō)的秘密" ofType:@"mp4"];
NSURL *localVideoUrl = [NSURL fileURLWithPath:localFilePath];
//網(wǎng)絡(luò)視頻路徑
NSString *webVideoPath = @"http://api.junqingguanchashi.net/yunpan/bd/c.php?vid=/junqing/1129.mp4";
NSURL *webVideoUrl = [NSURL URLWithString:webVideoPath];
//第三步:創(chuàng)建播放器(四種方法)
//如果使用URL創(chuàng)建的方式會(huì)默認(rèn)為AVPlayer創(chuàng)建一個(gè)AVPlayerItem
//self.player = [AVPlayer playerWithURL:localVideoUrl];
//self.player = [[AVPlayer alloc] initWithURL:localVideoUrl];
//self.player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:webVideoUrl];
self.currentPlayerItem = playerItem;
self.player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
//第四步:創(chuàng)建顯示視頻的AVPlayerLayer,設(shè)置視頻顯示屬性,并添加視頻圖層
//contentView是一個(gè)普通View,用于放置視頻視圖
/*
 AVLayerVideoGravityResizeAspectFill等比例鋪滿,寬或高有可能出屏幕
 AVLayerVideoGravityResizeAspect 等比例 默認(rèn)
 AVLayerVideoGravityResize 完全適應(yīng)寬高
*/
AVPlayerLayer *avLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
avLayer.videoGravity = AVLayerVideoGravityResizeAspect;
avLayer.frame = _containerView.bounds;
[_containerView.layer addSublayer:avLayer];
//第六步:執(zhí)行play方法,開(kāi)始播放
//本地視頻可以直接播放
//網(wǎng)絡(luò)視頻需要監(jiān)測(cè)AVPlayerItem的status屬性為AVPlayerStatusReadyToPlay時(shí)方法才會(huì)生效
[self.player play];

3. 添加屬性觀察

一個(gè)AVPlayerItem對(duì)象對(duì)應(yīng)著一個(gè)視頻,我們需要通過(guò)AVPlayerItem來(lái)獲取視頻屬性。但是AVPlayerItem必須是在視頻資源加載到可以播放的時(shí)候才能使用,這是受限于網(wǎng)絡(luò)的原因。解決這一問(wèn)題,我們需要使用KVO監(jiān)測(cè)AVPlayerItem的status屬性,當(dāng)其為AVPlayerItemStatusReadyToPlay的時(shí)候我們才能獲取視頻相關(guān)屬性。相關(guān)的代碼示例如下:

//1.注冊(cè)觀察者,監(jiān)測(cè)播放器屬性
//觀察Status屬性,可以在加載成功之后得到視頻的長(zhǎng)度
[self.player.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//觀察loadedTimeRanges,可以獲取緩存進(jìn)度,實(shí)現(xiàn)緩沖進(jìn)度條
[self.player.currentItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
//2.添加屬性觀察
- (void)observeValueForKeyPath:(NSString *)keyPath
  ofObject:(id)object
  change:(NSDictionary *)change
  context:(void *)context {
 AVPlayerItem *playerItem = (AVPlayerItem *)object;
 if ([keyPath isEqualToString:@"status"]) {
 //獲取playerItem的status屬性最新的狀態(tài)
 AVPlayerStatus status = [[change objectForKey:@"new"] intValue];
 switch (status) {
 case AVPlayerStatusReadyToPlay:{
 //獲取視頻長(zhǎng)度
 CMTime duration = playerItem.duration; 
 //更新顯示:視頻總時(shí)長(zhǎng)(自定義方法顯示時(shí)間的格式)
 self.totalNeedPlayTimeLabel.text = [self formatTimeWithTimeInterVal:CMTimeGetSeconds(duration)];
 //開(kāi)啟滑塊的滑動(dòng)功能
 self.sliderView.enabled = YES;
 //關(guān)閉加載Loading提示
 [self showaAtivityInDicatorView:NO];
 //開(kāi)始播放視頻
 [self.player play];
 break;
 }
 case AVPlayerStatusFailed:{//視頻加載失敗,點(diǎn)擊重新加載
 [self showaAtivityInDicatorView:NO];//關(guān)閉Loading視圖
 self.playerInfoButton.hidden = NO; //顯示錯(cuò)誤提示按鈕,點(diǎn)擊后重新加載視頻
 [self.playerInfoButton setTitle:@"資源加載失敗,點(diǎn)擊繼續(xù)嘗試加載" forState: UIControlStateNormal];
 break;
 }
 case AVPlayerStatusUnknown:{
 NSLog(@"加載遇到未知問(wèn)題:AVPlayerStatusUnknown");
 break;
 }
 default:
 break;
 }
 } else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
 //獲取視頻緩沖進(jìn)度數(shù)組,這些緩沖的數(shù)組可能不是連續(xù)的
 NSArray *loadedTimeRanges = playerItem.loadedTimeRanges;
 //獲取最新的緩沖區(qū)間
 CMTimeRange timeRange = [loadedTimeRanges.firstObject CMTimeRangeValue];
 //緩沖區(qū)間的開(kāi)始的時(shí)間
 NSTimeInterval loadStartSeconds = CMTimeGetSeconds(timeRange.start);
 //緩沖區(qū)間的時(shí)長(zhǎng)
 NSTimeInterval loadDurationSeconds = CMTimeGetSeconds(timeRange.duration);
 //當(dāng)前視頻緩沖時(shí)間總長(zhǎng)度
 NSTimeInterval currentLoadTotalTime = loadStartSeconds + loadDurationSeconds;
 //NSLog(@"開(kāi)始緩沖:%f,緩沖時(shí)長(zhǎng):%f,總時(shí)間:%f", loadStartSeconds, loadDurationSeconds, currentLoadTotalTime);
 //更新顯示:當(dāng)前緩沖總時(shí)長(zhǎng)
 _currentLoadTimeLabel.text = [self formatTimeWithTimeInterVal:currentLoadTotalTime];
 //更新顯示:視頻的總時(shí)長(zhǎng)
 _totalNeedLoadTimeLabel.text = [self formatTimeWithTimeInterVal:CMTimeGetSeconds(self.player.currentItem.duration)];
 //更新顯示:緩沖進(jìn)度條的值
 _progressView.progress = currentLoadTotalTime/CMTimeGetSeconds(self.player.currentItem.duration);
 }
}
//轉(zhuǎn)換時(shí)間格式的方法
- (NSString *)formatTimeWithTimeInterVal:(NSTimeInterval)timeInterVal{
 int minute = 0, hour = 0, secend = timeInterVal;
 minute = (secend % 3600)/60;
 hour = secend / 3600;
 secend = secend % 60;
 return [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, secend];
}

4. 獲取當(dāng)前播放時(shí)間與總時(shí)間

在此之前我們需要首先了解一個(gè)數(shù)據(jù)類型,也就是上述操作中的CMTime, 在AVPlayer的使用中我們會(huì)經(jīng)常用到它,其實(shí)CMTime是一個(gè)結(jié)構(gòu)體如下:

 typedef struct{
 CMTimeValue value; // 幀數(shù)
 CMTimeScale timescale; // 幀率(影片每秒有幾幀)
 CMTimeFlags flags;
 CMTimeEpoch epoch;
 } CMTi

在上面的操作中我們看到AVPlayerItem的Duration屬性就是一個(gè)CMTime類型的數(shù)據(jù)。所以獲取視頻的總時(shí)長(zhǎng)(秒)需要duration.value/duration.timeScale。當(dāng)然系統(tǒng)也為我們提供了CMTimeGetSeconds函數(shù)更加方便計(jì)算:

總時(shí)長(zhǎng): duration.value == CMTimeGetSeconds(duration) 。

在快進(jìn)視頻到某一個(gè)位置的時(shí)候我們也需要?jiǎng)?chuàng)建CMTime作為參數(shù),那么CMTime的創(chuàng)建方法有兩種:

//方法1:
CMTimeMakeWithSeconds(Flout64 seconds, int32_t scale)
//方法2:
CMTimeMake(int64_t value, int32_t scale)
//注:兩者的區(qū)別在于方法一的第一個(gè)參數(shù)可以是float

至于獲取視頻的總時(shí)間在上述代碼中已有體現(xiàn),是在檢測(cè)播放狀態(tài)變?yōu)锳VPlayerStatusReadyToPlay的時(shí)候獲取的

//視頻總時(shí)長(zhǎng),在AVPlayerItem狀態(tài)為AVPlayerStatusReadyToPlay時(shí)獲取
CMTime duration = self.player.currentItem.duration;
CGFloat totalTime = CMTimeGetSeconds(duration);
//當(dāng)前AVPlayer的播放時(shí)長(zhǎng)
CMTime cmTime = self.player.currentTime;
CGFloat currentTime = CMTimeGetSeconds(cmTime);

5. 播放進(jìn)度與狀態(tài)的刷新

實(shí)時(shí)更新當(dāng)前播放時(shí)間,這時(shí)候我們不必使用定時(shí)器,因?yàn)锳VPlayer已經(jīng)提供了方法:
addPeriodicTimeObserverForInterval: queue: usingBlock。當(dāng)播放進(jìn)度改變的時(shí)候方法中的回調(diào)會(huì)被執(zhí)行。我們可以在這里做刷新時(shí)間的操作,代碼示例如下:

__weak __typeof(self) weakSelf = self;
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
 //當(dāng)前播放的時(shí)間
 NSTimeInterval currentTime = CMTimeGetSeconds(time);
 //視頻的總時(shí)間
 NSTimeInterval totalTime = CMTimeGetSeconds(weakSelf.player.currentItem.duration);
 //設(shè)置滑塊的當(dāng)前進(jìn)度
 weakSelf.sliderView.value = currentTime/totalTime;
 //設(shè)置顯示的時(shí)間:以00:00:00的格式
 weakSelf.currentTimeLabel.text = [weakSelf formatTimeWithTimeInterVal:currentTime];
 }];

6. 滑塊拖拽修改視頻播放進(jìn)度

//UISlider的響應(yīng)方法:拖動(dòng)滑塊,改變播放進(jìn)度
- (IBAction)sliderViewChange:(id)sender {
 if(self.player.status == AVPlayerStatusReadyToPlay){
 NSTimeInterval playTime = self.sliderView.value * CMTimeGetSeconds(self.player.currentItem.duration);
 CMTime seekTime = CMTimeMake(playTime, 1);
 [self.player seekToTime:seekTime completionHandler:^(BOOL finished) {
 }];
 }
}

四、AVPlayerViewController

AVPlayerViewController是iOS8新增視頻框架AVKit中的一個(gè)播放器類。由于iOS9棄用前兩種播放器類的原因,AVPlayerViewController也將變得更加常用。AVPlayerViewController適合開(kāi)發(fā)播放界面要求不是很高的應(yīng)用。其相比AVPlayer的使用更加方便,但是原理上還是AVPlayerViewController包含了一個(gè)AVPlayer對(duì)象。
AVPlayerViewController有兩種播放視頻的方式:

第一種:直接彈出模態(tài)視圖控制器播放

//步驟1:獲取視頻路徑
NSString *webVideoPath = @"http://api.junqingguanchashi.net/yunpan/bd/c.php?vid=/junqing/1213.mp4";
NSURL *webVideoUrl = [NSURL URLWithString:webVideoPath];
//步驟2:創(chuàng)建AVPlayer
AVPlayer *avPlayer = [[AVPlayer alloc] initWithURL:webVideoUrl];
//步驟3:使用AVPlayer創(chuàng)建AVPlayerViewController,并跳轉(zhuǎn)播放界面
AVPlayerViewController *avPlayerVC =[[AVPlayerViewController alloc] init];
avPlayerVC.player = avPlayer;
[self presentViewController:avPlayerVC animated:YES completion:nil];

第二種:添加AVPlayerViewController的View到父視圖上播放。

使用這種方式播放的優(yōu)點(diǎn)在于可以指定播放界面的原始尺寸大小,但是值得注意的是AVPlayerViewController必須被當(dāng)前視圖控制器所持有,以防止被當(dāng)做局部變量被釋放。為了滿足這一條件,我們可以將AVPlayerViewController作為屬性,也可以使用addChildViewController方法將其作為當(dāng)前視圖控制器的子視圖控制器,示例代碼如下:

//步驟1:獲取視頻路徑
NSString *webVideoPath = @"http://api.junqingguanchashi.net/yunpan/bd/c.php?vid=/junqing/1213.mp4";
NSURL *webVideoUrl = [NSURL URLWithString:webVideoPath];
//步驟2:創(chuàng)建AVPlayer
AVPlayer *avPlayer = [[AVPlayer alloc] initWithURL:webVideoUrl];
//步驟3:使用AVPlayer創(chuàng)建AVPlayerViewController,并跳轉(zhuǎn)播放界面
AVPlayerViewController *avPlayerVC =[[AVPlayerViewController alloc] init];
avPlayerVC.player = avPlayer;
//步驟4:設(shè)置播放器視圖大小
avPlayerVC.view.frame = CGRectMake(25, 0, 320, 300);
//特別注意:AVPlayerViewController不能作為局部變量被釋放,否則無(wú)法播放成功
//解決1.AVPlayerViewController作為屬性
//解決2:使用addChildViewController,AVPlayerViewController作為子視圖控制器
[self addChildViewController:avPlayerVC];
[self.view addSubview:avPlayerVC.view];

最后總結(jié):

以上就是iOS視頻播放的基本方法,但這里也僅限一些基礎(chǔ)的播放需求。若要實(shí)現(xiàn)更為復(fù)雜的播放功能,仍然有很多東西需要我們繼續(xù)深入研究,加油!

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • iOS App引導(dǎo)頁(yè)開(kāi)發(fā)教程

    iOS App引導(dǎo)頁(yè)開(kāi)發(fā)教程

    這篇文章主要為大家詳細(xì)介紹了iOS App引導(dǎo)頁(yè)開(kāi)發(fā)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS指紋驗(yàn)證TouchID應(yīng)用學(xué)習(xí)教程

    iOS指紋驗(yàn)證TouchID應(yīng)用學(xué)習(xí)教程

    這篇文章主要為大家詳細(xì)iOS指紋驗(yàn)證TouchID應(yīng)用學(xué)習(xí)教程的第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解

    iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解

    關(guān)于左滑刪除這塊,相信不少朋友都遇到過(guò)。下面這篇文章主要給大家介紹了關(guān)于iOS如何自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • 利用iOS繪制圖片生成隨機(jī)驗(yàn)證碼示例代碼

    利用iOS繪制圖片生成隨機(jī)驗(yàn)證碼示例代碼

    驗(yàn)證碼的功能一般是防止使用程序惡意注冊(cè)、暴力破解或批量發(fā)帖而設(shè)置的。所謂驗(yàn)證碼,就是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片,圖片里加上一些干擾象素(防止OCR),圖片驗(yàn)證碼相信大家都見(jiàn)到過(guò),這篇文章用示例代碼給大家介紹iOS繪制圖片生成隨機(jī)驗(yàn)證碼的方法。
    2016-11-11
  • iOS中NSObject的兩種含義:類和協(xié)議詳解

    iOS中NSObject的兩種含義:類和協(xié)議詳解

    這篇文章主要給大家介紹了關(guān)于iOS中NSObject的兩種含義:類和協(xié)議的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • iOS應(yīng)用中UILabel文字顯示效果的常用設(shè)置總結(jié)

    iOS應(yīng)用中UILabel文字顯示效果的常用設(shè)置總結(jié)

    UILabel組件可以用來(lái)設(shè)置文字內(nèi)容的排版與字體效果等,功能非常多,下面就來(lái)為大家整理一下基本的iOS應(yīng)用中UILabel文字顯示效果的常用設(shè)置總結(jié)
    2016-05-05
  • iOS中控制NSLog輸出時(shí)機(jī)詳解

    iOS中控制NSLog輸出時(shí)機(jī)詳解

    本文給大家介紹的是iOS開(kāi)發(fā)中關(guān)于nslog的輸出時(shí)機(jī)的相關(guān)內(nèi)容,非常簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
    2017-12-12
  • iOS中的NSTimer定時(shí)器的初步使用解析

    iOS中的NSTimer定時(shí)器的初步使用解析

    這篇文章主要介紹了iOS中的NSTimer定時(shí)器的初步使用解析,通過(guò)例子簡(jiǎn)單講解了NSTimer的輸出與停止的方法,需要的朋友可以參考下
    2016-05-05
  • iOS實(shí)現(xiàn)自定義起始時(shí)間選擇器視圖

    iOS實(shí)現(xiàn)自定義起始時(shí)間選擇器視圖

    本篇文章主要介紹了iOS實(shí)現(xiàn)自定義起始時(shí)間選擇器視圖,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 使用Reachability類判斷iOS設(shè)備的當(dāng)前網(wǎng)絡(luò)連接類型

    使用Reachability類判斷iOS設(shè)備的當(dāng)前網(wǎng)絡(luò)連接類型

    這篇文章主要介紹了使用Reachability類判斷iOS設(shè)備的當(dāng)前網(wǎng)絡(luò)連接類型,這里開(kāi)發(fā)語(yǔ)言為傳統(tǒng)的Objectice-C,需要的朋友可以參考下
    2016-02-02

最新評(píng)論

吉林省| 肥乡县| 原平市| 和硕县| 柳林县| 天等县| 横峰县| 卢龙县| 云阳县| 即墨市| 类乌齐县| 荥经县| 丹东市| 雷波县| 遂平县| 中卫市| 赣榆县| 泗洪县| 怀集县| 温宿县| 阿鲁科尔沁旗| 淮南市| 夏邑县| 通海县| 克什克腾旗| 常州市| 罗定市| 榆中县| 兰州市| 万源市| 崇州市| 辉南县| 长沙市| 安国市| 阿瓦提县| 兴城市| 高阳县| 江门市| 将乐县| 金湖县| 巫溪县|