iOS之音乐播放器 视频播放器 多线程

Day07

音乐播放器

step1:导入头文件

#import<AVFounfation/AVFoundation.h>

创建音乐播放器的实例AVAudioPlayer *players=[[AVAudioPlayeralloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.musicPath] errol :nil]

开启音乐播放器[playersplay]

players.Volume=? 设置音量的大小

players.duration=?歌曲总时间

players.currentTimer=?当前播放的事件

[playerspause]暂停

 

 

Day8

1.视频播放器

step1:导入头文件

#import<MediaPlay/MediaPlayer.h>

step2:创建MPMoviePlayerController的实例

self.player=[[MPMoviePlayerControlleralloc ]initWithControllerURL:[NSURLfileURLWithPath: @"/Users/tarena6/Desktop/test/第三个月/MV/mtv.mp4"]]

 

step3:设置播放位置

self.player.view.frame=CGRectMake(0,20,320,200);

 

step4:设置播放位置

self.player.controlStyle=MPMovieControlStyleDefault

 

step5:添加到父视图 并启动播放

[self.viewaddSubView:self.player.view]

[self.playerplay];

 

step6:用于监听截屏

//监听截屏通知

    [[NSNotificationCenterdefaultCenter]addObserver:self selector:@selector(didReceiveImage:)name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil];

    //监听播放完成的通知

 

  //接受截屏的通知

    [self.player requestThumbnailImagesAtTimes:@[@(self.player.currentPlaybackTime)]timeOption:MPMovieTimeOptionExact];

 

    -(void)didReceiveImage:(NSNotification*)noti{

    NSLog(@"%@",noti);

    UIImage *image = [noti.userInfoobjectForKey:MPMoviePlayerThumbnailImageKey];

    UIImageView *iv = [[UIImageViewalloc]initWithFrame:CGRectMake(0, 300, 320, 200)];

    iv.image = image;

    [self.view addSubview:iv];

}

 

step7:监听播放完成

[[NSNotificationCenterdefaultCenter]addObserver:self selector:@selector(endPlay:)name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

 

 

2 多线程

切记:耗时操作不能放到主线程中 否者会导致界面阻塞

      修改页面的代码不要放到子线程中(如果修改页面的操作放在子线程的最后则可以放在子线程中)

应用场景:1 解决耗时操作的阻塞问题  2 同时做几件事   3 多线程的下载

 

[VsetNeedsDisplay];//刷新本空间显示

[VsetNeedsLayout];//刷新子空间的显示

 

创建线程的三种方式

1 NSThread

开辟线程:

[NSThreaddatachNewThreadSelector:@Selector(addThread)toTarget:selfwithObjectObject:nil];

线程睡眠:[NSThreadsleepForTimeInterval:1];

返回主线程:

[selfperformSelectorOnMainThread:@selector(updateUI:) withObject:v waitUntilDone:NO]

 

2.GCD:GrandCentral Dispatch (中央任务分发)基于C语言的  执行的效率较高

创建线程队列 串行队列

dispatch_queue_t  myqueue1=dispatch_queue_create(“myqueue”,null)

获取系统提供的并行队列

dispatch_queue_t myqueue2=dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

执行队列中的某段代码 在某个队列中

 dispatch_async(xxxx, ^{ });

执行一段代码在主线程中

 dispatch_async(dispatch_get_main_queue(), ^{});

 

3 NSOperation:更灵活 可以设置线程和线程之间的关系 灵活高度

两种方式:

方式一:NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ }];使用block块创建

方式二:使用初始化方式创建 NSInvocationOperation *op2 = [[NSInvocationOperationalloc]initWithTarget:self selector:@selector(runAction) object:nil];

 

直接   [xxx start]相当于在主线程中直接使用  相当于主线程

 

      要想使其成为子线程必须把他们放到线程对类中 可以通过设置最大并行的线程数来实现并行或者是串行

 

      //添加到子线程队列中,把operation 添加倒队列的同时 开启operation

NSOperationQueue  *opQueue=[[NSOperationQueue  alloc]init];

      //设置最大并行线程数量

      [opQueuesetMaxConcurrentOperationCount:1];

      //添加线程之间的依赖

      [op1 addDependency:op2]; op2执行结束之后op1才开始执行

      //将两个线程添加倒线程队列中

      [opQueue addOperation:op1];

      [opQueue addOperation:op2]

 

线程队列

1 串行队列:依次执行队列中的线程

2 并行队列:同时执行队列中的线程 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。