iOS视频中断后台音乐播放的处理方法

问题(App Store 用户评论反馈):

  • 后台音乐播放器播放时启动App音乐播放器暂停,只能手动恢复
  • 手机静音模式下视频播放没有声音

解决方案:

在播放音频时让其他程序静音,或者在其他程序的音频之上播放音频。

AVAudioSession 类由 AVFoundation 框架引入。每个 iOS 应用都有一个音频会话。这个会话可以被 AVAudioSession 类的 sharedInstance 类方法访问,如下:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

在获得一个 AVAudioSession 类的实例后,你就能通过调用音频会话对象的 setCategory:error: 实例方法,来从 iOS 应用可用的不同类别中作出选择。

下面列出了可供使用的音频会话类别:

AVAudioSessionCategoryAmbient

这个类别不会停止其他应用的声音,相反,它允许你的音频播放于其他应用的声音之 上,比如 iPod。你的应用的主 UI 线程会工作正常。调用 AVAPlayer 的 prepareToPlay 和 play 方法都将返回 YES。

AVAudioSessionCategorySoloAmbient

这个非常像 AVAudioSessionCategoryAmbient 类别,除了会停止其他程序的音频回放,比如 iPod 程序。当设备被设置为静音模式,你的音频回放将会停止。

AVAudioSessionCategoryRecord

这会停止其他应用的声音(比如 iPod)并让你的应用也不能初始化音频回放(比如 AVAudioPlayer )。在这种模式下,你只能进行录音。使用这个类别,调用 AVAudioPlayer 的 prepareToPlay 会返回 YES,但是调用 play 方法将返回 NO。主 UI 界面会照常工作。这时, 即使你的设备屏幕被用户锁定了,应用的录音仍会继续。

AVAudioSessionCategoryPlayback

这个类别会禁止其他应用的音频回放(比如 iPod 应用的音频回放)。你可以使用 AVAudioPlayer 的 prepareToPlay 和 play 方法,在你的应用中播放声音。主 UI 界面会照常工作。这时,即使屏幕被锁定或者设备为静音模式,音频回放都会继续。

AVAudioSessionCategoryPlayAndRecord

这个类别允许你的应用中同时进行声音的播放和录制。当你的声音录制或播放开始后, 其他应用的声音播放将会停止。主 UI 界面会照常工作。这时,即使屏幕被锁定或者设备为 静音模式,音频回放和录制都会继续。

AVAudioSessionCategoryAudioProcessing

这个类别用于应用中进行音频处理的情形,而不是音频回放或录制。设置了这种模式, 你在应用中就不能播放和录制任何声音。调用 AVAPlayer 的 prepareToPlay 和 play 方法都将 返回 NO。其他应用的音频回放,比如 iPod,也会在此模式下停止。

解决方案:当我们自己开发的应用播放时,暂停其他应用的播放,当我们的应用播放完毕时,继续其他应用的播放,核心代码如下:

具体实现

后台音乐播放暂停与继续

// 继续播放后台背景音乐, 取消激活当前应用的audio session
+ (void)resumeBackgroundSoundWithError:(NSError **)error {
  [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:error];
}

//暂停后台背景音乐的播放,激活当前应用的audio
+ (void)pauseBackgroundSoundWithError:(NSError **)error {

  AVAudioSession *session = [AVAudioSession sharedInstance];
  [session setCategory:AVAudioSessionCategoryPlayback withOptions: AVAudioSessionCategoryOptionAllowBluetooth error:error];
  [session setActive:YES error:error];
}

+ (void)pauseBackgroundSoundWithCategoryRecord {
  AVAudioSession *session = [AVAudioSession sharedInstance];
  [session setCategory:AVAudioSessionCategoryRecord error:nil];
  [session setActive:YES error:nil];
}

注:

  • Category 的选择,取决于在激活应用的 audio session 时,下一步要录音还是播放,如果录音的话,一定要设置 category 为 AVAudioSessionCategoryRecord
  • 如果是播放,那就设置 AVAudioSessionCategoryPlayback
  • 如果准备要录音,而设置成了 AVAudioSessionCategoryPlayback ,可能会得到一个意想不到的的结果 Unexpected error or warning

总结

到此这篇关于iOS视频中断后台音乐播放的处理方法的文章就介绍到这了,更多相关iOS视频中断后台音乐播放内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-07-18

iOS开发之获取系统相册中的图片与视频教程(内带url转换)

