سؤال

أنا أستخدم واجهة برمجة تطبيقات الصوت javax لتنفيذ برنامج تشغيل بسيط لوحدة التحكم يعتمد على http://www.jsresources.org/examples/AudioPlayer.html.

بعد اختباره باستخدام ملف منحدر 24 بت (كل عينة هي العينة الأخيرة بالإضافة إلى 1 على نطاق 24 بت الكامل)، فمن الواضح أن شيئًا غريبًا يحدث أثناء التشغيل.الإخراج المسجل ليس محتويات الملف (لدي استرجاع رقمي للتحقق من ذلك).

يبدو أنه يسيء تفسير العينات بطريقة تجعل القناة اليسرى تبدو وكأنها تطبق عليها بعض الكسب وتبدو القناة اليمنى وكأنها يتم توهينها.

لقد بحثت فيما إذا كانت عناصر التحكم PAN وBALANCE بحاجة إلى الإعداد ولكن هذه العناصر غير متوفرة وتحققت من إعدادات نظام الصوت Windows XP.أي شكل آخر من أشكال تشغيل هذا الملف المنحدر يعد جيدًا.

إذا قمت بنفس الاختبار باستخدام ملف 16 بت، فسيتم تنفيذه بشكل صحيح دون أي تلف في الدفق.

فهل لدى أي شخص أي فكرة عن سبب قيام Java Sound API بتعديل البث الصوتي الخاص بي؟

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

المحلول

المشكلة في تشغيل Java للصوت 24 بت هي في الواقع مشكلة في تطبيق Microsoft DirectSound و/أو تطبيق Windows Java Sound الخاص به.باستخدام Linux مع Java Sound وALSA، يتم تشغيل الصوت 24 بت بشكل مثالي (يظهر تسجيل الإخراج تطابقًا مثاليًا مع ملف الإدخال).

لمعرفة سبب عدم عمله في Windows، يمكنك الاستعلام عن تنسيقات الصوت المدعومة لخط الإخراج الذي تريد تشغيله في Java باستخدام (حيث lineInfo هل Line.Info من خط الإخراج):

DataLine.Info dataLineInfo = (DataLine.Info) lineInfo;

ثم التكرار عبر التنسيقات المدعومة:

for (AudioFormat lineFormat : dataLineInfo.getFormats())

بالنسبة لنظام التشغيل Windows أحصل على شيء مثل:

Format #1: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #2: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #3: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
Format #4: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
Format #5: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #6: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #7: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Format #8: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian

والتي لا تحتوي على 24 بت كتنسيق مدعوم.ولكن في نظام التشغيل Windows XP، لا يزال يسمح لي بتشغيل صوت 24 بت، ولكن من المفترض أن تتم معالجته حتى 16 بت بواسطة Java / DirectSound ثم نسخه احتياطيًا حتى 24 بت بواسطة بطاقة الصوت.ولهذا السبب فإن إخراج البيانات غير صحيح.في نظام التشغيل Windows 7، وجدت أنه يرفض تشغيل صوت 24 بت (ربما أكثر منطقية إذا كان كل ما سيفعله هو الانخفاض إلى 16 بت على أي حال).

بالنسبة لنظام Linux (Fedora 17) أحصل على شيء مثل (بنفس بطاقة الصوت، ESI Juli@، على نفس جهاز الكمبيوتر):

Format #1: PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, little-endian
Format #2: PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, big-endian
Format #3: PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, little-endian
Format #4: PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, big-endian
Format #5: PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, little-endian
Format #6: PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, big-endian
Format #7: PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, little-endian
Format #8: PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, big-endian
Format #9: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
Format #10: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
Format #11: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
Format #12: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
Format #13: PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, little-endian
Format #14: PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, big-endian
Format #15: PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, little-endian
Format #16: PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, big-endian
Format #17: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
Format #18: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
Format #19: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Format #20: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
Format #21: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #22: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #23: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #24: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 

والذي يحتوي على 24 بت كتنسيق مدعوم.وعلى هذا النحو، يعمل هذا كما هو متوقع وبدون المعالجة الإضافية غير المرغوب فيها.

لذلك يبدو أن تشغيل 24 بت يعمل مع Java Sound، بشرط أن يكون التنفيذ الخاص بنظام التشغيل (وربما خاصًا بالجهاز، لكنني لم أجد أي اختلاف بين الأجهزة التي جربتها حتى الآن) يدرجه على أنه تنسيق صوتي مدعوم.تشير اختباراتي إلى أن Linux (ALSA) يدعمه، في حين أن Windows (DirectSound) لا يدعمه.

نأمل أن يكون هذا مفيد لشخص ما؛لم أتمكن من العثور على أي شيء آخر حول هذا الأمر عبر الإنترنت ولهذا السبب قمت بنشر مثل هذا السؤال القديم.

كان ما يلي هو سؤالي الأولي، والذي أجبت عليه للتو (لقد تركته كمرجع):


