[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
原创粉丝点击