美文网首页
ios 视频播放-获取与设置音量

ios 视频播放-获取与设置音量

作者: 愤斗的小蚂蚁 | 来源:发表于2020-02-24 17:39 被阅读0次

    获取音量

    通过MPVolumeView的子视图,私有方法获取MPVolumeSlider,获取音量。有风险,不推荐使用。

        #import <MediaPlayer/MediaPlayer.h>
    
        MPVolumeView *volumeView = [MPVolumeView new];
        volumeView.showsRouteButton = NO;
        volumeView.showsVolumeSlider = NO;
        [self.view addSubview:volumeView];
        __block UISlider *volumeViewSlider = nil;
        [[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    
            if ([obj isKindOfClass:[UISlider class]]) {//    私有的方法 ,不推荐
    
                volumeViewSlider = obj;
                *stop = YES;
            }
        }];
    
        CGFloat volume = volumeViewSlider.value;// 0, 不是当前音量
    

    通过私用方法获取到控制音量的slider,只需要监听它值的改变(valueChange)便可以监听到系统音量的改变,但是在MPVolumeView被创建的时候,其中的slider的值还是为0,需要过一会时间系统才会给slider赋值(不止会赋值一次),此时会调用valueChange,但是并不意味这系统音量的改变。同理,如果想获取系统音量,用AVAudioSession.sharedInstance().outputVolume这个方法,直接读slider的值可能会读不准

    监听方式 如下
    KVO方式 待续、、、

    #import <AVFoundation/AVFoundation.h>
    - (void) someWhere {
        
        // part 1.0 与 part 2.0 执行顺序无关,可以写在其他位置
        // part 1.0
        //监听系统声音
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setCategory:AVAudioSessionCategoryAmbient error:nil];//重点方法
        [session setActive:YES error:nil];
        NSError *error;
        [[AVAudioSession sharedInstance] setActive:YES error:&error];
        //注,ios9上不加这一句会无效
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
        
        // part 2.0
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
    }
    
    - (void) volumeChanged:(NSNotification *)notification {
    
        float volume = [[[notification userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
        ZHNSLog(@"自定义 音量 = %.5f", volume);
    }
    

    swift代码如下

        let volumeV = MPVolumeView(frame: CGRect(x: -3, y: -3, width: 1, height: 1))
            for view in volumeV.subviews{
                if view is UISlider{
                    self.volumeSlider = (view as! UISlider)
                }
            }
        self.view.addSubview(volumeV)
    
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.volumeChange(_:)) , name:Notification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification") , object: nil)
    
            @objc func volumeChange(_ notification:NSNotification) {
                let userInfo = notification.userInfo!
                let volume = userInfo["AVSystemController_AudioVolumeNotificationParameter"] as! Double
            }
        }
    

    设置音量

    1-通过MPMusicPlayerController的volume可以设置音量,查看文档该属性ios(3.0, 7.0),使用时有⚠️。在ios12.0+,13.0+测试可以使用,代码设置音量有效
    2-通过MPVolumeView的子视图,私有方法获取MPVolumeSlider,有风险,不推荐使用。在ios12.0+,13.0+测试无效。

    #import <MediaPlayer/MediaPlayer.h>
    - (void) settingDeviceVolume {
            
        MPMusicPlayerController *musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
        // ios12.0+,13.0+测试可以使用,代码设置音量有效
        if ( [musicPlayer respondsToSelector:@selector(setVolume:)] ) {
    
            //消除警告
            #pragma clang diagnostic push
            #pragma clang diagnostic ignored "-Wdeprecated-declarations"
            [musicPlayer setVolume:0.34512];//MP_DEPRECATED("Use MPVolumeView for volume control.", ios(3.0, 7.0));
            #pragma clang diagnostic pop
        }
        else {
         
            MPVolumeView *volumeView = [MPVolumeView new];
            volumeView.frame=CGRectMake(10,200, 200, 30);
            volumeView.backgroundColor = [UIColor redColor];
            volumeView.showsRouteButton = YES;
            volumeView.showsVolumeSlider = YES;
            [self.view addSubview:volumeView];
            __block UISlider *volumeViewSlider = nil;
            [[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    
                if ([obj isKindOfClass:[UISlider class]]) {//    私有的方法 ,不推荐
    
                    volumeViewSlider = obj;
                    *stop = YES;
                }
                // 或
                if ([((UIView *)obj).class.description isEqualToString:@"MPVolumeSlider"]){
                 
                    volumeViewSlider = (UISlider*)obj;            
                    *stop = YES;
                }
    
            }];
                    
            volumeViewSlider.backgroundColor = [UIColor blueColor];
            [volumeViewSlider setValue:0.27896 animated:YES];// ios12.0+,13.0+测试无效
            [volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
            
        }
    }
    

    相关文章

      网友评论

          本文标题:ios 视频播放-获取与设置音量

          本文链接:https://www.haomeiwen.com/subject/rqgmqhtx.html