2012-08-02 23 views
6

मेरे पास एक ऐसा प्रोग्राम है जो ऑडियो प्लेयर को चलाने, रोकने और रोकने के लिए फ़ाइल प्लेयर ऑडियो यूनिट का उपयोग करता है। जिस तरह से मैं इसे पूरा कर रहा हूं, फ़ाइल प्लेयर ऑडियो इकाई को स्थिति शून्य पर फ़ाइल चलाने के लिए प्रारंभ करना है और फिर जब उपयोगकर्ता रोकें बटन दबाता है, तो मैं ऑग्राफ को रोकता हूं, वर्तमान स्थिति को कैप्चर करता हूं, और फिर उस स्थिति को प्रारंभ स्थिति के रूप में उपयोग करता हूं जब उपयोगकर्ता play बटन दबाता है। सबकुछ काम कर रहा है जैसा कि करना चाहिए, लेकिन हर 3 या 4 बार मैंने रोक दिया और फिर खेलते हैं, गीत उस बिंदु से पहले एक पूर्ण सेकेंड में आधा खेलना शुरू कर देता है, जहां मैंने रोक दिया था।आईओएस कोर ऑडियो में, आप फ़ाइल प्लेयर ऑडियो यूनिट की वास्तविक वर्तमान प्ले हेड स्थिति कैसे प्राप्त करते हैं?

मुझे पता नहीं चल रहा है कि यह क्यों हो रहा है, क्या आप में से कोई भी विचार है? यहां मेरे कोड का सरलीकृत संस्करण है।

//initialize AUGraph and File player Audio unit 
... 
... 
... 

//Start AUGraph 
... 
... 
... 

// pause playback 
- (void) pauseAUGraph { 

//first stop the AuGrpah 
     result = AUGraphStop (processingGraph); 

// get current play head position   
     AudioTimeStamp ts; 
     UInt32 size = sizeof(ts); 

     result = AudioUnitGetProperty(filePlayerUnit, 
             kAudioUnitProperty_CurrentPlayTime, kAudioUnitScope_Global, 0, &ts, 
             &size); 
     //save our play head position for use later 
     //must add it to itself to take care of multiple presses of the pause button 
     sampleFrameSavedPosition = sampleFrameSavedPosition + ts.mSampleTime; 


     //this stops the file player unit from playing 
     AudioUnitReset(filePlayerUnit, kAudioUnitScope_Global, 0); 
     NSLog (@"AudioUnitReset - stopped file player from playing"); 

    //all done  
} 


// Stop playback 

- (void) stopAUGraph { 
     // lets set the play head to zero, so that when we restart, we restart at the beginning of the file. 

      sampleFrameSavedPosition = 0; 
     //ok now that we saved the current pleayhead position, lets stop the AUGraph 
     result = AUGraphStop (processingGraph); 
} 
+0

ऑडियो फ़ाइल कौन सा प्रारूप है? –

+0

वे एम 4 ए फाइलें हैं। – Beleg

+0

ठीक है, मैं ऑडियो संपीड़न में एक विशेषज्ञ नहीं हूं, लेकिन फ़ाइलों को खंडों में संपीड़ित किया जाता है और जब आप इसे खोजते हैं तो वास्तविक स्थिति की बजाय निकटतम खंड में जा सकते हैं। अगर मैं कुछ और निश्चित हो जाता हूं तो मैं एक उत्तर पोस्ट करूंगा। –

उत्तर

0

यह कारण अपने कोड के साथ समस्याओं गोलाई के लिए हो सकता है:

उदाहरण के लिए, अगर हर बार जब आप ठहराव बटन हिट, अपने टाइमर एक 0.5/4 सेकंड में अपने वास्तविक ठहराव समय से पहले रिकॉर्ड होगा, आप अभी भी वांछित परिणाम देखेंगे। लेकिन चार बार दोहराने के बाद, आपके द्वारा बनाई गई जगह की मात्रा 0.5/4 गुणा 4 है जो कि एक सेकंड का आधा है जो आपको लगता है।

इस प्रकार, मैं आपके द्वारा उपयोग किए जा रहे ऑब्जेक्ट प्रकारों पर सावधानीपूर्वक ध्यान देना होगा और सुनिश्चित कर लें कि वे अनुपयुक्त नहीं हैं। उस समस्या को कम करने का प्रयास करने के लिए अपने नमूना समय के लिए double float का उपयोग करने का प्रयास करें!

आशा है कि यह स्पष्ट और सहायक है! :)

+0

में सेकेंड में समय दिखाना चाहता हूं, मैं ऑडियोटाइमस्टैम्प.एम नमूना समय को नमूना फ्रेम में सहेजने के लिए फ्लोट 64 का उपयोग कर रहा हूं, इसलिए कोई गोल करने वाली त्रुटियां नहीं होनी चाहिए। मैंने नोटिस किया कि जब मैं अनुसूचित AudioFileRegion.mStartFrame को सेट करके ऑग्राफ बैक अप शुरू करता हूं, तो शेड्यूलडऑडियोियोइलरियन.एमस्टार्टफ्रेम एक UInt32 है और फ्लोट 64 नहीं है, यह कहा जा रहा है कि जब मैं अपने प्रोग्राम का परीक्षण करता हूं और mSampleTime के मान मुद्रित करता हूं तो हमेशा एक पूर्णांक नहीं होता है मेटर। – Beleg

+0

फिर सिद्धांत में, यदि आपके सभी प्रकार पूर्णांक हैं, तो इसे एक अंश भी आउटपुट नहीं करना चाहिए। क्या आपने हर बार सिर की स्थिति को आउटपुट करने का प्रयास किया और देखा कि क्या यह जोड़ा गया है? – wayway

1

क्या आपको टाइमस्टैम्प की बजाय पैकेट गणना का उपयोग करना चाहिए, क्योंकि आप बस संगीत को रोकना और खेलना चाहते हैं, समय की जानकारी प्रदर्शित नहीं करना चाहते हैं।

इस विधि का उपयोग करने के उदाहरण के लिए BufferedAudioPlayer देखें।

+0

तो आप एक फ़ाइल प्लेयर ऑडियो इकाई के बजाय रेंडरकॉलबैक का उपयोग करने और टाइमस्टैम्प का उपयोग करने के बजाय पैकेट गिनने का सुझाव दे रहे हैं? मैं आज रात कोशिश करूँगा। – Beleg

+0

हां। मैंने इसे एक से अधिक परियोजनाओं में सफलतापूर्वक उपयोग किया। ऑडियोग्राफ (https://github.com/tkzic/audiograph) एक और उदाहरण है जो एक ही दृष्टिकोण लेता है। यह परियोजना भी एक बहुत अच्छा मैनुअल के साथ आता है। – Totoro

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

  • कोई संबंधित समस्या नहीं^_^