سؤال

أنا أعمل في تطبيق يقوم بمعالجة بيانات الصوت. أنا أستخدم Java (لقد أضفت mp3spi، Jlayer، و tritonus). أنا استخراج البيانات الصوتية من ملف .wav إلى صفيف بايت. عينات بيانات الصوت التي أعمل بها 16 بت ستيريو.

وفقا لما قرأته التنسيق لعينة واحدة هو:

AABBCCDD.

حيث يمثل AABB القناة اليسرى وقناة CCDD Rigth (2 بايت لكل قناة). أحتاج إلى تحويل هذه العينة إلى نوع قيمة مزدوجة. لقد أقرأ عن تنسيق البيانات. يستخدم Java Indianian Big Endian،. أنا مرتبك قليلا. هل يمكن أن تساعدني في عملية التحويل؟ شكرا لكم جميعا

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

المحلول

تحذير: يتم توقيع الأعداد الصحيحة والبايت. ربما تحتاج إلى إخفاء البايتات المنخفضة عند تعبئة لهم معا:

for (int i =0; i < length; i += 4) {
    double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
    double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));

    ... your code here ...

}

نصائح أخرى

عند استخدام Bytebuffer (java.nio.bytebuffer.) يمكنك استخدام ترتيب الأسلوب؛

ترتيب

ترتيب Bytebuffer النهائي العام (BYTORDER BO)

Modifies this buffer's byte order.

Parameters:
    bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
    This buffer

بعد ذلك، يمكنك الحصول على القيم المذكورة أعلاه مع؛

getchar () getshort () getint () getffloat () getdouble ()

ما هي لغة عظيمة هي Java ؛-)

Nittle Endian يعني أن البيانات في النموذج BBAA و DDCC. سوف تبادل فقط حولها.

من بداية الإطار:

int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];

حيث أنا مؤشر عينتك.

أنا شخصيا أنظر إلى مكتبة تقوم بإنصاد تبادل الأناني لك. يحتوي كل تنسيق ملف صوتي على افتراضات حول الانتصفية بالنسبة لك والحصول على هذا الحق صعبا لجميع أعماقك / أنواع بيانات نقاط البيانات بت

  • 8bit - UINT8.
  • 16 بت - Int16.
  • 24bit - Int32.
  • 32 بت - Int32 كما تعويم
  • 32bit - تعويم
  • 64bit - مزدوج

إذا كنت ترغب في دعم معظم أنواع ملفات الموجة الشائعة، فستحتاج إلى تحويلات نبيذة لجميع أنواع البيانات هذه.

أود أن أنظر إلى byteswapper., ، والتي ستمنحك byteswaping لمعظم الأنواع المذكورة أعلاه.

ليس لدى Java السيئة للغاية حقل نبيذ في فصول الملفات IO. أن تكون قادرا على فتح ملف Whos Edianness كبير أو قليل هو الحل أسهل بكثير لهذه المشكلة.

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