[iOS]列表视频播放
2016-03-29 16:32
453 查看
[iOS]列表视频播放
Demo:http://download.csdn.net/detail/u012881779/9475676
播放优酷视频(http://v.youku.com/v_show/id_XMTQ4OTkzMjYyOA==.html)
可全屏 与 列表 切换播放器大小
//添加播放器 数据请求完成
-(void)addVideoPlayAction:(NSDictionary *)dataDict{
//视频播放
if(!_videoPlayVC){
_videoPlayVC =[[PTVideoPlayViewController alloc] initWithNibName:@"PTVideoPlayViewController" bundle:nil];
}
_videoPlayVC.delegate = self;
_videoPlayVC.mData = dataDict;
UIView *backPlayView = (UIView *)[_tableHeaderView viewWithTag:100];
_videoPlayVC.view.frame = backPlayView.bounds;
[backPlayView addSubview:_videoPlayVC.view];
[_videoPlayVC.mTitleView setHidden:YES];
[_videoPlayVC dmPlay];
}
//视频 全屏 通知
-(void)tapFullScreenNotification:(id)sender{
CGRect screenBound = [UIScreen mainScreen].bounds;
if(_headerBackView.frame.size.height == screenBound.size.height){
[_headerBackView setTransform:CGAffineTransformMakeRotation(0)];
//退出全屏
CGRect heaRect = _tableHeaderView.bounds;
heaRect.size.height = heaRect.size.height - 30;
_headerBackView.frame = heaRect;
[_tableHeaderView addSubview:_headerBackView];
[_videoPlayVC.view setFrame:_headerBackView.bounds];
[_videoPlayVC.mMoviePlayer.view setFrame:_headerBackView.bounds];
[_videoPlayVC.mTitleView setHidden:YES];
self.StatusBarBool = NO;
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
}else{
//进入全屏
_headerBackView.frame = screenBound;
AppDelegate *wDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[wDelegate.window addSubview:_headerBackView];
[_videoPlayVC.view setFrame:_headerBackView.frame];
[_videoPlayVC.mMoviePlayer.view setFrame:_headerBackView.frame];
[_videoPlayVC.mTitleView setHidden:NO];
//旋转
[_headerBackView setFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width)];
[_headerBackView setCenter:CGPointMake([UIScreen mainScreen].bounds.size.width/2.0, [UIScreen mainScreen].bounds.size.height/2.0)];
[_videoPlayVC.view setFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width)];
[_videoPlayVC.mMoviePlayer.view setFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width)];
[_headerBackView setTransform:CGAffineTransformMakeRotation(-M_PI/2)];
self.StatusBarBool = YES;
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
}
}
//状态栏显示、隐藏
- (BOOL)prefersStatusBarHidden{
return self.StatusBarBool;
}
示意图:
Demo:http://download.csdn.net/detail/u012881779/9475676
播放优酷视频(http://v.youku.com/v_show/id_XMTQ4OTkzMjYyOA==.html)
可全屏 与 列表 切换播放器大小
//添加播放器 数据请求完成
-(void)addVideoPlayAction:(NSDictionary *)dataDict{
//视频播放
if(!_videoPlayVC){
_videoPlayVC =[[PTVideoPlayViewController alloc] initWithNibName:@"PTVideoPlayViewController" bundle:nil];
}
_videoPlayVC.delegate = self;
_videoPlayVC.mData = dataDict;
UIView *backPlayView = (UIView *)[_tableHeaderView viewWithTag:100];
_videoPlayVC.view.frame = backPlayView.bounds;
[backPlayView addSubview:_videoPlayVC.view];
[_videoPlayVC.mTitleView setHidden:YES];
[_videoPlayVC dmPlay];
}
//视频 全屏 通知
-(void)tapFullScreenNotification:(id)sender{
CGRect screenBound = [UIScreen mainScreen].bounds;
if(_headerBackView.frame.size.height == screenBound.size.height){
[_headerBackView setTransform:CGAffineTransformMakeRotation(0)];
//退出全屏
CGRect heaRect = _tableHeaderView.bounds;
heaRect.size.height = heaRect.size.height - 30;
_headerBackView.frame = heaRect;
[_tableHeaderView addSubview:_headerBackView];
[_videoPlayVC.view setFrame:_headerBackView.bounds];
[_videoPlayVC.mMoviePlayer.view setFrame:_headerBackView.bounds];
[_videoPlayVC.mTitleView setHidden:YES];
self.StatusBarBool = NO;
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
}else{
//进入全屏
_headerBackView.frame = screenBound;
AppDelegate *wDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[wDelegate.window addSubview:_headerBackView];
[_videoPlayVC.view setFrame:_headerBackView.frame];
[_videoPlayVC.mMoviePlayer.view setFrame:_headerBackView.frame];
[_videoPlayVC.mTitleView setHidden:NO];
//旋转
[_headerBackView setFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width)];
[_headerBackView setCenter:CGPointMake([UIScreen mainScreen].bounds.size.width/2.0, [UIScreen mainScreen].bounds.size.height/2.0)];
[_videoPlayVC.view setFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width)];
[_videoPlayVC.mMoviePlayer.view setFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width)];
[_headerBackView setTransform:CGAffineTransformMakeRotation(-M_PI/2)];
self.StatusBarBool = YES;
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
}
}
//状态栏显示、隐藏
- (BOOL)prefersStatusBarHidden{
return self.StatusBarBool;
}
#import "PTVideoPlayViewController.h" #import "AppDelegate.h" #import <MediaPlayer/MediaPlayer.h> #define HiddenSeconds 3.0 @interface PTVideoPlayViewController ()<UIWebViewDelegate,UIActionSheetDelegate,UIScrollViewDelegate>{ //是否来自优酷 BOOL mbYoukuVideo; } #pragma mark private objects //视频:用于加载视频来源HTML从中获取视频地址 @property (nonatomic,retain) UIWebView *mWebView; @property (nonatomic,retain) NSTimer *mTimer; #pragma mark IBAction & IBOutlet @property (retain, nonatomic) IBOutlet UILabel *mTitleTextView; @property (retain, nonatomic) IBOutlet UIView *mPlayView; @property (retain, nonatomic) IBOutlet UIView *mBottomView; @property (retain, nonatomic) IBOutlet UIView *mLoadingView; @property (retain, nonatomic) IBOutlet UILabel *mStartLabel; @property (retain, nonatomic) IBOutlet UILabel *mEndLabel; @property (retain, nonatomic) IBOutlet UISlider *mSlider; @property (retain, nonatomic) IBOutlet UIView *mLookVideoview; @property (retain, nonatomic) IBOutlet UIButton *mHiddenButton; @property (retain, nonatomic) IBOutlet UIButton *dmReturnBut; @property (nonatomic) NSInteger HSPingMark; @property (nonatomic) NSInteger webViewurl; @property (nonatomic,assign) id<PTVideoPlayDelegate> delegate; @property (nonatomic,retain) MPMoviePlayerController *mMoviePlayer; @property (retain, nonatomic) IBOutlet UIView *mTitleView; @property (retain, nonatomic) IBOutlet UIButton *mPlayButton; @property (nonatomic,assign) BOOL mbLoaded; /*单个视频传递对象*/ @property (nonatomic,retain) NSDictionary *mData; //默认自动播放 @property (nonatomic) BOOL isAutoPlay; - (IBAction)hiddenLookVideoView:(id)sender; - (IBAction)backClick:(id)sender; - (IBAction)sliderChangeValue:(id)sender; - (IBAction)sliderChangeDone:(id)sender; - (IBAction)playClick:(id)sender; @end @implementation PTVideoPlayViewController @synthesize mData; @synthesize mWebView; @synthesize mTimer; @synthesize mMoviePlayer; @synthesize isAutoPlay; @synthesize delegate; @synthesize mbLoaded; @synthesize HSPingMark; @synthesize webViewurl; - (void)viewDidLoad{ [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; [_mSlider setThumbImage:[UIImage imageNamed:@"playMark.png"] forState:UIControlStateNormal]; [_mSlider setThumbImage:[UIImage imageNamed:@"playMark.png"] forState:UIControlStateHighlighted]; //暂停视频播放器 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(leavePauseVideoNF:) name:@"leavePauseVideoNF" object:nil]; HSPingMark = 0; if(!mbLoaded){ [self initData]; [self initView]; [self initVideoView]; //加载视频HTML [self webViewLoad:mData]; mbLoaded=YES; } } #pragma mark - private /* * 初始化数据 * @author LeoGrant */ -(void) initData{ UIWebView* webView = [[UIWebView alloc] init]; webView.backgroundColor = [UIColor blackColor]; webView.delegate = self; self.mWebView = webView; [webView release]; } /* * 初始化视图 * @author LeoGrant */ -(void) initView{ CGRect deviceBounds=self.view.bounds; [_mLookVideoview setFrame:deviceBounds]; //设置播放位置 CGPoint playViewCenter=_mPlayView.center; playViewCenter.x=_mLookVideoview.center.x; _mPlayView.center=playViewCenter; [_mLookVideoview setBackgroundColor:Color_VideoLoading]; [self.view addSubview:_mLookVideoview]; } /* * 初始化视频播放视图 * @author LeoGrant */ - (void) initVideoView{ [mTimer invalidate]; self.mTimer = nil; _mStartLabel.text = [NSString stringWithFormat:@"00:00"]; _mEndLabel.text = [NSString stringWithFormat:@"00:00"]; _mLoadingView.hidden = NO; _mSlider.hidden = YES; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Play] forState:UIControlStateNormal]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Play] forState:UIControlStateHighlighted]; NSString* strTitle = [mData objectForKey:@"title"]; if (strTitle.length > 0) { _mTitleTextView.text = strTitle; } //视频加载出来之前不可点击 _mPlayButton.enabled=NO; if(nil!=mMoviePlayer) { if([mMoviePlayer.view isDescendantOfView:self.view]) { [mMoviePlayer.view removeFromSuperview]; } self.mMoviePlayer = nil; } } /* * 获取文章ID * @author LeoGrant */ -(NSString *) currentVideoId:(NSDictionary *) dic{ NSString *aId=nil==[dic objectForKey:@"id"]?[dic objectForKey:@"gid"]:[dic objectForKey:@"id"]; return aId; } #pragma mark - 视频处理 #pragma mark MPMediaPlaybackIsPreparedToPlayDidChangeNotification - (void) prepareToPlay { _mLoadingView.hidden = YES; _mSlider.hidden = NO; //视频加载完毕,控件可用 _mPlayButton.enabled = YES; if([self checkVideoPlaying]){ [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Pause] forState:UIControlStateNormal]; }else{ [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Play] forState:UIControlStateNormal]; } float timeInterval = [self fetchVideoDuration]; [_mSlider setMaximumValue:[self fetchVideoDuration]]; [_mSlider setValue:0 animated:YES]; _mEndLabel.text = [self calculateShowTime:timeInterval]; if (mTimer == nil) { self.mTimer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(currentPlayTime) userInfo:nil repeats:YES]; } [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification object:nil]; } #pragma mark MPMoviePlayerPlaybackDidFinishNotification -(void)videoDidFinishPlayed{ [mMoviePlayer stop]; [_mSlider setValue:0]; _mStartLabel.text = [NSString stringWithFormat:@"00:00"]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Play] forState:UIControlStateNormal]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Play] forState:UIControlStateHighlighted]; _mLoadingView.hidden = YES; //隐藏界面多余切片 [self hiddenAllViewAction:1]; } #pragma mark # /* * 获取视频总时间 * YouKu:获取总时间时要加上3s * @author LeoGrant */ -(NSTimeInterval) fetchVideoDuration{ if(mbYoukuVideo && mMoviePlayer.duration!= 0) { return mMoviePlayer.duration + 3; } return mMoviePlayer.duration; } /* * 计算显示时间格式 * @author LeoGrant */ -(NSString *) calculateShowTime:(float) timeInterval{ /* int h = 0,m = 0,s = 0; h = (int)timeInterval/3600; m = ((int)(timeInterval/60))%60; s = ((int)timeInterval)%60; return [NSString stringWithFormat:@"%.2d:%.2d:%.2d",h,m,s]; */ int m = 0,s = 0; m = (int)(timeInterval/60); s = ((int)timeInterval)%60; return [NSString stringWithFormat:@"%.2d:%.2d",m,s]; } /* * 每隔一秒更新状态 * @author LeoGrant */ - (void)currentPlayTime{ if(![self checkVideoPlaying]) return; NSTimeInterval timeInterval = mMoviePlayer.currentPlaybackTime; [_mSlider setValue:timeInterval animated:YES]; _mStartLabel.text = [self calculateShowTime:timeInterval]; //播放*秒后隐藏切片 if(timeInterval >= HiddenSeconds && timeInterval <= (HiddenSeconds+1)){ [self hiddenAllViewAction:0]; } } //隐藏界面多余切片 -(void)hiddenAllViewAction:(float)theAlpha{ float alpha = theAlpha; [UIView animateWithDuration:0.3f animations:^{ _mTitleView.alpha=alpha; _mPlayView.alpha=alpha; _mBottomView.alpha=alpha; }]; } /* * 检查视频播放状态 * @return YES:正在播放。NO:停止播放或暂停 * @author LeoGrant */ -(BOOL) checkVideoPlaying{ switch (mMoviePlayer.playbackState) { case MPMoviePlaybackStateStopped: return NO; case MPMoviePlaybackStatePaused: return NO; case MPMoviePlaybackStatePlaying: return YES; default: break; } return NO; } /* * 播放视频 * @param strUrl:视频播放地址不是视频来源地址 * @author LeoGrant */ - (void)showVideo:(NSString*)strURL{ if(0==strURL.length) return; NSURL* url = [[NSURL alloc] initWithString:strURL]; MPMoviePlayerController* moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; moviePlayer.view.frame = self.view.bounds; [moviePlayer setControlStyle:MPMovieControlStyleNone]; //设置缓存 mMoviePlayer.useApplicationAudioSession=YES; [moviePlayer.backgroundView setBackgroundColor:Color_VideoBackground]; [moviePlayer.view setBackgroundColor:Color_VideoLoading]; self.mMoviePlayer = moviePlayer; [moviePlayer release]; [mMoviePlayer play]; [self.view insertSubview:mMoviePlayer.view belowSubview:_mLookVideoview]; [_mLookVideoview setBackgroundColor:[UIColor clearColor]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoDidFinishPlayed) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(prepareToPlay) name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification object:nil]; } //播放 -(void)dmPlay{ [mMoviePlayer stop]; _mLoadingView.hidden = NO; [self webViewLoad:mData]; } //暂停 -(void)dmPause{ [mMoviePlayer pause]; } //停止 -(void)dmStop{ [mMoviePlayer stop]; } #pragma mark - IBAction - (IBAction)hiddenLookVideoView:(id)sender{ float alpha=0.0f; if(_mTitleView.alpha==0) { alpha=1.0f; } else { alpha=0.0f; } [UIView animateWithDuration:0.3f animations:^{ _mTitleView.alpha=alpha; _mPlayView.alpha=alpha; _mBottomView.alpha=alpha; }]; } -(void)hiddenAllView{ [self hiddenAllViewAction:0]; } //返回 - (IBAction)backClick:(id)sender{ //点击全屏 [self fullScreenAction:nil]; } - (void)dmbackClick:(id)sender{ if ([self checkVideoPlaying]) { [mMoviePlayer pause]; } [mMoviePlayer stop]; [mWebView stopLoading]; [self.view removeFromSuperview]; } - (IBAction)sliderChangeValue:(id)sender{ NSTimeInterval timeInterval= _mSlider.value; [mMoviePlayer setCurrentPlaybackTime:timeInterval]; _mStartLabel.text = [self calculateShowTime:timeInterval]; } - (IBAction)sliderChangeDone:(id)sender{ } //保持视频播放 -(void)baochiPlayerPlay{ [mMoviePlayer play]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Pause] forState:UIControlStateNormal]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Pause] forState:UIControlStateHighlighted]; } //播放、、暂停 - (IBAction)playClick:(id)sender{ if ([self checkVideoPlaying]) { [mMoviePlayer pause]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Play] forState:UIControlStateNormal]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Play] forState:UIControlStateHighlighted]; } else { [mMoviePlayer play]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Pause] forState:UIControlStateNormal]; [_mPlayButton setBackgroundImage:[UIImage imageNamed:Image_Pause] forState:UIControlStateHighlighted]; } } - (CGFloat)fetchCurrentPlayerTime { switch (mMoviePlayer.playbackState) { case MPMoviePlaybackStateStopped: return 0.0f; case MPMoviePlaybackStatePaused: return _mSlider.value; case MPMoviePlaybackStatePlaying: return _mSlider.value; default: break; } return 0; } #pragma mark - UIWebView处理 //adddate = "2012-08-06 10:16"; //des = ""; //icon = "/upload/day_120806/201208061017026_bd_thumb_iphone4.jpg"; //id = 445; //timestamp = 1344219360; //title = "\U5143\U9996\U6124\U6012\U4e86"; //url = "http://player.youku.com/player.php/sid/XNDM1MjU0NzQw/v.swf"; - (void)webViewLoad:(NSDictionary*)dic{ NSString* strTitle = [dic objectForKey:@"title"]; if (strTitle.length > 0) { _mTitleTextView.text = strTitle; } if([delegate conformsToProtocol:@protocol(PTVideoPlayDelegate)]) { [delegate reloadTableView]; } [mWebView stopLoading]; NSString* strUrl = [dic objectForKey:@"url"]; if (strUrl.length == 0) { return; //测试注释 } //判断是否是视频的绝对地址(即后缀名为mp4,3gp) NSArray *urlSplitArray = [strUrl componentsSeparatedByString:@"."]; NSString *videoFormat=[urlSplitArray lastObject]; videoFormat = [videoFormat lowercaseString]; if([videoFormat isEqualToString:@"mp4"]) { [self showVideo:strUrl]; return; } //优酷来源地址特殊处理 NSRange youkuRange=[strUrl.lowercaseString rangeOfString:@"youku"]; if(youkuRange.length == 0) { mbYoukuVideo = NO; } else { mbYoukuVideo = YES; } webViewurl = 0; NSURL* url = [[NSURL alloc] initWithString:strUrl]; NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url]; [url release]; [mWebView loadRequest:request]; [request release]; } #pragma mark UIWebViewDelegate - (void)webViewDidFinishLoad:(UIWebView *)webView{ /* Javascript:(document.getElementsByTagName(\"video\")[0]).src 1、优酷:【获取视频链接成功】获取出来的视频duration比真实的少3秒 2、土豆:【获取视频链接成功】获取出来的视频duration与真实一致。 3、Ku6:【获取视频链接成功】获取出来的视频duration与真实一致。 4、sohu:【获取视频链接失败】 */ NSString *lJs2 = @"(document.getElementsByTagName(\"video\")[0]).src"; // youku,tudou,ku6 NSString *lm3u8 = [webView stringByEvaluatingJavaScriptFromString:lJs2]; if (lm3u8.length > 0 && [lm3u8 hasPrefix:@"http"]) { NSArray *sub1 = [lm3u8 componentsSeparatedByString:@"vid="]; NSString *vidStr = @"0"; if(sub1){ NSArray *sub2 = [[sub1 lastObject] componentsSeparatedByString:@"&"]; if(sub2){ id int2 = [sub2 firstObject]; if([int2 integerValue]>0){ vidStr = [NSString stringWithFormat:@"%ld",(long)[int2 integerValue]]; } } } if(webViewurl == [vidStr integerValue]){ }else{ [self showVideo:lm3u8]; webViewurl = [vidStr integerValue]; } } } //全屏 - (IBAction)fullScreenAction:(id)sender { NSNotification *notification = [[NSNotification alloc] initWithName:@"tapFullScreenNotification" object:nil userInfo:nil]; [[NSNotificationCenter defaultCenter] postNotification:notification]; } //暂停播放器通知 -(void)pauseVideoNotification{ NSNotification *nf = [[NSNotification alloc] initWithName:@"leavePauseVideoNF" object:nil userInfo:nil]; [[NSNotificationCenter defaultCenter] postNotification:nf]; } //暂停视频播放器 -(void)leavePauseVideoNF:(id)sender{ [self.mMoviePlayer pause]; [self.mPlayButton setBackgroundImage:[UIImage imageNamed:@"broadcast.png"] forState:UIControlStateNormal]; [self.mPlayButton setBackgroundImage:[UIImage imageNamed:@"broadcast.png"] forState:UIControlStateHighlighted]; } @end
示意图:
相关文章推荐
- iOS 关于如何将cell.detailTextLabel.text的内容显示出来的问题。
- ios设计的神细节
- OC中NSLog函数输出格式
- iOS - 融云即时通讯的简单使用
- ios 关于如何消除在向cell中添加图片文字是时出现的重影问题
- IOS基础知识
- IOS基础知识
- iOS数据存储之CoreData封装MagicalRecord
- iOS 国际化
- iOS数据存储之CoreData(一)
- iOS自适应布局之Masonry(一)
- iOS post一个json字符串到服务器 评论
- iOS开发~FMDB的使用
- iOS学习笔记07--深拷贝与浅拷贝
- ios 关于如何调整cell.imageView中的ImageView大小及位置
- iOS 重写pop跳转的方法
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- iOS-获取当前View所在的控制器
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- iOS 中图片旋转的方法