最近公司在做视频类的项目,所以跟视频音频方面打交道比较多。因为在网上找来一下,没有直接能用的,所以自己也就写来一个
目前有一个需求
自定义系统音量进度条(iOS 可查看小红书视频详情页)
需求分析
- 当用户按手机上声音加减按钮的时候,系统会弹出当前音量大小的提示框,这个时候我们需要隐藏系统弹出来的当前音量提示框
- 监听系统音量的变化,自定义音量进度条
- 进度条默认是隐藏的,当系统音量发生变化时,显示自定义的进度条,两秒后再隐藏音量隐藏进度条
需求实现(代码)
首先引入系统媒体框架
#import <MediaPlayer/MediaPlayer.h>
- 隐藏进度条。这里需要注意的是,volumeView 不能设置 hidden 属性为 YES,否则系统的音量提示框会弹出来
// 隐藏系统音量提示框
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: CGRectZero];
volumeView.clipsToBounds = YES;
[self.view addSubview: volumeView];
- 监听系统音量变化,实现自定义音量滑杆,自定义音量滑竿默认隐藏,音量改变后两秒滑竿消失,这里的 sliderView(就是一个自定义的滑竿) 初始化时透明度为 0.0,
// 设置音量相关
- (void)settingVolume {
//监听系统音量变化
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryAmbient error:nil];
[session setActive:YES error:nil];
NSError *error;
[[AVAudioSession sharedInstance] setActive:YES error:&error];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChangeNotification:)name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
}
// 音量改变
- (void)volumeChangeNotification:(NSNotification *)noti {
if (self.sliderView.alpha == 0.0) {
[UIView animateWithDuration:0.25 animations:^{
self.sliderView.alpha = 1.0;
}];
}
float volume = [[[noti userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
self.sliderView.value = volume;
self.currentTime = [NSDate date].timeIntervalSince1970;
// 两秒后消失
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSTimeInterval nowTime = [NSDate date].timeIntervalSince1970;
// 容错处理,处理用户连续按音量加减时的情况
if ((nowTime - self.currentTime) >= 2.0) {
[UIView animateWithDuration:0.25 animations:^{
self.sliderView.alpha = 0.0;
} ];
}
});
}