2010-11-28 10 views
7

में मैं iPhone/iPad पर एक ऑडियो फ़ाइल के लिए कच्चे डेटा का उपयोग करने की कोशिश कर रहा हूँ। मेरे पास निम्न कोड है जो मुझे आवश्यक पथ के नीचे एक मूल शुरुआत है। हालांकि मैं ऑडियोबफर होने के बाद क्या करना है, इस पर मैं फंस गया हूं।फ्रेम्स की संख्या का निर्धारण एक कोर ऑडियो AudioBuffer

AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:urlAsset error:nil]; 
AVAssetReaderTrackOutput *assetReaderOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[urlAsset tracks] objectAtIndex:0] outputSettings:nil]; 
[assetReader addOutput:assetReaderOutput]; 
[assetReader startReading]; 

CMSampleBufferRef ref; 
NSArray *outputs = assetReader.outputs; 
AVAssetReaderOutput *output = [outputs objectAtIndex:0]; 
int y = 0; 
while (ref = [output copyNextSampleBuffer]) { 
    AudioBufferList audioBufferList; 
    CMBlockBufferRef blockBuffer; 
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer); 
    for (y=0; y<audioBufferList.mNumberBuffers; y++) { 
     AudioBuffer audioBuffer = audioBufferList.mBuffers[y]; 
     SInt16 *frames = audioBuffer.mData; 
     for(int i = 0; i < 24000; i++) { // This sometimes crashes 
      Float32 currentFrame = frames[i]/32768.0f; 
     } 
    } 
} 

अनिवार्य रूप से मैं नहीं जानता कि यह बताने के लिए कैसे कितने तख्ते प्रत्येक बफर तो मैं मज़बूती से उन लोगों से डेटा निकालने नहीं कर सकते हैं। मैं कच्चे ऑडियो डेटा के साथ काम करने के लिए नया हूं इसलिए ऑडियोबफर संरचना की एमडीटा संपत्ति को सर्वोत्तम तरीके से पढ़ने के तरीके में मैं किसी भी सुझाव के लिए खुला हूं। मैंने अतीत में शून्य पॉइंटर्स के साथ भी बहुत कुछ नहीं किया है, इसलिए इस संदर्भ में इसकी मदद भी बहुत अच्छी होगी!

+0

उत्कृष्ट प्रश्न! आपके प्रश्न ने मेरी इसी तरह की समस्या को हल करने में मदद की। – user523234

+0

आप blockBuffer –

उत्तर

13

audioBuffer.mDataByteSize आप बफर के आकार बताता है। क्या आप यह जानते थे? बस आपको लगता है कि आपने स्ट्रक्चर ऑडियोबफर की घोषणा को नहीं देखा होगा। आपको हमेशा हेडर फ़ाइलों के साथ-साथ दस्तावेज़ों को देखना चाहिए।

mDataByteSize के लिए समझ बनाने के लिए आप डाटा का स्वरूप पता होना चाहिए। आउटपुट मानों की गणना mDataByteSize/sizeof (outputType) है। हालांकि, आप प्रारूप के बारे में उलझन में लगते हैं - आपको इसे कहीं निर्दिष्ट करना होगा। सबसे पहले आप इसे इलाज के रूप में एक 16bit पूर्णांक

SInt16 *frames = audioBuffer.mData

पर हस्ताक्षर किए तो आप 32 बिट फ्लोट

Float32 currentFrame = frames[i]/32768.0f

के रूप में यह इलाज inbetween आप मान 24000 मूल्यों, बेशक इस वसीयत देखते हैं कि अगर वास्तव में 24000 16 बिट मूल्य नहीं हैं तो क्रैश। साथ ही, आप डेटा को 'फ्रेम' के रूप में संदर्भित करते हैं लेकिन आप वास्तव में क्या मतलब नमूने हैं। प्रत्येक मान जिसे आप 'currentFrame' कहते हैं वह ऑडियो का एक नमूना है। 'फ़्रेम' आमतौर पर .mData

जैसे नमूनों के ब्लॉक को संदर्भित करता है, इसलिए मान लें कि डेटा प्रारूप 32 बिट फ्लोट है (और कृपया ध्यान दें, मुझे नहीं पता कि यह है, यह 8 बिट int हो सकता है, या 32 बिट निश्चित सभी के लिए मुझे पता है)

for(int y=0; y<audioBufferList.mNumberBuffers; y++) 
{ 
    AudioBuffer audioBuffer = audioBufferList.mBuffers[y]; 
    int bufferSize = audioBuffer.mDataByteSize/sizeof(Float32); 
    Float32 *frame = audioBuffer.mData; 
    for(int i=0; i<bufferSize; i++) { 
    Float32 currentSample = frame[i]; 
    } 
} 

नोट, आकार (फ्लोट 32) हमेशा 4 होता है, लेकिन मैंने इसे स्पष्ट करने के लिए छोड़ दिया।

+0

audioBuffer.mDataByteSize/sizeof (float32) लीक कर रहे हैं हिस्सा मैं कृपा से आप ज़रूरी था! – macinjosh

+0

यदि आप ऑडियोबफर xcode पर cmd-click को हेडर फ़ाइल में सख्त घोषणाओं पर कूदना चाहिए। आप किस चीज से निपट रहे हैं यह जांचने के लिए उपयोगी। – hooleyhoop

+4

एक अवसाद, लेकिन फ्रेम की कोर ऑडियो परिभाषा सभी चैनलों में एक नमूना है। – sbooth

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