照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、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(@"一个视频播放完毕");

  }

时间: 2024-10-06 05:42:55

照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、MPMoviePlayerController的相关文章

Android 视频播放器 VideoView 的使用,播放本地视频 和 网络 视频

1.布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_paren

实战AudioToolbox--在iOS平台上播放音频

上午看了关于AudioToolbox.framework相关的资料,结合网上的资料对AudioToolbox的基本使用有了整体上的认识,上一篇文章 笔谈AudioToolbox(一) 中提到使用AudioQueue来实现音频播放功能时最主要的步骤: 1. 打开播放音频文件 2. 取得播放音频文件的数据格式 3. 准备播放用的队列 4. 将缓冲中的数据移动到队列中 5. 开始播放 6. 在回调函数中进行队列处理 按照这个步骤实现了音频的播放. OSStatus status;     NSStri

最简单的视音频播放示例9:SDL2播放PCM

本文记录SDL播放音频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API用于播放视频:封装了DirectSound这类的API用于播放音频.因为SDL的编写目的就是简化视音频播放的开发难度,所以使用SDL播放视频(YUV/RGB)和音频(PCM)数据非常的容易. SDL简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,

最简单的视音频播放示例8:DirectSound播放PCM

本文记录DirectSound播放音频的技术.DirectSound是Windows下最常见的音频播放技术.目前大部分的音频播放应用都是通过DirectSound来播放的.本文记录一个使用DirectSound播放PCM的例子.注:一位仁兄已经提醒我DirectSound已经计划被XAudio2取代了.后来考证了一下发现确有此事.因此在下次更新中考虑加入XAudio2播放PCM的例子.本文仍然记录一下DirectSound这位“元老”. DirectSound简介 DirectSound是微软所

【转】解决在Android设备播放音频与其他应用重音的问题,并监听耳机的控制按钮

概述 在安卓开发中免不了需要播放一点音乐了,音频了.但是这时候有别的应用正在播放,这时候就会出现重音的现象,完全影响用户体验,我们的项目就遇上了这样的尴尬,然后查找了一些文档,记录一下: 管理音频焦点 从谷歌开发了解到,这跟音频的焦点又关系,我们可以获取当前音频的焦点来解决问题: 有多个应用程序可能播放音频,重要的是要考虑他们应该如何交互.为了避免每个音乐应用程序同时播放,Android使用音频焦点来控制音频播放 - 只有拥有音频焦点的应用程序才能播放音频. 在您的应用程序开始播放音频之前,应该

【Android】播放音频的几种方式介绍

接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPlayer播放音频 MediaPlayer的功能很强大,下面附上一张该类封装音频的生命周期图: MediaPlayer支持AAC.AMR.FLAC.MP3.MIDI.OGG.PCM等格式,MediaPlayer可以通过设置元数据和播放源来音频. 1.1播放Raw文件夹下面音频的元数据 //直接创建,不

Android MediaPlayer 播放音频

本文链接: Android MediaPlayer 播放音频 主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer 基础简介. 为了方便表达,定义变量名为mediaPlayer. MediaPlayer的使用方式 创建MediaPlayer 可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法创建. mediaPlayer = new MediaPlayer();

网页上播放音频、视频Mp3,Mp4

昨天在处理网页上播放音频mp3,视频mp4上用了一天的时间来比较各种方案,最终还是选择了HTML5的 标签,谷歌浏览器.IE浏览器对标签的支持都很好,火狐上需要安装quicktime插件,效果比较差. <embed type="audio/mpeg" src="demo.mp3" style="width:400px; height:100px; border:3px solid black;" /> <embed src=&q

关于Window Server2008 服务器上无法播放音频文件的解决方案

在偌大的百度当中查找我所需要的资源信息,但网络上所描述的都不能解决,发生此类问题的人很多,但是都没有得到准确的解决方法!经个人各方面的尝试,其实非常简单的解决了无法播放音频文件的问题,如果各位今后也遇到此类问题,可按照我的方式处理: 若是3gp文件,在服务器IIS的MIME类型中直接添加扩展名为“.3gp” MIME类型为“video/3gpp” 若是mp4文件,在服务器IIS的MIME类型中直接添加扩展名为“.mp4” MIME类型为“video/mp4” 以此类推 此方法能彻底解决视频播放问