5

私は次のコードを取得しました:

- (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];
4

8 に答える 8

4

それはあなたがそれをどのように設定するかについて厄介です...

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

使用することは非常に重要AVAudioSessionCategoryPlayAndRecordです。そうしないと、ルートがスピーカーに到達できなくなります。オーディオセッションのオーバーライドルートを設定したら、AVAudioPlayerインスタンスを使用して、スピーカーに出力を送信できます。

それが私と同じように他の人にも役立つことを願っています。これに関するドキュメントは散在していますが、Skypeアプリはそれが可能であることを証明しています。頑張って、私の友達!:)

ここにいくつかのアップルのドキュメント:http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

ページで検索してくださいkAudioSessionProperty_OverrideAudioRoute

于 2013-05-28T02:48:49.970 に答える
4

iOS7の場合、AudioSessionSetPropertyは非推奨になりました。ファウンドリによる次の投稿の回答は、iOS7でこれを行う方法を示しています。

https://stackoverflow.com/a/18808124/1949877

于 2013-11-01T22:08:20.793 に答える
3

ここの非常に良い例http://ruckt.info/playing-sound-through-iphone-speaker/私の問題を解決しました。

以下の方法(configureAVAudioSession)は、iOS7.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");
    }
}
于 2015-05-14T08:02:14.937 に答える
2

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);
}
于 2010-04-23T12:12:18.470 に答える
2

この投稿の他の読者のために、これを明確にするつもりです。

私はこの問題の答え、特にSpeakHereの例を探していました。私はこの小さなコードの塊をつかみました、そしてそれはトリックをしました。

 UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

これが余談ではないことを願っています。私はちょうどこれらの2つの小さなステートメントが必要な人にとっては良いことだと思いました。

于 2011-02-20T16:25:20.267 に答える
1

サウンドを再生するためのコードは正しく見えます。AudioToolboxを使用する必要がある理由はありません。確認したいことの1つは、サポートされているオーディオ形式を使用していることです。(私は個人的にMP3とWAVで成功しました)

また、サウンドファイルのURLを取得する方法についてのコードを教えていただけますか?

于 2010-04-24T22:44:08.590 に答える
1

他の回答は、レシーバーではなくスピーカーでオーディオを再生するという望ましい効果を提供しますが、その目標を達成するための慣用的な方法ではありません。

むしろAVAudioSessionCategoryOption(一口)を使用する必要がありDefaultToSpeakerます。そのためのドキュメントは次のとおりです(私の強調):

このオプションを使用していて、他のオーディオルート(ヘッドセットなど)が利用できない場合、セッションオーディオはデバイスの内蔵スピーカーから再生されます。このオプションを使用せず、他のオーディオ出力が利用できないか選択されていない場合、オーディオはレシーバー(耳に当てることを目的としたスピーカー)を介して再生されます。受信機が装備されているのはiPhoneデバイスのみであることに注意してください。iPadおよびiPodtouchデバイスでは、このオプションは効果がありません。

これを使用するには、次のように呼び出しを変更しsetCategory:てオプションを渡します。

let session = AVAudioSession.sharedInstance()
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DefaultToSpeaker])
于 2016-02-17T05:31:58.857 に答える
0

これを試して:

NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];    
if(error) { 
    NSLog(@"STKAudioManager: AudioSession cannot use speakers");
}
于 2015-11-25T15:41:17.307 に答える