好些天没写点东西了,最近公司要做新项目,有点小忙.不想我的坚持就此中断,我把我前些天研究的东西拿出来给大家看看. 这次整理的是AssetsLibrary和PhotoKit的使用.本人处女座,有点强迫症,之前写的项目里用的是AssetsLibrary写的调取相册内的媒体文件,但是Xcode总是报警告错误,虽然能够编译并展示效果,但是十几个警告错误挂在那,心里总不是滋味,所以我就研究了一下AssetLibrary和PhotoKit. 在 iOS 8 出现之前,开发者只能使用 AssetsLibrar

iOS中读取照片库及保存图片或视频到照片库的要点解析

读取照片库PhotoLibrary iOS中如果我们只有一次读取一张图片或者一个视频(或拍一张照片/视频)的需求,那么我们用 UIImagePickerController 就可以搞定.但是很多时候我们需要一次性从PhotoLibrary读取多个照片或者视频,这时候我们就需要另辟蹊径了,好在apple为我们提供了相应的接口. 在开始coding之前我们想要认识几个类: ALAssetsLibrary:代表整个PhotoLibrary,我们可以生成一个它的实例对象,这个实例对象就相当于是照片库的句

iOS 本地视频和网络视频流播放实例代码

需求:最近公司需要做一个楼宇对讲的功能:门口机(连接WIFI)拨号对室内机(对应的WIFI)的设备进行呼叫,室内机收到呼叫之后将对收到的数据进行UDP广播的转发,手机(连接对应的WIFI)收到视频流之后,实时的展示视频数据(手机可以接听,挂断,手机接听之后,室内机不展示视频,只是进行转发.) 简单点说就是手机客户端需要做一个类似于直播平台的软件,可以实时的展示视频,实时的播放接收到的声音数据,并且实时将手机麦克风收到的声音回传给室内机,室内机负责转发给门口机. 之前从来做过视频播放都是本地文件的

iOS视频录制(或选择)压缩及上传功能(整理)

最新做的一个功能涉及到了视频的录制.压缩及上传.根据网上诸多大神的经验,终于算是调通了,但也发现了一些问题,所以把我的经验分享一下. 首先,肯定是调用一下系统的相机或相册 代码很基本: //选择本地视频 - (void)choosevideo { UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; ipc.sourceType = UIImagePickerControllerSourceTypePhoto

iOS中视频播放器的简单封装详解

前言 如果仅仅是播放视频两者的使用都非常简单,但是相比MediaPlayer,AVPlayer对于视频播放的可控制性更强一些,可以通过自定义的一些控件来实现视频的播放暂停等等.因此这里使用AVPlayer的视频播放. 视频播放器布局 首先使用xib创建CLAVPlayerView继承UIView用来承载播放器,这样我们在外部使用的时候,直接在控制器View或者Cell上添加CLAVPlayerView即可,至于播放器播放或者暂停等操作交给CLAVPlayerView来管理.下面来看一下CLAVP

IOS实现视频动画效果的启动图

先上效果图 实现思路 主要思路就是用一个控制器来作为播放视频的载体,然后在让这个控制器作为根视图,视频播放完成之后那就该干嘛干嘛了. 话不多说了,下面就放代码好了 先新建一个控制器AnimationViewController在控制器中新建一个属性moviePlayer,记得要先引入系统库<MediaPlayer/MediaPlayer.h> @property (nonatomic, strong) MPMoviePlayerController *moviePlayer; 设置movieP

iOS仿微信相机拍照、视频录制功能

网上有很多自定义相机的例子,这里只是我临时写的一个iOS自定义相机(仿微信)拍照.视频录制demo,仅供参考: 用到了下面几个库: #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h> 在使用的时候需要在Info.plist中把相关权限写进去: Privacy - Microphone Usage Description Privacy - Photo Library Usage

浅析iOS中视频播放的几种方案

1.AVPlayer (1) 优缺点 优点:可以自定义 UI, 进行控制 缺点:单纯的播放,没有控制 UI(进度,暂停,播放等按钮),而且如果要显示播放界面, 需要借助AVPlayerLayer, 添加图层到需要展示的图层上 (2)实现远程视频播放 实现播放功能(只有声音) 1.导入框架 #import <AVFoundation/AVFoundation.h> 2.通过远程 URL 创建 AVPlayer 对象 NSURL *remoteURL = [NSURL URLWithString:

iOS实现视频和图片的上传思路

关于iOS如何实现视频和图片的上传, 我们先理清下思路,然后小编根据思路一步一步给大家详解实现过程. 思路: #1. 如何获取图片? #2. 如何获取视频? #3. 如何把图片存到缓存路径中? #4. 如何把视频存到缓存路径中? #5. 如何上传? 接下来, 我们按照上面的思路一步一步实现 首先我们新建一个类, 用来储存每一个要上传的文件uploadModel.h #import <Foundation/Foundation.h> @interface uploadModel : NSObje

