照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、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(@"一个视频播放完毕");
}
照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、MPMoviePlayerController的更多相关文章
- MediaPlayer播放音频,也可以播放视频
使用MediaPlayer播放音频或者视频的最简单例子: JAVA代码部分: public class MediaPlayerStudy extends Activity { private Butt ...
- Android 视频播放器 VideoView 的使用,播放本地视频 和 网络 视频
1.布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...
- Android使用VideoView播放本地视频及网络视频Demo
1.xm文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...
- 实战AudioToolbox--在iOS平台上播放音频
上午看了关于AudioToolbox.framework相关的资料,结合网上的资料对AudioToolbox的基本使用有了整体上的认识,上一篇文章 笔谈AudioToolbox(一) 中提到使用Aud ...
- 最简单的视音频播放示例9:SDL2播放PCM
本文记录SDL播放音频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...
- 最简单的视音频播放示例8:DirectSound播放PCM
本文记录DirectSound播放音频的技术.DirectSound是Windows下最常见的音频播放技术.目前大部分的音频播放应用都是通过DirectSound来播放的.本文记录一个使用Direct ...
- 【转】解决在Android设备播放音频与其他应用重音的问题,并监听耳机的控制按钮
概述 在安卓开发中免不了需要播放一点音乐了,音频了.但是这时候有别的应用正在播放,这时候就会出现重音的现象,完全影响用户体验,我们的项目就遇上了这样的尴尬,然后查找了一些文档,记录一下: 管理音频焦点 ...
- android: 播放音频
在 Android 中播放音频文件一般都是使用 MediaPlayer 类来实现的,它对多种格式的音 频文件提供了非常全面的控制方法,从而使得播放音乐的工作变得十分简单.下表列出了 MediaPlay ...
- EasyPlayerPro Windows播放器进行本地对讲喊话音频采集功能实现
需求 在安防行业应用中,除了在本地看到摄像机的视频和进行音频监听外,还有一个重要的功能,那就是对讲. EasyPlayerPro-win为了减轻二次开发者的工作量,将本地音频采集也进行了集成: 功能特 ...
随机推荐
- 006-shiro授权
一.授权流程 二.三种授权方式 2.1.编程式:通过写if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject ...
- CAS单点登录原理解析(转载)
1.基于Cookie的单点登录的回顾 基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从 ...
- java.net.SocketException四大异常解决方案(转)
java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...
- java调用ffmpeg命令行推流遇到的问题
1.Java调用命令行,如果没有额外环境变量,不指定工作路径,Runtime有两个方法 public Process exec(String command) public Process exec( ...
- maven入门学习(一)
一.maven介绍 1.软件开发中我们为什么要使用maven呢?(纯属个人体会观点,如有错误,敬请指正) (1)其一,企业岗位需求,目前的IT开发招聘岗位上,基本都要求会使用maven. ...
- Maven的简介
1 What? 1.1 Maven 简介Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理.Maven 这个单词的本意是:专家,内行. ...
- 俄罗斯最新开源的牛掰数据库ClickHouse
ClickHouse是俄罗斯最近刚刚开源的用于数据库管理系统能够实时生成分析数据报告,性能非常强悍! 使用SQL查询. 他拥有切割你的数据更多的新方法 ClickHouse的性能超过同类市场上目前用于 ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
- Oracle索引以及索引碎片
索引,可以增加查询速度,若没有索引,每次查询都必须是全表查询.例如,搜索某个记录时(如name="gdpuzxs")时,需要全表扫描一下,因为不知道有多少个name="g ...
- Spring-boot CLI下载
Spring-boot CLI下载地址: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#getting-s ...