سؤال

حصلت على الرمز التالي:

- (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 يثبت أنه ممكن. المثابرة ، أصدقائي! قون

بعض وثائق Apple هنا: http://developer.apple.com/library/ios/#documentation/audiotoolbox/reference/audiosionservicesReference/Reference/Reference.html

قم بالبحث على الصفحة kAudioSessionProperty_OverrideAudioRoute

بالنسبة لـ iOS7 ، يتم إهمال AudiosessionStproperty. توضح الإجابة في المنشور التالي بواسطة Foundry كيفية القيام بذلك لـ iOS7:

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

مثال جيد جدا هنا http://ruckt.info/playing-sound-through-iphone-speaker/ حل مشكلتي.

الطريقة أدناه - 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);

آمل أن يكون هذا ليس كثيرًا من الانحدار. لقد اعتقدت أنه سيكون من الجيد لأولئك الذين يحتاجون فقط إلى هذين البيانين الصغيرين.

أنت رمز لتشغيل الصوت يبدو صحيحًا ، ولا يوجد سبب يجب أن تضطر إلى استخدام Audiotoolbox. شيء واحد قد ترغب في التأكد منه هو أنك تستخدم تنسيقات الصوت المدعومة. (أنا شخصياً حققت نجاحًا مع 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");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top