2011-07-07 9 views
8

सुबह सुबह इस समस्या के खिलाफ मेरे सिर को टक्कर लगी।डेटा की निरंतर स्ट्रीम (आईओएस) से ऑडियो बजाना

मैं सेटअप एक डेटा स्रोत जो ऑडियो डेटा रिटर्न से जुड़ा हुआ (यह एक रिकॉर्डिंग डिवाइस है, इसलिए वहाँ डेटा पर कोई निर्धारित लंबाई है। डेटा बस में धाराओं। जैसा करता है, तो आप एक रेडियो के लिए एक स्ट्रीम को खोलने होगा)

और मैंने अपने कोड में डेटा के सभी पैकेट प्राप्त करने में कामयाब रहे हैं। अब मुझे इसे खेलने की जरूरत है। मैं आने वाले डेटा को खेलना चाहता हूं, इसलिए मैं कुछ मिनट या कुछ भी कतार नहीं करना चाहता, मैं उस सटीक पल पर प्राप्त डेटा का उपयोग करना चाहता हूं और इसे खेलना चाहता हूं।

अब मैं सभी सुबह विभिन्न उदाहरण ढूंढ रहा हूं लेकिन वास्तव में कोई भी बाहर नहीं रखा गया था।

  • (शून्य) सिलसिले में

    : (NSURLConnection ) कनेक्शन didReceiveData: (NSData) डेटा {

समारोह, "डाटा" पैकेज ऑडियो पैकेज है। मैंने इसे AVPlayer, MFVideoPlayer के साथ स्ट्रीम करने का प्रयास किया लेकिन अब तक मेरे लिए कुछ भी काम नहीं किया है। मैटगाल्लाघर के ऑडीस्ट्रीमर को भी देखने की कोशिश की लेकिन अभी भी इसे हासिल करने में असमर्थ था।

कोई भी यहां मदद कर सकता है, कुछ (अधिमानतः) काम कर रहे उदाहरण हैं?

उत्तर

2

सावधान: नीचे दिया गया जवाब केवल तभी वैध है जब आप सर्वर से पीसीएम डेटा प्राप्त करते हैं। यह निश्चित रूप से कभी नहीं होता है। यही कारण है कि ऑडियो को प्रस्तुत करने और डेटा प्राप्त करने के बीच आपको एक और कदम चाहिए: डेटा रूपांतरण।

प्रारूप के आधार पर, यह अधिक या कम मुश्किल हो सकता है, लेकिन सामान्य रूप से आपको इस चरण के लिए ऑडियो कनवर्टर सेवाओं का उपयोग करना चाहिए।

आपको सर्वर से आने वाले डेटा के साथ केवल बफर भरने के लिए -(void)connection:(NSURLConnection)connection didReceiveData:(NSData)data का उपयोग करना चाहिए, इसे खेलने के लिए इस विधि के साथ कुछ भी नहीं होना चाहिए।

अब, आपके द्वारा रिमोटियो और ऑडियो इकाइयों का उपयोग करने के लिए आवश्यक बफर का उपयोग करके स्मृति में संग्रहीत डेटा को चलाने के लिए। Here is a good, comprehensive tutorial। आप ट्यूटोरियल से "रिकॉर्ड" भाग को हटा सकते हैं क्योंकि आपको वास्तव में इसकी आवश्यकता नहीं है।

आप देख सकते हैं, वे प्लेबैक के लिए एक कॉलबैक को परिभाषित:

static OSStatus playbackCallback(void *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp *inTimeStamp, 
          UInt32 inBusNumber, 
          UInt32 inNumberFrames, 
          AudioBufferList *ioData) { 

    for (int i = 0 ; i < ioData->mNumberBuffers; i++){  
     AudioBuffer buffer = ioData->mBuffers[i]; 
     unsigned char *frameBuffer = buffer.mData; 
     for (int j = 0; j < inNumberFrames*2; j++){ 
      frameBuffer[j] = getNextPacket();//this here is a function you have to make to get the next chunk of bytes available in the stream buffer 
     } 
    } 

    return noErr; 
} 

मूल रूप से क्या यह करता है के साथ ioData बफर को भरने के लिए है:

callbackStruct.inputProc = playbackCallback; 
callbackStruct.inputProcRefCon = self; 
status = AudioUnitSetProperty(audioUnit, 
           kAudioUnitProperty_SetRenderCallback, 
           kAudioUnitScope_Global, 
           kOutputBus, 
           &callbackStruct, 
           sizeof(callbackStruct)); 

और playbackCallback समारोह इस तरह दिखता है बाइट्स का अगला हिस्सा जिसे खेला जाना चाहिए। ioData बफर शून्य करने के लिए सुनिश्चित करें कि अगर कोई नया डेटा खेलने के लिए नहीं है (खिलाड़ी को बंद कर दिया गया है तो स्ट्रीम डेटा बफर में पर्याप्त डेटा नहीं है)।

इसके अलावा, आप alSourceQueueBuffers और alSourceUnqueueBuffers का उपयोग करके ओपनएएल के साथ एक ही चीज़ प्राप्त कर सकते हैं ताकि दूसरे के बाद एक बफर कतार हो सके।

यही है। हैप्पी कोडिंग!

+0

टैक्सी आप कैसे nsinputstream में आ रहा है बाइट्स की तरह बाइट्स आने से खेलने ausio ऐसा करने का तरीका समारोह – sajwan

+0

पढ़ राडू @valentin मैं ऑडियो बफर बनाने के लिए से मैं कैसे है कि वापस खेलने कॉल कॉल करने के लिए इस विधि से डेटा और एक और बात हो रही है भ्रमित कर रहा हूँ ? अग्रिम धन्यवाद मदद करने के लिए दयालु हो! –

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