[iOS]列表视频播放
来源:互联网 发布:远景能源怎么样 知乎 编辑:程序博客网 时间:2024/05/18 03:42
[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;}
#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
示意图:
0 0
- [iOS]列表视频播放
- Android列表嵌入视频播放
- 列表播放视频简单实现
- iOS视频播放代码
- IOS 视频播放实例
- IOS播放视频代码
- IOS 视频播放--
- ios播放网络视频
- iOS视频播放代码
- iOS视频播放-MPMoviePlayerController
- iOS:视频播放
- ios 播放视频
- iOS 视频播放
- iOS 播放客户端视频
- iOS 播放本地视频
- ios 视频播放
- iOS-播放本地视频
- ios 视频播放
- mysql_fetch_row
- CocoaPods详解之----制作篇
- Android性能分析-启动速度优化
- python变量的作用域
- Ajax异步上传文件
- [iOS]列表视频播放
- Excel的数据类型转换方法
- js获取某个div下的input
- servlet的生命周期。
- Zhejiang university----To Fill or Not to Fill
- 次方求模(快速幂算法) nyoj 102
- Xamarin 判断颜色值得相近程度
- WebServices:WSDL的结构分析
- dijkstra算法