2012-06-25 9 views
10

मेरे पास एक आईओएस ऐप है जो एक एवीप्लेयर के साथ पृष्ठभूमि साउंडट्रैक बजाता है और दूसरे एवीप्लेयर के साथ "शीर्ष पर" अन्य ध्वनि क्लिप चलाता है। (ध्वनि क्लिप इंटरनेट से स्ट्रीम किए जाते हैं, इसलिए एवीप्लेयर की आवश्यकता होती है।) समस्या यह है कि जब दूसरा एवीप्लेयर खेलना शुरू करता है, तो यह पृष्ठभूमि एवीप्लेयर को दूसरी टिप्पणी के लिए रुकने का कारण बनता है, जैसा कि इस टिप्पणी में वर्णित है:दो एवीप्लेयर ऑडियो फ़ाइलों को एक साथ खेलते समय ऑडियो गड़बड़ी

Play multiple Audio Files with AVPlayer


मैं इस विधि के साथ ऑडियो क्लिप तैयारी कर रहा हूँ:

- (void)prepareAudio:(NSURL *)assetURL { 

asset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 
playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
[player replaceCurrentItemWithPlayerItem:playerItem]; 


[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil]; 
[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil]; 


[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemDidReachEnd:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:[player currentItem]]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemFailedToReachEnd:) 
              name:AVPlayerItemFailedToPlayToEndTimeNotification 
              object:[player currentItem]]; 
} 

... और फिर [player play]; जब मैं डब्ल्यू लागू प्रत्येक ध्वनि सुनने के लिए चींटी।


वहाँ कुछ मैं क्या करने की जरूरत है जब मैं, ऑडियो सत्र या AVPlayer के प्रत्येक उदाहरण के लिए स्थापित इतना है कि लगता है गड़बड़ बिना मिश्रण है?

उत्तर

2

शायद यह सॉफ़्टवेयर एन्कोडर लात मारने के परिणामस्वरूप है। आपको स्मृति में एक बहुत बड़ा स्पाइक दिखाई देगा क्योंकि सॉफ़्टवेयर एन्कोडर दूसरी ध्वनि क्लिप चलाने का प्रयास करता है। सेब डॉक्स अनुभाग "iOS हार्डवेयर और सॉफ्टवेयर ऑडियो कोडेक्स" http://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html

पर एक नजर डालें "हार्डवेयर की मदद से डिकोडिंग का उपयोग कर, उपकरण केवल समर्थित स्वरूपों में से एक का एक उदाहरण एक समय में खेल सकते हैं।"

इसके अलावा ... "सर्वश्रेष्ठ प्रदर्शन के साथ कई ध्वनियां चलाने के लिए, या पृष्ठभूमि में आईपॉड बजाने के दौरान कुशलता से ध्वनि चलाने के लिए, रैखिक पीसीएम (असम्पीडित) या आईएमए 4 (संपीड़ित) ऑडियो का उपयोग करें।"

यदि आपके पास मीडिया कोडेक्स में कोई विकल्प नहीं है, तो आप प्रदान कर सकते हैं, ऑडियो असीमित फ्रेमवर्क को और अधिक सहज मिश्रण प्राप्त करने के लिए देखें। विशेष रूप से "ऑडियो मिक्सर (मिक्सरहोस्ट)" http://developer.apple.com/library/ios/#samplecode/MixerHost/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010210

+0

यह नहीं हो सकता है। मैंने सीधे पीसीएम असम्पीडित फ़ाइलों का उपयोग करके कुछ प्रयोग किए हैं, और समस्या मौजूद है। ऐसा कहा जा रहा है, ऐसा लगता है कि AVMutableAudioMix लागू होने के साथ कुछ करना है। जब भी यह लागू होता है, तब वह होता है जब बॉबबल होता है। –

1

मुझे अंत में पता चला कि समस्या क्या है। मैं एक एप्लीकेशन लिख रहा हूं जहां मैं AVMutableAudioMixInputParameters क्लास का उपयोग करके वॉल्यूम समायोजित कर रहा हूं, और प्रति वॉल्यूम आधार पर वॉल्यूम ऊपर या नीचे ले जाकर मैं इस कक्षा का उपयोग करके ऑडियो को सामान्य करने का प्रयास कर रहा हूं।

हालांकि यह दृष्टिकोण तब काम करता है जब केवल कुछ वॉल्यूम रैंप होते हैं, ऐसा लगता है कि रैंप का उपयोग उसी थ्रेड पर होता है जो ऑडियो को बफर करता है, इसलिए जब मैं उनमें से बहुत से (> ~ 1000) का उपयोग करता हूं, तो यह आखिर में सीपीयू खा जाता है जो व्यस्त बफरिंग ऑडियो होना चाहिए, और फिर आपके पास ऑडियो में एक ggg-glitch है।

मेरा समाधान एक ही चीज़ प्राप्त करने के लिए कम मात्रा रैंप का उपयोग करने के लिए मेरे वॉल्यूम सामान्यीकरण एल्गोरिदम को दोबारा प्रतिक्रिया देना था। एक बार जब मैं वॉल्यूम रैंप/गीत के प्रत्येक सेट को लगभग 500 या उससे कम तक प्राप्त करने में सक्षम था, तो मुझे अब समस्या नहीं थी, और ऑडियो गड़बड़ दूर हो गई।

संबंधित मुद्दे