IOS 流媒体播放器 源代码

来源:互联网 发布:淘宝模拟装机 编辑:程序博客网 时间:2024/06/13 04:04

需要导入两个系统库文件CoreMedia.framework 和 AVFoundation.framework,

MediaPlayer-Prefix.pch 文件

#import<Availability.h>


#ifndef __IPHONE_4_0

#warning "This project uses features only available in iOS SDK 4.0 and later."

#endif


#ifdef __OBJC__

    #import<UIKit/UIKit.h>

    #import<Foundation/Foundation.h>

   //在预编译头文件中导入头文件A相当于在每个.m中导入该头文件因为基本上每个.m文件中都要用到

    #import<AVFoundation/AVFoundation.h>

#endif




注意:将 ViewController.xib 要关联的类设置为WJPlayView,操作在之前的博客中说过。

ViewController.h 文件

#import<UIKit/UIKit.h>


@interface ViewController :UIViewController

@property (weak,nonatomic) IBOutletUIView *backView;

@property (weak,nonatomic) IBOutletUILabel *currentTimeLabel;

@property (weak,nonatomic) IBOutletUILabel *totalTimeLabel;

@property (weak,nonatomic) IBOutletUISlider *slider;

@property (weak,nonatomic) IBOutletUIButton *playBtn;


- (IBAction)playBtnClicked:(id)sender;

- (IBAction)sliderProgerssValue:(id)sender;


@end


ViewController.m文件

#import"ViewController.h"


@interfaceViewController ()

{

    //实例化一个电影对象

    AVPlayerItem *myMovie;

    //实例化一个播放器

    AVPlayer *myPlay;

    

    NSTimer * refreshTimer;

   

}

- (void)refreshProgress;

@end


@implementation ViewController

//weatherClicked开始为NO,表示播放。当第一次点击按钮时,变为YES,表示暂停

BOOL weatherClicked =NO;

- (void)viewDidLoad

{

    [superviewDidLoad];

   //全屏播放

   self.wantsFullScreenLayout =YES;

    //屏幕大小,不写死的写法

   self.view.frame = [UIScreenmainScreen].bounds;

   self.view.backgroundColor = [UIColorblackColor];

   //播放网络视频

//myMovie = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://ocj2.smgbb.cn/ocj2/ocj2.m3u8"]];

    //播放本地音频,视频文件

   NSString *movePath = [[NSBundlemainBundle] pathForResource:@"bsm"ofType:@"mp4"];

   myMovie = [AVPlayerItemplayerItemWithURL:[NSURLfileURLWithPath:movePath]];

   myPlay = [AVPlayerplayerWithPlayerItem:myMovie];

    //

   AVPlayerLayer *layer = (AVPlayerLayer *)self.view.layer;

    layer.player =myPlay;

    [myPlayplay];

    

    //记住网络视屏的时间不能用下面的方法获取,只能在 http请求头中去获取,下面的方法只能用于读取本地文件

    CMTime totalTime = myMovie.duration;

    int seconds = totalTime.value / totalTime.timescale;

    _slider.maximumValue = seconds;

   _slider.minimumValue =0;

    _totalTimeLabel.text = [NSStringstringWithFormat:@"%02d:%02d:%02d",seconds /3600,(seconds % 3600) /60, (seconds % 3600) %60];

   _currentTimeLabel.text =@"00:00:00";

    

   refreshTimer = [NSTimerscheduledTimerWithTimeInterval:1/24.0ftarget:selfselector:@selector(refreshProgress)userInfo:nilrepeats:YES];

}


- (void)refreshProgress

{

    CMTime currentTime = myMovie.currentTime;

    int curPlayTimeSeconds = currentTime.value / currentTime.timescale;

    _slider.value = curPlayTimeSeconds;

    _currentTimeLabel.text = [NSStringstringWithFormat:@"%02d:%02d:%02d",curPlayTimeSeconds /3600,(curPlayTimeSeconds % 3600) / 60, (curPlayTimeSeconds % 3600) % 60];

}


- (void)didReceiveMemoryWarning

{

    [superdidReceiveMemoryWarning];

   // Dispose of any resources that can be recreated.

}


- (IBAction)playBtnClicked:(id)sender {

    //每次点击后要取反

   weatherClicked = !weatherClicked;

   if (weatherClicked) {

        [myPlaypause];

       //暂停定时器

        [refreshTimerisValid];

       //注意:下面这句是销毁定时器

       //[refreshTimer invalidate];

    }else{

        [myPlayplay];

       //重新开启定时器

        [refreshTimerfire];

    }

   

}


- (IBAction)sliderProgerssValue:(id)sender {

    CMTime curTimer = myMovie.currentTime;

    curTimer.value =_slider.value * curTimer.timescale;

    [myPlayseekToTime:curTimer];

    int seconds = (int)_slider.value;

    _currentTimeLabel.text = [NSStringstringWithFormat:@"%02d:%02d:%02d",seconds /3600,(seconds % 3600) /60, (seconds % 3600) %60];

}

//点击隐藏状态栏和下面的进度条,按钮等,再点击又显示出来

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

   if ([UIApplicationsharedApplication].statusBarHidden) {

        [[UIApplicationsharedApplication] setStatusBarHidden:NOwithAnimation:UIStatusBarAnimationFade];

        [UIViewanimateWithDuration:0.5fanimations:^{

            [_backViewsetAlpha:1];

        }];

        

    }else{

        [[UIApplicationsharedApplication] setStatusBarHidden:YESwithAnimation:UIStatusBarAnimationFade];

        [UIViewanimateWithDuration:0.5fanimations:^{

            [_backViewsetAlpha:0];

        }];

    }

}

@end


WJPlayView.h文件

#import<UIKit/UIKit.h>


@interface WJPlayView :UIView


@end



WJPlayView.m文件

#import"WJPlayView.h"


@implementation WJPlayView


- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

       // Initialization code

    }

   return self;

}


//获取viewlayer的时候返回avlayer

+(Class)layerClass{

   return [AVPlayerLayerclass];

}


/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect

{

    // Drawing code

}

*/


@end