iOS的AVFoundation框架提供了基本的音視頻播放工具,我們基本上可以靠其中提供的類完成絕大部分的音視頻播放任務。但是在音頻播放的輸出音量的處理上,蘋果的策略比較保守。儘管AVPlayer
和AVPAudiolayer
zhe這些類提供了音量調節功能,但這些音量控制屬於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();
第二:通過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)並沒有在視圖層級中,系統的音量提示框還會展示
監控系統音量