iOS 开启静音键时APP播放视频没有声音

本文介绍了如何在iOS应用中实现在设备静音模式下仍然能播放视频的声音。通过设置`AVAudioSession`的类别和激活状态,确保视频在后台和静音模式下都能正常播放。提供了Objective-C和Swift两种语言的实现代码,包括处理电话打断的回调方法。此外,还给出了针对不同iOS版本的兼容性解决方案。
摘要由CSDN通过智能技术生成
前言

按照正常思路来说,开启静音键,播放视频也应该没有声音。关闭静音键,视频有声音,这才是正常思维,所以很多第三方框架也是这样的。但是产品要求用户静音键开启,播放视频也需要有声音,好吧,只能硬头皮实现。

一、OC实现方法
 //后台播放 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:nil];
//静音状态下播放 
[[AVAudioSession sharedInstance] setActive:YES error:nil];
//设置代理 可以处理电话打进时中断音乐播放 
  [[AVAudioSession sharedInstance] setDelegate:self]; 
//当有电话打进的时候,这里可以处理将正在播放的音乐停止,然后打完电话后再重新播放
- (void)beginInterruption{
//停止播放的事件
}
- (void)endInterruption{
//继续播放的事件
}
二、Swift实现方法

现在我总结出最终的方法:

do {
    if #available(iOS 11.0, *) {
        try audioSession.setCategory(.playback, mode: .default, policy: .longForm, options: [])
    } else if #available(iOS 10.0, *) {
        try audioSession.setCategory(.playback, mode: .default, options: [])
    } else {
        // Compiler error: 'setCategory' is unavailable in Swift
        try audioSession.setCategory(AVAudioSession.Category.playback)
    }
    try AVAudioSession.sharedInstance().setActive(true)
} catch let error {
    print("Unable to configure audio sesson category: \(error)")
}
除此之外,网上还有各种方法,如果你需要支持iOS10一下的,那么可以参考一下:
1、方法一
if #available(iOS 10.0, *) {
  try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
} else { 
  // Set category with options (iOS 9+) setCategory(_:options:)       
  AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:withOptions:error:"), with: AVAudioSession.Category.playback, with:  [])

  // Set category without options (<= iOS 9) setCategory(_:)
  AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
}
//静音状态下播放 
try AVAudioSession.sharedInstance().setActive(true)
2、方法二

创建一个oc文件AudioSessionHelper然后在Swift中调用
AudioSessionHelper.h

#ifndef AudioSessionHelper_h
#define AudioSessionHelper_h
#import <AVFoundation/AVFoundation.h>

@interface AudioSessionHelper: NSObject
+ (BOOL) setAudioSessionWithError:(NSError **) error;
@end

#endif /* AudioSessionHelper_h */

AudioSessionHelper.m

#import "AudioSessionHelper.h"
#import <Foundation/Foundation.h>

@implementation AudioSessionHelper: NSObject

+ (BOOL) setAudioSessionWithError:(NSError **) error {
    BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:error];
    if (!success && error) {
        return false;
    } else {
        return true;
    }
}
@end

在[项目]-Bridging-Header.h文件中加入

#import "AudioSessionHelper.h"

在Swift中使用

if #available(iOS 10.0, *) {
    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
} else {
    try AudioSessionHelper.setAudioSession()
}
try AVAudioSession.sharedInstance().setActive(true)
方法三
do{
            if #available(iOS 10.0, *) {
                try? AVAudioSession.sharedInstance().setCategory(.playback,mode: .default)
            }else{
                AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"),with: AVAudioSession.Category.playback)
            }
            try AVAudioSession.sharedInstance().setActive(true)
        }catch{
            printLog(error)
        }

参考地址AVAudioSession分类详解
END.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明似水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值