• 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 并行队列:同时执行队列中的线程 

     

  • 相关阅读:
    ASP.NET WebAPI Get和Post 传参总结
    关于EF第一次加载慢或过一段时间不访问时再次访问加载慢问题的总结
    jqthumb.js缩略图插件-让缩略图正常显示而不变形
    解决kindeditor编辑器中使用百度地图时不能拖动坐标的问题
    Jzoj3591 数据
    Jzoj3590 珠链
    Jzoj3590 珠链
    C++蜂鸣器歌曲1
    C++蜂鸣器歌曲1
    Jzoj2309 辽哥游戏
  • 原文地址:https://www.cnblogs.com/katydid/p/4361407.html
Copyright © 2020-2023  润新知