Android - كيفية إضافة برنامج ترميز الصوت الخاص بي إلى Audiorecord؟

StackOverflow https://stackoverflow.com/questions/2416365

سؤال

لدي حاليا برنامج Back Loop لاختبار الصوت على أجهزة Android.

يستخدم Audiorecord و AudioTrack لتسجيل الصوت PCM من هيئة التصنيع العسكري واللعب PCM Audio خارج سماعة الأذن.

هنا هو الرمز:

public class Record extends Thread
  {

          static final int bufferSize = 200000;
          final short[] buffer = new short[bufferSize];
          short[] readBuffer = new short[bufferSize];

          public void run() {  
            isRecording = true;
            android.os.Process.setThreadPriority
            (android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

            int buffersize = AudioRecord.getMinBufferSize(11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

                           arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
                                           11025,
                                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                           AudioFormat.ENCODING_PCM_16BIT,
                                           buffersize);

                           atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                                           11025,
                                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                           AudioFormat.ENCODING_PCM_16BIT,
                                           buffersize,
                                           AudioTrack.MODE_STREAM);


                           atrack.setPlaybackRate(11025);

                           byte[] buffer = new byte[buffersize];
                           arec.startRecording();
                           atrack.play();

                           while(isRecording) {

                                   arec.read(buffer, 0, buffersize);
                                   atrack.write(buffer, 0, buffer.length);
                           }  
          }
  }

حتى تتمكن من رؤية إنشاء AudioTrack و Audiorecord يتم توفير الترميز عبر AudiOformat ولكن هذا يسمح فقط ب 16 بت أو 8 بت PCM.

لدي تطبيق برنامج الترميز G711 الخاص بي الآن وأريد أن أكون قادرا على تشفير الصوت من هيئة التصنيع العسكري ويقوم بمزوده في سماعة الأذن، لذلك لدي ترميز (قصيرة لين []، إزاحة int، البايت ENC []، إطارات int) و فك شفرة (البايت ENC []، قصيرة لين []، إطارات int) الأساليب ولكني غير متأكد من كيفية استخدامها لتشفير وصوت الصوت من Audiorecord و AudioTrack.

هل يمكن لأي شخص أن يساعدني أو أشرني في الاتجاه الصحيح؟

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

المحلول

تغيير الخاص بك arec.read(buffer, 0, buffersize) دعوة لاستخدام Bytebuffer read() طريقة من AudioRecord.

بمجرد أن يكون لديك بايت الخاص بك في ByteBuffer كائن، ثم يمكنك فقط إدراج نداء تنفيذ G711 الخاص بك من الترميز واستخدام ByteBuffer.asShortBuffer() طريقة للحصول على بيانات PCM الملتقطة في التشفير.

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

سؤالي هو لماذا؟

في التعليمات البرمجية أعلاه، يمكنك التقاط بيانات PCM من الميكروفون، واكتبها مباشرة إلى المخزن المؤقت للتشغيل.

لا معنى له في تنفيذك لمتابعة مسار PCM -> G711 (EXODE) -> G711 (فك شفرة) -> PCM. كل ما تفعله هو إدخال المعالجة غير الضرورية والكمون. الآن، إذا كنت ستكتب بيانات مشفرة إلى ملف بدلا من محاولة تشغيله من خلال قطعة الأذن، فستكون قصة مختلفة، لكن الكود الحالي الخاص بك لا يبدو مفيدا حقا لتشفير بيانات PCM.

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

نصائح أخرى

أدرك أن هذا منصب قديم جدا. هل كنت قادرا على الحصول على عمل G711 الخاص بك؟ سيكون الفكر الأولي الخاص بي هو استخدام lib المترجمة لهواة النواة واستخدام JNI للاتصال بها.

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