iPhone - ابدأ تشغيل مثيلات متعددة من AvaudiopLayer في وقت واحد

StackOverflow https://stackoverflow.com/questions/1687613

  •  18-09-2019
  •  | 
  •  

سؤال

أنا أستخدم مثيلات متعددة من AvaudioPlayer لتشغيل ملفات صوت متعددة في وقت واحد. أقوم بتشغيل حلقة لبدء تشغيل الملفات الصوتية (يتم استدعاء الإعداد مسبقا مسبقا والحلقة فقط إجراء مكالمة إلى طريقة التشغيل)

ولكن دائما، لا يلعب أحد اللاعبين في المزامنة. كيف يمكنني التأكد من أن جميع اللاعبين الأربعة تبدأ في لعب الصوت في وقت واحد؟

شكرا.

هل كانت مفيدة؟

المحلول

لسوء الحظ، لا يمكنك ذلك. لا تقدم Avaudioplayer أي آلية للتحكم الدقيق في وقت البدء. ال currentTime يحدد الممتلكات النقطة الواردة في الملف للقراءة منه، ولا يضمن عند بدء تشغيل مثيل Avaudioplayer عند اللعب في وقت النظام، وهو ما تحتاجه لمزامنة تدفقات صوت متعددة.

عندما أحتاج إلى هذا السلوك، يمكنني استخدام وحدة الصوت RemoteIO + وحدة الصوت 3D Mixer + OptAudioFile.

تعديل

لاحظ أنه اعتبارا من iOS 4، يمكنك مزامنة متعددة AVAudioPlayer الحالات التي تستخدم playAtTime:

نصائح أخرى

ال مستندات أبل تحدث حول كيفية "تشغيل أصوات متعددة في وقت واحد، صوت واحد لكل مشغل صوتي، مع مزامنة دقيقة". ربما تحتاج إلى الاتصال playAtTime: على سبيل المثال [myAudioPlayer playAtTime: myAudioPlayer.deviceCurrentTime + playbackDelay];

في الواقع، فإن مستندات Apple PlayAttime: تحتوي على مقتطف التعليمات البرمجية التالي:

NSTimeInterval shortStartDelay = 0.01;            // seconds
NSTimeInterval now = player.deviceCurrentTime;

[player       playAtTime: now + shortStartDelay];
[secondPlayer playAtTime: now + shortStartDelay];

يجب أن يلعبوا في وقت واحد (على افتراض أنك تختار قيمة كبيرة بما يكفي ل shortStartDelay - ليس قريبا حتى يحدث ذلك قبل إرجاع هذا الموضوع أو أيا كان).

يتيح لك هذا الجزء الرمز من الألغام القيام بذلك طالما لم يكن عليك القيام بذلك على الفور. يمكنك تمرير في وقت المستهدف كقطاع توقيت عندما تريد سماع الأصوات. الحيلة هي الاستفادة من طوابع الزمن ووظائف التأخير في NSOBJECT. أيضا، يستخدم حقيقة أنه يستغرق وقتا أقل من الوقت لتغيير حجم اللاعب مما يفعله لتغيير الوقت الحالي. يجب أن تعمل على وجه التحديد تقريبا.

- (void) moveTrackPlayerTo:(double) timeInSong atTime:(double) targetTime {
 [trackPlayer play];
 trackPlayer.volume = 0;

 double timeOrig = CFAbsoluteTimeGetCurrent();
 double delay = targetTime - CFAbsoluteTimeGetCurrent();
 [self performSelector:@selector(volumeTo:) 
      withObject:[NSNumber numberWithFloat:single.GLTrackVolume] 
      afterDelay:delay];
 trackPlayer.currentTime = timeInSong - delay - (CFAbsoluteTimeGetCurrent() - timeOrig);
}

- (void) volumeTo:(NSNumber *) volNumb {
 trackPlayer.volume = [volNumb floatValue];
}

محاولة لتعيين نفسه الوقت الحالي قيمة العقار لكل كائن Avaudioplayer.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top