2009-08-08 13 views
6

के साथ ऑडियो बफर डेटा पढ़ना मैं ऑडियोक्यूयू के माध्यम से ऑडियो डेटा पढ़ने का प्रयास कर रहा हूं। जब मैं ऐसा करता हूं, तो मैं सत्यापित कर सकता हूं कि फ़ाइल की बिट गहराई 16-बिट है। लेकिन जब मुझे वास्तविक नमूना डेटा मिलता है, तो मैं केवल -128 से 128 तक मान देख रहा हूं। लेकिन मुझे संदिग्ध दिखने वाले डेटा को भी संदिग्ध दिख रहा है, जिससे मुझे पूरा यकीन है कि मैं डेटा को सही तरीके से नहीं पढ़ रहा हूं।ऑडियो क्यूई

तो शुरू करने के लिए, मैं सत्यापित कर सकता हूं कि स्रोत फ़ाइल 44100, 16-बिट, मोनो वाव फ़ाइल है।

मेरे बफर thusly आवंटित होता है,

 
char *buffer= NULL; 
buffer = malloc(BUFFER_SIZE); 
assert(buffer); 

सभी प्रासंगिक मूल्यों को निर्धारित और में किया जाता है:

 
AudioFileReadPackets(inAudioFile,false,&bytesRead,NULL,packetNum,&numPackets,buffer);  

एक परीक्षण के रूप में, बस इतना है कि मैं देख सकता हूँ डेटा पुनः प्राप्त, मैं चलाने :

 
for(int i=0;i<BUFFER_SIZE;i++){ 
    NSLog(@"%i", buffer[i]); 
} 

अब, मैं अपने स्रोत फ़ाइल को पूरे स्थान पर देखता हूं, लेकिन मूल्य जो मैं केवल अधिकतम -128 पर देखता हूं nd 128. चूंकि यह एक 16-बिट फ़ाइल है, इसलिए मैं उम्मीद करता हूं कि मान -32768 से 32768 होगा।

इसके अतिरिक्त, डेटा में दो पैटर्न होने लगते हैं। यहां लौटाए गए डेटा का एक उदाहरण दिया गया है:

 
70 
-13 
31 
-11 
-118 
-9 
-15 
-7 
116 
-4 
31 
-1 
28 
1 
84 
2 
-123 
3 
-97 
4 
110 
5 
54 
6 
126 

अब दूसरी पंक्ति से शुरू होने वाली हर दूसरी पंक्ति पर एक नज़र डालें: -13। देखें कि यह कैसे समान रूप से बढ़ता है, लेकिन कम से कम आसानी से? अजीब संख्या वाली पंक्तियां उस चिकनी के पास कहीं भी नहीं हैं।

मेरा पहला विचार यह होगा कि यह स्टीरियो डेटा interleaved है, लेकिन नहीं, यह केवल एक चैनल है, तो कोई अंतराल नहीं होना चाहिए, है ना?

मेरा सबसे अच्छा अनुमान यह है कि मैं केवल डेटा को गलत तरीके से पढ़ रहा हूं, इसलिए नमूना डेटा दो रिटर्न में फैलाया जा रहा है। कोई विचार यह सही तरीके से कैसे पढ़ा जाए?

पूरे प्रश्न के माध्यम से पढ़ने के लिए धन्यवाद, और किसी अंतर्दृष्टि के लिए आप ऑफ़र कर सकते हैं।

उत्तर

8
char *buffer= NULL; 

कारण नहीं है यही कारण है कि। आप 16-बिट नमूने नहीं, हस्ताक्षरित बाइट्स पर पुनरावृत्त कर रहे हैं।

बजाय दो-बाइट मूल्यों के लिए एक सूचक पकड़े रूप में चर घोषित करें: फिर

SInt16 *buffer = NULL; 

, बाइट के रूप में आधे से अधिक के रूप में कई नमूने पुनरावृति:

for(int i=0;i < (BUFFER_SIZE/sizeof(*buffer));i++){ 
    NSLog(@"%i", buffer[i]); 
} 

मैं करने के लिए BUFFER_SIZE_BYTES को BUFFER_SIZE नाम बदलने होगा इसे स्पष्ट करें।

+0

धन्यवाद फिर पीटर! –

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