سؤال

أحاول قراءة البيانات الصوتية عبر Audioqueue. عندما أفعل ذلك، يمكنني التحقق من أن عمق الملف للملف هو 16 بت. ولكن عندما أحصل على بيانات العينة الفعلية، أراها فقط القيم من -128 إلى 128. لكنني أرى أيضا بيانات مشبوهة تبدو مشبوهة، مما يجعلني متأكدا من أنني لا أقرأ البيانات بشكل صحيح.

لذلك لتبدأ، يمكنني التحقق من أن الملف المصدر هو ملف 44100، 16 بت، أحادي WAV.

يتم تخصيص المخزن المؤقت الخاص بي

char * المخزن المؤقت = null؛ العازلة = malloc (buffer_size)؛ تأكيد (المخزن المؤقت)؛

يتم تعيين جميع القيم ذات الصلة وتستخدم في:

AudioFilereAreAdPackets (InaudioFile، False، & Bytesread، Null، Packetnum، & numpackets، العازلة)؛

كاختبار، فقط حتى أتمكن من رؤية البيانات المستردة، أركض:

ل (INT I = 0؛ أنا

الآن، أعرف أن ملفات مصدري المصدر في كل مكان، لكن القيم التي أراها كحد أقصى فقط في -128 و 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. انظر كيف يزيد، ليس بالتساوي، ولكن على الأقل بسلاسة؟ الصفوف ذات المرقوعة الفردية ليست في أي مكان بالقرب من هذا السلس.

فكرتي الأولى ستكون أن هذه بيانات ستيريو متشددة، ولكن لا، إنها قناة واحدة فقط، لذلك لا ينبغي أن يكون هناك أي تشذير، أليس كذلك؟

أفضل تخميني هو أنني أقرأ البيانات فقط بشكل غير صحيح، لذا فإن بيانات العينة التي يتمانانها عبر عائدتين. أي فكرة عن كيفية قراءتها بشكل صحيح؟

شكرا على القراءة من خلال السؤال بأكمله، ولأي رؤية يمكنك تقديمها.

هل كانت مفيدة؟

المحلول

char *buffer= NULL;

هذا هو السبب. أنت تكرار حول البايتات الموقعة، وليس عينات 16 بت.

أعلن المتغير كمسكن مؤشر لقيم بايت بدلا من ذلك:

SInt16 *buffer = NULL;

ثم، قم بتكرار أكثر من نصف عينات مثل بايت:

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

أود إعادة تسمية BUFFER_SIZE ل BUFFER_SIZE_BYTES لتوضيح ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top