スピーカーを介したavaudioplayer
-
27-09-2019 - |
質問
次のコードがありました:
- (id)init {
if (self = [super init]) {
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
}
return self;
}
しかし、どういうわけか音はスピーカーから出たくありません、誰かが私が間違っていることを見ることができますか?
私が再生に使用するコードは次のとおりです。
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFilePathURL error:nil];
[player prepareToPlay];
[player setVolume:1.0];
[player play];
解決
Audiotoolboxフレームワークを使用しました。そのため、次のようにオーディオセッションを初期化しました。
AudioSessionInitialize(NULL, NULL, NULL, NULL);
オーディオセッションの構成に使用したコードの残りの部分は次のとおりです。私はオーディオルートをオーバーライドしませんでしたし、これも必要ではないと思います。
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
OSStatus err = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
AudioSessionSetActive(TRUE);
if (err) {
NSLog(@"AudioSessionSetProperty kAudioSessionProperty_AudioCategory failed: %d", err);
}
他のヒント
それはあなたがそれをどのようにセットアップするかについてうるさいです...
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);
使用することは非常に重要です AVAudioSessionCategoryPlayAndRecord
または、ルートがスピーカーに移動できません。オーディオセッションのオーバーライドルートを設定したら、 AVAudioPlayer
インスタンスして、スピーカーに出力を送信します。
それが私のように他の人のためにうまくいくことを願っています。これに関するドキュメントは散らばっていますが、Skypeアプリはそれが可能であることを証明しています。 Persevere、私の友達! :)
ここにいくつかのAppleドキュメント: http://developer.apple.com/library/ios/#documentation/audiotoolbox/reference/audiosesservicesreference/reference/reference.html
ページで検索を行います kAudioSessionProperty_OverrideAudioRoute
iOS7の場合、audiosessionsetpropertyは非推奨です。 Foundryによる次の投稿の答えは、iOS7に対してこれを行う方法を示しています。
ここで非常に良い例です http://ruckt.info/playing-sound-through-iphone-peaker/ 私の問題を解決しました。
以下の方法-ConfigureAvaudiosession- iOS 7.0のメインスピーカーにオーディオを再ルーティングします。これを行うには、この方法でオーディオを再生する前に電話してください。 [self configureAVAudioSession]
.
- (void) configureAVAudioSession //To play through main iPhone Speakers
{
//get your app's audioSession singleton object
AVAudioSession* session = [AVAudioSession sharedInstance];
//error handling
BOOL success;
NSError* error;
//set the audioSession category.
//Needs to be Record or PlayAndRecord to use audioRouteOverride:
success = [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
if (!success)
{
NSLog(@"AVAudioSession error setting category:%@",error);
}
//set the audioSession override
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
if (!success)
{
NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
}
//activate the audio session
success = [session setActive:YES error:&error];
if (!success)
{
NSLog(@"AVAudioSession error activating: %@",error);
}
else
{
NSLog(@"audioSession active");
}
}
この投稿の他の読者のためにこれを明確にするつもりです。
私はこの問題に対する答えを探していました。特にSpeakhereの例です。私はこの小さなコードをつかみました、そしてそれはトリックをしました。
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
これがあまりにも多くの余談ではないことを願っています。私はちょうど、これら2つの小さな声明を必要としている人にとっては良いことだと思いました。
サウンドを再生するためのコードは正しいように見えますが、audiotoolboxを使用する必要がある理由はありません。あなたが確実にしたいかもしれないことの1つは、サポートされているオーディオ形式を使用していることです。 (私は個人的にMP3とWAVで成功しました)
また、サウンドファイルにURLを取得する方法についてコードを共有できますか?
他の回答は、受信機の代わりにスピーカーでオーディオを再生するという望ましい効果を提供しますが、それらはその目標を達成するための慣用的な方法ではありません。
むしろ使用する必要があります AVAudioSessionCategoryOption
(なんて口いっぱい) DefaultToSpeaker
. 。そのためのドキュメントは読みます(私の強調):
このオプションを使用する場合 また、他のオーディオルート(ヘッドセットなど)は利用できません、セッション オーディオは、デバイスの内蔵スピーカーを介して再生されます. このオプションを使用していない場合, 、および他のオーディオ出力は利用できないか選択されていません、 オーディオはレシーバーを介して再生されます (耳に保持されることを意図したスピーカー)。 iPhoneデバイスのみにレシーバーが装備されていることに注意してください。 iPadおよびiPod Touchデバイスでは、このオプションには効果がありません。
これを使用するには、電話を変更します setCategory:
このようにオプションを渡すには:
let session = AVAudioSession.sharedInstance()
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DefaultToSpeaker])
これを試して:
NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
if(error) {
NSLog(@"STKAudioManager: AudioSession cannot use speakers");
}