لست متأكدًا مما إذا كان هذا هو الإجراء الصحيح لطرح الأسئلة القديمة ولكن من خلال قراءة الأسئلة الشائعة يبدو أن هذا يُفضل نشر سؤال جديد.لقد قمت بالفعل بنشر هذه المشكلة في مكانين آخرين (بما في ذلك منتدى Oracle Java Sound) ولكن بدون إجابات حتى الآن ويبدو هذا السؤال تمامًا مثل المشكلة التي أواجهها:

أنا أستخدم Java Sound لتشغيل الملفات الصوتية (بتنسيق PCM القياسي) لكنني لاحظت أنه لا يقوم بتشغيل بيانات 24 بت بشكل صحيح، حيث أن إخراج البيانات من بطاقة الصوت لا يتطابق مع الإدخال من الملف.إنه يعمل بشكل جيد مع البيانات الصوتية 16 بت (وحتى 8 بت)، ولكن ليس مع ملفات 24 بت (ومن المفترض 32 بت، لكن ليس لدي ملفات صوتية حقيقية 32 بت لاختبارها).يبدو من الإخراج أن Java Sound يقوم ببعض المعالجة الإضافية (وغير المرغوب فيها) للبيانات الصوتية قبل تمريرها إلى بطاقة الصوت.أستطيع أن أقول على وجه اليقين أن Java Sound هو الذي يقوم بذلك لأنه إذا قمت بإجراء نفس الاختبار باستخدام ASIO لتشغيل الملف فلن تكون هناك مشكلة وستتطابق البيانات كما هو متوقع.

المزيد من المعلومات حول الإعداد:- أحدث إصدار من Java JRE (على ما أظن 7u7)، يعمل على نظام التشغيل Windows XP SP3.- الصوت الذي تم تشغيله باستخدام مثال AudioPlayer (كما هو مذكور في السؤال الرئيسي) على jsresources.org (حاولت أولاً استخدام الكود الخاص بي، ولكن قمت بالتبديل إلى هذا في حالة ارتكاب خطأ، فالنتائج هي نفسها في كليهما).- يتم تشغيل الصوت على بطاقة صوت M-Audio عبر مخرج رقمي (S/PDIF)، والذي يتصل مباشرة (عبر كابل خارجي) بمدخل رقمي على بطاقة صوت Lynx (في نفس الكمبيوتر)، حيث يتم تشغيله تم التسجيل (باستخدام Sony Sound Forge).- تتم بعد ذلك مقارنة الملف المسجل بملف Wave المدخل.

للاختبار، يتم استخدام أربعة ملفات Wave مختلفة للإدخال (تم إنشاؤها من نفس الملف المصدر):- 16 بت، 44.1 كيلو هرتز؛- 16 بت، 48 كيلو هرتز؛- 24 بت، 44.1 كيلو هرتز؛- 24 بت، 48 كيلو هرتز.

باستخدام ASIO لتشغيل ملفات الاختبار، أنتجت جميع الملفات الأربعة الإخراج الصحيح (تطابق البيانات المسجلة بايت بيانات ملف Wave المُدخل للبايت، بعد محاذاة مواضع البداية للوقت بين الضغط على زر التسجيل والضغط على التشغيل).

باستخدام Java لتشغيل ملفات الاختبار، تنتج الملفات ذات 16 بت (كلاهما 44.1 كيلو هرتز و48 كيلو هرتز) الإخراج الصحيح، في حين أن الملفات ذات 24 بت (كلاهما 44.1 كيلو هرتز و48 كيلو هرتز) لا تنتج الإخراج الصحيح.ليس هذا فحسب، بل إن الطريقة التي يكون بها الإخراج غير صحيح غير متسقة (إذا قمت بإجراء الاختبار مرتين، فإنه ينتج مخرجات مختلفة في كل مرة، ولا يقترب أي منهما من مطابقة ملف الإدخال).لذلك لا يقوم صوت Java بتشغيل ملفات 24 بت بشكل خاطئ فحسب، بل يقوم بذلك بشكل خاطئ وبطريقة مختلفة في كل مرة.إذا كان ذلك سيساعدني، فيمكنني التقاط لقطات شاشة لمخرج صوت Java مقارنة بملف الإدخال (الإخراج المتوقع).

أسهل طريقة لإعادة إنتاج ذلك هي استخدام مثال AudioPlayer المذكور أعلاه، وتشغيل ملف 24 بت وتسجيل الإخراج (إذا كان لديك بطاقة صوت واحدة فقط، فقد يكون من الممكن استخدام جهاز المزج الخاص بها لتوجيه البيانات بشكل مناسب للسماح لها بالنقل تم الاستيلاء عليها).على الرغم من أنه ليس من الخطأ بما فيه الكفاية أن أسمع أي اختلاف، إلا أنه يبطل نوعًا ما الغرض من الصوت عالي الدقة إذا تم تغيير البيانات بطريقة غير متوقعة (أنت تخاطر بخسارة أي مكاسب من استخدام 24 بت على 16 بت، على الرغم من أنني لا أريد حقًا الدخول في هذه الحجة هنا).

لذا، لصياغة هذا كسؤال - كيف يمكنني جعل Java Sound يقوم بتشغيل صوت 24 بت بشكل صحيح؟

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