详解iOS应用中播放本地视频以及选取本地音频的组件用法

MPMoviePlayerControlle播放本地视频 MPMoviePlayerControlle与AVAudioPlayer有点类似,前者播放视频,后者播放音频,不过也有很大不同,MPMoviePlayerController 可以直接通过远程URL初始化,而AVAudioPlayer则不可以.不过大体上用起来感觉差不多.废话少说进入体验. 格式支持:MOV.MP4.M4V.与3GP等格式,还支持多种音频格式. 首先你得引入 MediaPlayer.framework.然后在使用到MPMo

详解IOS开发中生成推送的pem文件

详解IOS开发中生成推送的pem文件 具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action )并点击 App IDs 2. 创建一个不使用通配符的 App ID .通配符 ID 不能用于推送通知服务.例如,  com.itotem.ip

详解iOS App中调用AVAudioPlayer播放音频文件的用法

要给工程中添加音频,首先要导入音频的框架 AVFoundation.framework 然后新建一个类继承于UIViewController, 我这里就叫FirstVC. 首先在 AppDelegate.m中初始化根视图 复制代码 代码如下: #import "AppDelegate.h" #import "FirstVC.h" @implementation AppDelegate - (void)dealloc {     [_window release];

详解iOS App中UITableView的创建与内容刷新

UITableView几乎是iOS开发中用处最广的一个控件,当然也是要记相当多东西的一个控件. 创建 首先创建一个新的项目,并添加一个MainViewController的Class文件 打开MainViewController.h文件 @interface MainViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property (nonatomic, retain) NSArray

详解iOS开发中Keychain的相关使用

一.Keychain 基础 根据苹果的介绍,iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌.苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等.它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的. 开发者通常会希望能够利用操作系统提供的功能来保存凭证(credentials)而不是把它们(凭证)保存到NSUserDefault

详解iOS设计中的UIWindow使用

每一个IOS程序都有一个UIWindow,在我们通过模板简历工程的时候,xcode会自动帮我们生成一个window,然后让它变成keyWindow并显示出来.这一切都来的那么自然,以至于我们大部分时候都忽略了自己也是可以创建UIWindow对象.   通常在我们需要自定义UIAlertView的时候(IOS 5.0以前AlertView的背景样式等都不能换)我们可以使用UIWindow来实现(设置windowLevel为Alert级别),网上有很多例子,这里就不详细说了. 一.UIWindowL

详解IOS开发中图片上传时两种图片压缩方式的比较

IOS 图片上传时两种图片压缩方式的比较 上传图片不全面的想法:把图片保存到本地,然后把图片的路径上传到服务器,最后又由服务器把路径返回,这种方式不具有扩展性,如果用户换了手机,那么新手机的沙盒中就没有服务器返回的图片路径了,此时就无法获取之前已经上传了的头像了,在项目中明显的不可行. 上传图片的正确方式:上传头像到服务器一般是将图片NSData上传到服务器,服务器返回一个图片NSString地址,之后再将NSString的路径转为url并通过url请求去更新用户头像(用户头像此时更新的便是NS

详解iOS开发中UITableview cell 顶部空白的多种设置方法

我知道没人会主动设置这个东西,但是大家一定都遇到过这个问题,下面总结下可能是哪些情况: 1, self.automaticallyAdjustsScrollViewInsets = NO; 这个应该是最常见而且不容易被发现的原因,起因是iOS7在Conttoller中新增了automaticallyAdjustsScrollViewInsets这个属性,当设置为YES时(默认YES),如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scr

详解iOS App中UiTabBarController组件的基本用法

UiTabBarController这个控制器绝对是项目架构时做常用的一个控件. 我们大致看下控件的效果,我们就知道为什么说他常见了. 这就是最简单的一个雏形,想必现在基本70%的应用界面结构都会是这样的. 在Android中我们以ActivityGroup或是现在的fragment来实现,一个容器中包含多个子控制器. 下面我们还是以建立xib文件的形式来实现一个这样的整体布局的例子. 当然在 xcode中我们会发现其实直接有这么一个模板了 但是直接使用模板后会发现是直接在代码里实现了子布局得添

详解iOS开发中使用storyboard创建导航控制器的方法

关于StoryBoard iOS5之后Apple提供了一种全新的方式来制作UI,那就是StoryBoard.简单理解来说,可以把StoryBoard看做是一组viewController对应的xib,以及它们之间的转换方式的集合.在StoryBoard中不仅可以看到每个ViewController的布局样式,也可以明确地知道各个ViewController之间的转换关系.相对于单个的xib,其代码需求更少,也由于集合了各个xib,使得对于界面的理解和修改的速度也得到了更大提升.减少代码量就是减少