iOS的AVFoundation框架提供了基本的音视频播放工具,我们基本上可以靠其中提供的类完成绝大部分的音视频播放任务。但是在音频播放的输出音量的处理上,苹果的策略比较保守。尽管AVPlayer
和AVPAudiolayer
zhe这些类提供了音量调节功能,但这些音量控制属于App级别的控制。好处就是音量调节独立于系统音量,调节大小时不会影响系统音量。但有时候我们可能希望修改系统音量,以免在调节声音的时候,如果系统音量过小,App调节音量效果不明显。一般来说要调节系统音量会有以下方法:
请注意:
修改系统音量无法在模拟器上看到效果,必须使用真机调试才能看到效果!
使用前请导入库 #import
第一:通过 MPVolumeSettings 来控制系统的声音
类里面提供了三个方法控制声音
MP_EXTERN __TVOS_PROHIBITED void MPVolumeSettingsAlertShow();
MP_EXTERN __TVOS_PROHIBITED void MPVolumeSettingsAlertHide();
MP_EXTERN __TVOS_PROHIBITED BOOL MPVolumeSettingsAlertIsVisible();
第二:通过MPVolumeView
可以先下载demo,以便更清晰的理解
这个方法是苹果官方推荐的方法。MPVolumeView
是Media Player Framework中的一个UI组件,直接包含了对系统音量和Airplay设备的音频镜像路由的控制功能。MPVolumeView
的使用很简单,只需要将其加入到一个父视图中,给予父视图合适的大小,再创建MPVolumeView
示例,将其加入到父视图中即可
但是他的缺点也是很明显的:
1>MPVolumeView的可定制化是很低的,里面提供了很少的几个方法,并且几乎都是用图片来定制界面
2>将其假如到我们的视图层级之后,显示的是一个滑块(UISlider),在APP中,大多时候音量的控制我们是要自己定制的,如在视频的播放中
解决方法:
但是MPVolumeView的子视图中包含一个MPVolumeSlider
的subview用来控制音量。这个MPVolumeSlider
是一个私有类,我们无法手动创建此类,但这个类是UISlider
的子类。于是我们便可以将这个控件给提取出来,便可以间接的控制系统音量,可以遍历它的子视图找到MPVolumeSlider
UISlider * volumeViewSlider = nil;
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(10, 50, 200, 4)];
for (UIView* newView in volumeView.subviews) {
if ([newView.class.description isEqualToString:@"MPVolumeSlider"]){
volumeViewSlider = (UISlider*)newView;
break;
}
}
我们只要改变得到的volumeViewSlider
的value 就可以间接的控制系统的音量
如下:
/*
*获取系统音量滑块
*/
+(UISlider*)getSystemVolumSlider{
static UISlider * volumeViewSlider = nil;
if (volumeViewSlider == nil) {
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(10, 50, 200, 4)];
for (UIView* newView in volumeView.subviews) {
if ([newView.class.description isEqualToString:@"MPVolumeSlider"]){
volumeViewSlider = (UISlider*)newView;
break;
}
}
}
return volumeViewSlider;
}
/*
*获取系统音量大小
*/
+(CGFloat)getSystemVolumValue{
return [[self getSystemVolumSlider] value];
}
/*
*设置系统音量大小
*/
+(void)setSysVolumWith:(double)value{
[self getSystemVolumSlider].value = value;
}
更多的需求:隐藏系统的音量提示框
通过上面的方法获取到控制音量的滑块之后,当我们改变滑块的value之后,系统的音量提示框会展示出来,
也许有的APP中要自己定义音量改变的提示框,于是便要隐藏系统的音量提示框
实现:
上面的 获取 系统音量滑块 的时候,并没有将滑块假如到我们的视图中,如果将其假如到我们的视图之中后,就会发现系统的音量提示框便不会展示,
可以知道:
音量滑块 (volumeViewSlider)在视图层级中,系统的音量提示框便不会展示,
音量滑块 (volumeViewSlider)不在视图层级中,系统的音量提示框便会展示,
这样就好办了,将音量滑块 (volumeViewSlider)的坐标调整到最低层级,或者将其坐标设置为负值如(-1000,-1000,100,4)
但是有一点要注意,不能将其 hidden 设置为YES ,如果设置为YES ,就会检测到 音量滑块 (volumeViewSlider)并没有在视图层级中,系统的音量提示框还会展示
监控系统音量
请参考另一篇文章