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 يثبت أنه ممكن. المثابرة ، أصدقائي! قون
بعض وثائق Apple هنا: http://developer.apple.com/library/ios/#documentation/audiotoolbox/reference/audiosionservicesReference/Reference/Reference.html
قم بالبحث على الصفحة kAudioSessionProperty_OverrideAudioRoute
بالنسبة لـ iOS7 ، يتم إهمال AudiosessionStproperty. توضح الإجابة في المنشور التالي بواسطة Foundry كيفية القيام بذلك لـ iOS7:
مثال جيد جدا هنا 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");
}