ios开发 静音键设置_ios监听静音键和音量键事件

判断是否静音:

viewplain copytoclipboard print ?

- (BOOL)isMuted

{

CFStringRef route;

UInt32 routeSize = sizeof(CFStringRef);

OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &routeSize, &route);

if (status == kAudioSessionNoError)

{

if (route == NULL || !CFStringGetLength(route))

return TRUE;

}

return FALSE;

}

监听静音键:

viewplain copytoclipboard print ?

- (BOOL)addMutedListener

{

OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,

audioRouteChangeListenerCallback,

self);

return s == kAudioSessionNoError;

}

回调函数:

viewplain copytoclipboard print ?

void audioRouteChangeListenerCallback (void *inUserData,

AudioSessionPropertyID inPropertyID,

UInt32 inPropertyValueSize,

const void *inPropertyValue

)

{

if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;

BOOL muted = [mediaVolume isMuted];

// add code here

}

设置和获取音量:

viewplain copytoclipboard print ?

- (float)volume

{

return [[MPMusicPlayerController applicationMusicPlayer] volume];

}

- (void)setVolume:(float)newVolume

{

[[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume];

}

监听音量键:

viewplain copytoclipboard print ?

- (BOOL)addHardKeyVolumeListener

{

OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,

audioVolumeChangeListenerCallback,

self);

return s == kAudioSessionNoError;

}

音量键回调函数:

viewplain copytoclipboard print ?

void audioVolumeChangeListenerCallback (void *inUserData,

AudioSessionPropertyID inPropertyID,

UInt32 inPropertyValueSize,

const void *inPropertyValue)

{

if (inPropertyID != kAudioSessionProperty_CurrentHardwareOutputVolume) return;

Float32 value = *(Float32 *)inPropertyValue;

MediaVolume *mediaVolume = (MediaVolume *)inUserData;

// add code here

}

方法1:

在applicationDidFinishLaunching函数里添加

[[NSNotificationCenter defaultCenter]addObserver:self

selector:@selector(volumeChanged:)

name:@"AVSystemController_SystemVolumeDidChangeNotification"

object:nil];

- (void)volumeChanged:(NSNotification*)notification

{

float volume=

[[[notification userInfo]

objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"]

floatValue];

DDLogVerbose(@"current volume = %f",volume);

}

弊端:当app进入后天后,依然会监听到volume的变化

2. 对 AudioSession 添加volume变化的 listener,可以放在startAudioSession函数里

//add alistener for Outputvolume

AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,

volumeListenerCallback,

self

);

void volumeListenerCallback (

void                     *inClientData,

AudioSessionPropertyID   inID,

UInt32                   inDataSize,

constvoid               *inData

){

const float*volumePointer = inData;

float volume= *volumePointer;

NSLog(@"volumeListenerCallback %f", volume);

}

3. 获取当前的volume

float volume = 0.0;

UInt32dataSize = sizeof(float);

OSStatusstatus = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareOutputVolume,

&dataSize,

&volume);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS语音通话可以通过苹果提供的AVFoundation框架来实现,具体步骤如下: 1. 导入AVFoundation框架 在项目中导入AVFoundation框架,这个框架提供了音频和视频播放、录制、编辑等功能。 2. 创建AVAudioSession会话 AVAudioSession提供了一个音频会话来管理应用程序的音频功能,包括设置音量、启动和停止录音、控制多路音频等。 ```swift let session = AVAudioSession.sharedInstance() do { try session.setCategory(.playAndRecord, mode: .default) try session.setActive(true) } catch { print(error.localizedDescription) } ``` 这里我们设置会话的类别为playAndRecord,表示同时支持播放和录制。 3. 创建AVAudioEngine引擎 AVAudioEngine是一个强大的音频处理引擎,可以用它来处理音频数据。 ```swift let engine = AVAudioEngine() ``` 4. 创建AVAudioPlayerNode节点和AVAudioInputNode节点 AVAudioPlayerNode节点用于播放来自远程用户的音频数据,而AVAudioInputNode节点用于录制本地用户的音频数据。 ```swift let player = AVAudioPlayerNode() let input = engine.inputNode ``` 5. 连接输入和输出 将AVAudioInputNode节点和AVAudioPlayerNode节点连接起来,这样本地用户录制的音频数据就会被发送给远程用户,而远程用户的音频数据则会通过AVAudioPlayerNode节点播放出来。 ```swift engine.connect(input, to: player, format: input.outputFormat(forBus: 0)) ``` 6. 启动引擎 ```swift try? engine.start() ``` 7. 开始录制和播放 用户按下语音对讲按钮时,我们开始录制本地音频数据,并向远程用户发送数据。同时,我们也开始播放来自远程用户的音频数据。 ```swift // 开始录制 input.installTap(onBus: 0, bufferSize: 1024, format: input.outputFormat(forBus: 0)) { (buffer, time) in // 发送数据给远端用户 } // 开始播放 player.play() ``` 8. 停止录制和播放 用户松开语音对讲按钮时,我们停止录制本地音频数据,并停止向远程用户发送数据。同时,我们也停止播放来自远程用户的音频数据。 ```swift // 停止录制 input.removeTap(onBus: 0) // 停止播放 player.stop() ``` 以上就是使用AVFoundation框架实现iOS语音通话的基本步骤,具体实现还需要考虑音频编解码、网络传输等技术细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值