- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在尝试让我的应用程序中的音频通过 iPhone 上的上部扬声器播放,即您在通话期间按在耳朵上的那个扬声器。我知道这是可能的,因为我玩过 App Store 上的一款模拟电话的游戏(“The Heist” by “tap tap tap”),并且确实做到了这一点。
我在网上做了很多研究,但我很难找到任何人甚至讨论过这种可能性。绝大多数帖子似乎是关于免提扬声器与插入式耳机(如 this 和 this 和 this),而不是上面的“电话”扬声器与免提扬声器。 (这个问题的一部分可能没有一个好名字:“电话扬声器”通常意味着设备底部的免提扬声器等,因此很难进行真正有针对性的搜索)。我查看了 Apple 的 Audio Session Category Route Overrides
,但那些似乎再次(如果我错了请纠正我)只处理底部的免提扬声器,而不是电话顶部的扬声器。
我找到了一篇似乎与此相关的帖子:link .它甚至提供了一堆代码,所以我以为我可以在家自由,但现在我似乎无法让代码工作。为简单起见,我只是复制了 DisableSpeakerPhone
方法(如果我理解正确,它应该是将音频重新路由到上扬声器的方法)到我的 viewDidLoad
看看它是否会工作,但第一个“断言”行失败,音频继续在底部播放。 (我还按照评论中的建议导入了 AudioToolbox 框架,所以这不是问题。)
这是我正在使用的主要代码块(这是我复制到我的 viewDidLoad
中进行测试的内容),尽管我链接到的文章中还有一些方法:
void DisableSpeakerPhone () {
UInt32 dataSize = sizeof(CFStringRef);
CFStringRef currentRoute = NULL;
OSStatus result = noErr;
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, ¤tRoute);
// Set the category to use the speakers and microphone.
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory,
sizeof (sessionCategory),
&sessionCategory
);
assert(result == kAudioSessionNoError);
Float64 sampleRate = 44100.0;
dataSize = sizeof(sampleRate);
result = AudioSessionSetProperty (
kAudioSessionProperty_PreferredHardwareSampleRate,
dataSize,
&sampleRate
);
assert(result == kAudioSessionNoError);
// Default to speakerphone if a headset isn't plugged in.
// Overriding the output audio route
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
dataSize = sizeof(audioRouteOverride);
AudioSessionSetProperty(
kAudioSessionProperty_OverrideAudioRoute,
dataSize,
&audioRouteOverride);
assert(result == kAudioSessionNoError);
AudioSessionSetActive(YES);
}
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive: YES error:nil];
viewDidLoad
.但是,它仍然无法正常工作(我的意思是音频仍然从手机底部的扬声器而不是顶部的接收器发出)。显然默认行为应该是
AVAudioSessionCategoryPlayAndRecord
自己从接收器发送音频,所以还是有问题。
viewDidLoad
中的 AVAudioSession 行之后立即初始化,这是值得的):
_musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
MPMediaPickerController
选择的:
- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {
if (mediaItemCollection) {
[_musicPlayer setQueueWithItemCollection: mediaItemCollection];
[_musicPlayer play];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
最佳答案
您必须先初始化 Audio Session 。
使用 C API
AudioSessionInitialize (NULL, NULL, NULL, NULL);
AVAudioSession
):
self.audioSession = [AVAudioSession sharedInstance];
[self.audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
error:nil];
const CFStringRef kAudioSessionOutputRoute_BuiltInReceiver;
const CFStringRef kAudioSessionOutputRoute_BuiltInSpeaker;
kAudioSessionOverrideAudioRoute_None
:
MPMusicPlayerController
类(class)。此类调用全局音乐播放器(与音乐应用程序中使用的播放器相同)。此音乐播放器与您的应用程序分开,因此不会与您的应用程序的 audioSession 共享相同的 Audio Session 。 MPMusicPlayerController 将忽略您在应用的 audioSession 上设置的任何属性。
AVAudioRecorder
/
AVAudioPlayer
或核心音频(音频队列、音频单元或 OpenAL)。无论您使用哪种方法,都可以通过
AVAudioSession
控制 Audio Session 。属性或通过 Core Audio API。 Core Audio 为您提供更细粒度的控制,但随着 iOS 的每个新版本,更多的它被移植到 AVFoundation,所以从它开始。
Could there be a way to pull an MPMediaItem from the MPMusicPlayerController and then play them through the app-specific audio session, or anything like that?
otherAudioPlaying
ios6 中的只读 BOOL 属性,仅此而已
关于ios - 通过上部(电话)扬声器播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026578/
本文实例讲述了Android开发之关闭和打开Speaker(扬声器)的方法。分享给大家供大家参考,具体如下: ?
是否可以在Delphi Code中控制(启用/禁用)扬声器图标。 是否有注册表项? 非常感谢... 最佳答案 尽管可以通过更改未记录的注册表值来“隐藏”图标,但用户可以在tray icon选项中再次取
我正在尝试从麦克风获取音频并通过连接到辅助设备的扬声器进行流式传输我使用了此代码,但它在录音机的初始化中不起作用但我真正的问题是“这是正确的方法还是有更好的方法”以及如何解决初始化音频的问题 publ
此问题之前已在此站点上被问过和回答过两次,但该代码似乎根本不适用于现代手机。我正在使用 Android 4.2 和 Android 4.3,但似乎都不起作用。 我在通话期间通过媒体播放器播放 MP3,
我想知道如何开发应用程序/服务器。我的安卓手机会在我说话时录制我的声音,并将其发送到 PC,然后使用 PC 的扬声器播放。 我想我需要一个在计算机上运行的媒体服务器来接收我的声音,然后使用手机上已有的
背景 我需要在软电话应用程序中显示连接的耳机列表(麦克风和耳机组合)。为了进行测试,我有以下设备: 捷波朗 PRO 9470 缤特力 BT300M 罗技 G430 游戏耳机麦克风 用户应该能够从 Co
如标题,我想知道如何获得我的 voip 应用程序的可用输出声音路径列表,或重现默认的 IOS 效果。此时我可以在用户调用电话时启用/禁用扬声器,但如果用户连接了蓝牙耳机,我希望用户可以选择使用哪条路由
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我使用了以下代码,它希望通过系统扬声器发出声音。代码确实听起来但通过声卡(桌面扬声器/耳机)。 我认为可以直接使用系统蜂鸣器发出声音,因为在设备管理器中它会显示相应的驱动程序。有没有解决这个问题的方法
我正在尝试使用nodejs(带 Electron )播放警告声音,即使音量调低或连接了耳机,也应始终在系统默认设备(扬声器)上以最大音量播放警告声音。 到目前为止,我使用 naudiodon播放声音,
如标题所示,如何将来电中的音频静音?我对任何类型的解决方案都感兴趣,使用 SDK、NDK 中的 API,甚至修改 AOSP 内核源代码并重新编译它们,可能会公开一个新接口(interface)。 最佳
我正在尝试开发一个应用程序来记录双方(麦克风和扬声器)的通话。我已经看到有一个应用程序 vrecorder 为 android 1.6 提供这个 vrecorder。 现在我想为 android 2.
在我正在使用的应用中,我们目前支持 Chromecast,但我们有兴趣添加对 Sonos 扬声器的转换支持,就像在 Play Music 中所做的那样。 当使用 MediaRouter 列出可用路线时
有没有办法在 java 中获取设备(扬声器、耳机)的 GUID?我正在尝试修改注册表中的特定值,例如我需要这个键名 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wind
我正在运行 Debian Sid,我想知道我的 USB 扬声器在系统中的什么位置。例如:当我插入笔式驱动器时,dmesg 会显示它的位置(sda、sdb 等)。但是当我插入 USB 扬声器时,它没有显
我在使用 Galaxy S5 时遇到了一个奇怪的设备特定问题。我正在使用 SIP (Linphone) 从 Galaxy S5 调用另一台设备,当我启用扬声器时,该设备开始使用其主麦克风作为降噪麦克风
我想在iPad上专门检测一下有没有耳机 例如 - 我可以使用 AVFoundation 检测 iOS 设备是否有 Tourch,所以有什么方法可以检测耳机的可用性。 最佳答案 1) 如果你想检查设备上
如何在 linux 中使用 PC 扬声器进行 c/c++ 编程?我可以控制哔声的时间和频率吗? 最佳答案 取自 here : #include #include #include int mai
我正在尝试使用 C# 和 NAudio API 记录扬声器输出以检测任何播放音乐的音量和 BPM。 问题是,我不知道该怎么做:/ 我有来自 http://opensebj.blogspot.de/20
想要的功能: 它类似于 iPhone 原生手机应用程序。当有蓝牙/耳机连接到 iPhone 时,扬声器按钮(通常只有扬声器/电话切换)将显示所有可用的音频输出设备。默认使用蓝牙。用户可以选择另一个设备
我是一名优秀的程序员,十分优秀!