• 照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、MPMoviePlayerController


    一、照相、从相册上去照片

      1. 先判断是否支持照相功能
      *判断当前设备是否支持照相功能,支持返回YES 否则返回NO 注意:模拟器不支持照相功能 把握一个原则只要是物理硬件相关的功能模拟器都不支持
      例如:
      UIImagePickerController 专门处理与照片相关的功能类 是一个控制器 继承于导航视图控制器

      if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
      支持照相功能
      1.1 照相功能
      [self loadImageWithType:UIImagePickerControllerSourceTypeCamera];

      }else {
      NSLog(@"抱歉,暂时不能照相");
      }

      1.2 取照片功能
      相册中取图片 这个功能的实现和照相功能类似只需要修改类型即可,类型为photoLibrary
      [self loadImageWithType:UIImagePickerControllerSourceTypePhotoLibrary];

      2. 这个方法可以实现照相和取图片功能
      - (void)loadImageWithType:(UIImagePickerControllerSourceType)type {
      创建UIImagePickerController对象
      UIImagePickerController *imagePC = [[UIImagePickerController alloc] init];

      设置资源类型
      imagePC.sourceType = type;

      设置是否支持后续操作 YES:支持 NO:不支持
      imagePC.allowsEditing = YES;
      设置代理 遵守UINavigationControllerDelegate, UIImagePickerControllerDelegate两个代理协议
      imagePC.delegate = self;
      一般都采用模态视图跳转方式
      [self presentViewController:imagePC animated:YES completion:^{
      NSLog(@"跳转完成");

      }];

      }
      3. #pragma mark - UIImagePickerControllerDelegate - 实现代理方法
      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

      NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
      判断当前图片是否是普通图片(公共图片)public.image
      if ([type isEqualToString:@"public.image"]) {
      如果后续操作是NO 就没有这个key:UIImagePickerControllerEditedImage
      不管有没有后续操作,都可以取UIImagePickerControllerOriginalImage
      选取图片 根据类型EditedImage 这个key得到图片image
      UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];

      _tableView.backgroundColor = [UIColor colorWithPatternImage:image];



      }
      调回去 必须加 否则用户无法回到应用
      [picker dismissViewControllerAnimated:YES completion:^{
      NSLog(@"返回完成");
      }];
      }
      4. 点击Cancel按钮执行这个方法
      - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

      NSLog(@"取消");

      [picker dismissViewControllerAnimated:YES completion:^{

      NSLog(@"返回完成");

      }];
      }

    二、播放音频

      1. 在Build Phases 的Link Binary With Libraries中导入AVFoundation.framework框架
      2. 在使用时包含头文件
      #import "AVFoundation/AVFoundation.h"
      #import "AVFoundation/AVAsset.h"
      #import "AVFoundation/AVMetadataItem.h"
      3. 初始化数据源列表
      这个是查询项目中所有MP3格式的音频,返回放入到数组中,第二个参数是子目录, 默认为空
      NSArray *arrTemp = [[NSBundle mainBundle] URLsForResourcesWithExtension:@"mp3" subdirectory:nil];
      将获取的URL路径 填入到数据源(可变数组),就是不可变数组放入到可变数组中
      arrPlayDataSource = [[NSMutableArray alloc] initWithArray:arrTemp];
      初始化设置第一首开始播放
      currentPlayIndex = 0;

      4. 播放当前音乐 需判断是否是第一次进来 如果是 不让它播放
      设置播放次数
      -1 设置任何负数都表示无限循环播放 直到手动停止播放。 0:代表播放一次 1:代表播放2次
      _audioPlayer.numberOfLoops = -1;
      设置代理 需要遵守AVAudioPlayerDelegate代理协议
      _audioPlayer.delegate = self;
      5. 初始化UI 主要控制Slider
      将持续时间设置到mySlider的maximumValue的属性上
      self.mySlider.maximumValue = _audioPlayer.duration;
      currentTime当前进度(当前时间)
      self.mySlider.value = _audioPlayer.currentTime;
      value值方法改变的时候响应sliderMethod:这个方法
      [self.mySlider addTarget:self action:@selector(sliderMethod:) forControlEvents:UIControlEventValueChanged];
      当在insider(里面)抬起的时候调用stopTouchSlider:这个方法
      [self.mySlider addTarget:self action:@selector(stopTouchSlider:) forControlEvents:UIControlEventTouchUpInside];
      5.1 实现上面的两个方法
      6. 创建定时器
      7. 配置支持后台播放
      [AVAudioSession sharedInstance]创建单例对象 AudioSession会话对象
      设置音频会话种类AVAudioSessionCategoryPlayback 音频播放种类设置 设置此类告诉系统禁止其他音频播放器
      [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
      激活音频会话对象
      [[AVAudioSession sharedInstance] setActive:YES error:nil];
      注意:在此处配置只是后台播放配置步骤之一,千万别忘了需要在Info.plist文件增加其属性 在Info.plist 中添加Required background modes 在再item 0 中添加App plays audio or streams audio/video using AirPlay(第一个)
    三、播放本地视频、播放网络视频
      1.1 导入系统库支持(MobileCoreServices.framework、MediaPlayer.framewore)
      1.2 在使用的类中添加头文件
      #import <MediaPlayer/MediaPlayer.h>
      #import <MobileCoreServices/MobileCoreServices.h>
      2.1 播放本地视频
      NSString *path = [[NSBundle mainBundle] pathForResource:@"dzs" ofType:@"mp4"];
      [self loadMovieWithPath:path];
      2.2 播放网络视频
      注意:这里需要配置Info.plist文件
      *在Info.plist中添加NSAppTransportSecurity类型Dictionary。
      *在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES
      NSString *path = @"http://qiteacher.local/share/1.mp4";
      [self loadMovieWithPath:path];

      3. 创建视频控制器对象
      根据路径 加载视频的方法
      - (void)loadMovieWithPath:(NSString *)path {
      NSURL *url = nil;
      判断是否是本地视频还是网络视频,如果路径前缀是http://或者是https://开头,说明是网络视频 否则是本地视频
      if ([path hasPrefix:@"http://"] || [path hasPrefix:@"https://"]) {
      url = [NSURL URLWithString:path];
      }else {
      url = [NSURL fileURLWithPath:path];
      }

      根据URL对象得到(创建)视频控制器对象
      _moviePlayerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
      播放play 视图控制器对象没有播放方法 是里面的(属性)moviePlayer去播放
      [_moviePlayerVC.moviePlayer play];
      设置普通类型视频(资源类型)
      _moviePlayerVC.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
      push跳转
      [self.navigationController pushViewController:_moviePlayerVC animated:YES];

      }
    四、MPMoviePlayerController
      1. 导入库文件(见三)
      #import "MediaPlayer/MediaPlayer.h" //导入MediaPlayer 视频(播放)控制类
      2.创建并播放
      在实际开发中 每次播放一个视频 先使播放对象为空,以保证每次进入这个方法后,开始新的视频(新的内存)播放
      _player = nil;
      获取视频文件路径
      NSString *strPath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp4"];
      得到url对象
      NSURL *url = [NSURL fileURLWithPath:strPath];
      初始化视频播放器对象
      _player = [[MPMoviePlayerController alloc] initWithContentURL:url];
      设置播放器的播放视图位置以及大小
      _player.view.frame = CGRectMake(0, 200, self.view.frame.size.width, 300);

      将播放视图添加到父视图self.view上
      [self.view addSubview:_player.view];

      /*
      MPMovieControlStyleNone,
      MPMovieControlStyleEmbedded, 
      MPMovieControlStyleFullscreen, 
      MPMovieControlStyleDefault 
      */
      在实际开发中,需要定制自己的播放按钮,快件慢退等等,必须先隐藏系统自带的控件 需要设置controlStyle属性 类型None
      _player.controlStyle = MPMovieControlStyleFullscreen;
      播放
      [_player play];

      3. 添加通知监听的方法
      添加通知监听视频的状态变化,视频播放需要使用通知来实现其状态变化,而不是通过协议的形式
      - (void)addNoties {
      视频播放状态的通知
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playBackStateChange:)   name:MPMoviePlayerPlaybackStateDidChangeNotification object:_player];
      视频播放完成后的通知
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished:)   name:MPMoviePlayerPlaybackDidFinishNotification object:_player];

      }

      4. 视频状态改变就响应这个方法
      - (void)playBackStateChange:(NSNotification *)noti {
      noti的object属性得到视频控制器对象
      MPMoviePlayerController *currentPlayer = noti.object;

      switch (currentPlayer.playbackState) {
      case MPMoviePlaybackStatePlaying:
      NSLog(@"播放中");

      break;

      case MPMoviePlaybackStatePaused:
      {
      NSLog(@"暂停");
      }
      break;
      case MPMoviePlaybackStateInterrupted:
      {
      NSLog(@"中断");
      }
      break;

      case MPMoviePlaybackStateSeekingForward:
      {
      NSLog(@"快进");
      }
      break;
      case MPMoviePlaybackStateSeekingBackward:
      {
      NSLog(@"后退");
      }
      break;
      case MPMoviePlaybackStateStopped:
      {
      NSLog(@"停止");
      }
      break;
      default:
      break;
      }

      }
      /*
      MPMoviePlaybackStateStopped,
      MPMoviePlaybackStatePlaying,
      MPMoviePlaybackStatePaused,
      MPMoviePlaybackStateInterrupted,
      MPMoviePlaybackStateSeekingForward,
      MPMoviePlaybackStateSeekingBackward
      */

      5.视频播放完毕的方法
      - (void)playFinished:(NSNotification *)noti {

      NSLog(@"一个视频播放完毕");

      }

  • 相关阅读:
    第二周读书笔记——《人月神话》
    第一次读书笔记——《编程匠艺》
    自我介绍 and 阅读感想
    2017-2018-1 20155217 《信息安全系统设计基础》第八周学习总结
    2017-2018-1 20155217 20155236实验二 固件程序设计
    2017-2018-1 20155217 《信息安全系统设计基础》第七周学习总结
    20155217 20155236 20155324 《信息安全系统设计基础》实验一 开发环境的熟悉
    2017-2018-1 20155217 《信息安全系统设计基础》第五周学习总结
    2017-2018-1 20155217 《信息安全系统设计基础》第四周学习总结
    2017-2018-1 20155217 《信息安全系统设计基础》第三周学习总结
  • 原文地址:https://www.cnblogs.com/GJ-ios/p/5460443.html
Copyright © 2020-2023  润新知