iOS的AVFoundation框架提供了基本的音视频播放工具,我们基本上可以靠其中提供的类完成绝大部分的音视频播放任务。但是在音频播放的输出音量的处理上,苹果的策略比较保守。尽管AVPlayerAVPAudiolayerzhe这些类提供了音量调节功能,但这些音量控制属于App级别的控制。好处就是音量调节独立于系统音量,调节大小时不会影响系统音量。但有时候我们可能希望修改系统音量,以免在调节声音的时候,如果系统音量过小,App调节音量效果不明显。一般来说要调节系统音量会有以下方法:

请注意:

修改系统音量无法在模拟器上看到效果,必须使用真机调试才能看到效果!

使用前请导入库 #import <MediaPlayer/MediaPlayer.h>

第一:通过 MPVolumeSettings 来控制系统的声音

类里面提供了三个方法控制声音

MP_EXTERN __TVOS_PROHIBITED void MPVolumeSettingsAlertShow();
MP_EXTERN __TVOS_PROHIBITED void MPVolumeSettingsAlertHide();
MP_EXTERN __TVOS_PROHIBITED BOOL MPVolumeSettingsAlertIsVisible();

具体使用方法请参考另一篇文章 MPVolumeSettingsAlertShow

第二:通过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)并没有在视图层级中,系统的音量提示框还会展示

监控系统音量

请参考另一篇文章

iOS 控制系统的音量改变相关推荐

  1. iOS开发 音频合成,改变音轨音量,改变背景音乐音量,音频剪辑

    项目里面的音频合成,看下面代码就可以实现了,这里只简单实现了俩段音轨的合成以及降低其中一个音频的音量功能 // // NoticeAudioJoinToAudioModel.m // NoticeXi ...

  2. 十年一顾, iOS 与 Android 这样改变了我们

    推荐序:今年是iPhone问世的第10年.10年来,移动互联网飞速发展,我们作为移动开发者,也迎来了自己的黄金十年.小引在本文中,采访了众多的资深移动开发者(也包括我^^),让我们来一起回味这难忘的十 ...

  3. ios 调整麦克风音量_ios 调整麦克风音量_如何在ios 7中获得麦克风音量?

    有一个观点来获得ios 7中的麦克风音量? NSURL *url = [NSURL fileURLWithPath:@"/dev/null"]; NSDictionary *set ...

  4. 使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))

    当你学习了python之后,总想着利用它去做些什么,无论是制作小工具还是小游戏,都是一种锻炼. 那么,利用python加上PyQt5写一个简单的音乐播放器,可能会是一个有趣的体验. 下面我会分享一下如 ...

  5. iOS 设置系统音量和监听系统音量变化

    很简单的调用 首先在工程引入MediaPlayer.framework #import <MediaPlayer/MediaPlayer.h> 1. 获取系统音量 // 获取系统音量 MP ...

  6. 手指滑动控制系统全局音量的程序(中)

    这次的目标是做出一个通过摄像头检测手指滑动,从而可以调整系统全局音量的程序 接着上一篇继续讲 功能实现 1.OpenCV的视频处理 0表示使用系统默认的摄像头 使用一个用久成立的循环,使视频中的每一帧 ...

  7. ios 调整麦克风音量_iOS 音量柱的实现(mic 采集的声音DB反映成音量柱)

    需求 : APP 将麦克风采集到的声音(Audio Queue / Audio Unit) 通过公式转换成DB然后在界面中显示出来可实时检测DB变化. 流程: 配置Audio 初始化参数,必须使用Au ...

  8. ios 中使用blend改变图片的颜色

    在ios开发的过程中,我们经常会遇到这样的情况:当我们点击一个按钮时,按钮的背景颜色会发生变化,一般情况下 我们会调用UIButton 的函数- (void)setBackgroundImage:(U ...

  9. ios 调整麦克风音量_iOS 获取麦克风音量

    项目需求要获取麦克风音量,然后界面做出反馈. 注意:录音之前需要先调用以下方法,因为播放和录制的模式是不同的 [[AVAudioSession sharedInstance] setCategory: ...

最新文章

  1. 3月16日云栖精选夜读:显著超越流行长短时记忆网络,阿里提出DFSMN语音识别声学模型...
  2. html 在weblogic 上编译报错,HTTL在weblogic环境下,JDK版本1.7情况下。出现编译错误。...
  3. Smobiler实现扫描条码和拍照功能(开发日志八)
  4. 计算机蓝屏代码0xc0000020,Win10运行程序提示“损坏的映像 错误0xc0000020”怎么解决?...
  5. python花瓣飘零_Python爬虫练习之花瓣网
  6. 最常见的读入数据方法集锦
  7. MySQL中union和order by一起使用的方法
  8. 引入LeakCanary到项目
  9. ASP中巧用Response属性
  10. Python:functools.cmp_to_key(func)使用
  11. Oracle创建新用户一系列操作模板
  12. win10系统字体颜色变淡
  13. 可扩展标记语言用户界面语言--XUL的定义及标签(详细)
  14. matlab在脚本中用函数,matlab中脚本和函数的怎么调用
  15. Linux 英文版命令窗口,在LINUX命令行中翻译英文
  16. S3C2440的裸奔--内存篇(非MMU)--------转的网友 泠瑛 的博客文章在此谢过!
  17. 神雕侠侣服务器维修时间,神雕侠侣什么时候更新_神雕侠侣更新维护了什么内容_快吧游戏...
  18. python helper方法_Python io_utils.ImportHelper方法代碼示例
  19. kubectl logs 常用命令
  20. 嵌入式linux使用A7680C 4G 网卡

热门文章

  1. 【笔记】29元microbit套装如何玩——手机蓝牙连接下载程序
  2. [Java] MVC 编写程序计算净现值 2020.2.25 Java
  3. PathMatcher 路径匹配器
  4. HCIP高级网络知识整理(十分详细)
  5. 谈谈System类,再细细品味 垃圾回收机制System.gc()
  6. 全球虚拟运营商发展现状与探索
  7. SQLSERVER 集合处理——INTERSECT
  8. java毕业设计创新创业竞赛管理系统2021Mybatis+系统+数据库+调试部署
  9. activiti7入门体验(2)
  10. 二十九、进阶之项目数据请求