您的位置:首页 > 移动开发 > IOS开发

[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;
}
 
#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
 

示意图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: