سؤال

هل من الممكن في J2ME لقياس سعة إشارة السجل الصوتي الذي أدلى به لاعب JSR-135؟
أعلم أنني أستطيع الوصول إلى المخزن المؤقت، ولكن بعد ذلك؟

الهدف نموذج Bold 9000، صيغ مدعومة PCM و AMR. أي شكل يجب أن تستخدمه؟

أنظر أيضابلاك بيري تسجيل الصوت نموذج التعليمات البرمجية
كيفية تسجيل الصوت على هاتف BlackBerry الذكي

شكرًا لك!

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

المحلول

الحصول على مستوى إشارة PCM الخام

  • استخدام القائمة وتتبع العجلة للتكبير / الخروج والتحرك على اليسار / اليمنى داخل الرسم البياني.
  • تنسيق الصوت: RAW 8000 هرتز 16 بت أحادي PCM.
  • اختبارها على جريئة 9000 حافة OS 4.6
  • يجب أن يعمل allgorythm في أي هاتف محمول، حيث يتم دعم J2ME و PCM، قد يتطلب تنفيذ بالطبع تغييرات.

باستخدام مؤشر الترابط لتسجيل الصوت:

class VoiceNotesRecorderThread extends Thread {

    private Player _player;
    private RecordControl _rcontrol;
    private ByteArrayOutputStream _output;
    private byte _data[];

    VoiceNotesRecorderThread() {
    }

    public void run() {
        try {
            _player = Manager
                .createPlayer("capture://audio?encoding=audio/basic");
            _player.realize();
            _rcontrol = (RecordControl) _player
                .getControl("RecordControl");
            _output = new ByteArrayOutputStream();
            _rcontrol.setRecordStream(_output);
            _rcontrol.startRecord();
            _player.start();
        } catch (final Exception e) {
            UiApplication.getUiApplication().invokeAndWait(new Runnable() {
                public void run() {
                    Dialog.inform(e.toString());
                }
            });
        }
    }

    public void stop() {
        try {
            _rcontrol.commit();
            _data = _output.toByteArray();
            _output.close();
            _player.close();
        } catch (Exception e) {
            synchronized (UiApplication.getEventLock()) {
                Dialog.inform(e.toString());
            }
        }
    }

    byte[] getData() {
        return _data;
    }
}

وطريقة الرسم البياني اللوحة باستخدام byte [] العازلة:

private Bitmap getGraph(byte[] buffer, int zoom, int startFrom) {
    Bitmap result = new Bitmap(Display.getWidth(), Display.getHeight());
    Graphics g = new Graphics(result);
    g.setColor(Color.BLACK);
    int xPos = 0;
    int yPos = Display.getHeight() >> 1;
    for (int i = startFrom; i < buffer.length; i += 2 * zoom) {
        byte[] b = new byte[] { buffer[i], buffer[i + 1] };
        int level = (signedShortToInt(b) * 100 / 32767);
        if (100 < level) {
            level -= 200;
        }

        g.drawPoint(xPos, yPos - level);
        xPos++;
    }
    return result;
}

public static final int signedShortToInt(byte[] b) {
    int result = (b[0] & 0xff) | (b[1] & 0xff) << 8;
    return result;
}

فئة الشاشة:

class Scr extends MainScreen {
    BitmapField mGraphField = new BitmapField(new Bitmap(Display.getWidth(),
            Display.getHeight()));

    private VoiceNotesRecorderThread m_thread;

    public Scr() {
        add(mGraphField);
        add(new NullField(FOCUSABLE));
    }

    boolean mRecording = false;
    private int mZoom = 1;
    private int mStartFrom = 0;

    byte[] mAudioData = null;

    protected void makeMenu(Menu menu, int instance) {
        super.makeMenu(menu, instance);
        menu.add(mRecordStopMenuItem);

        menu.add(mPaintZoomIn);
        menu.add(mPaintZoomOut);
        menu.add(mPaintZoomToFitScreen);

        menu.add(mPaintMoveRight);
        menu.add(mPaintMoveLeft);
        menu.add(mPaintMoveToBegin);
    }

    MenuItem mRecordStopMenuItem = new MenuItem("Record", 0, 0) {
        public void run() {
            if (!mRecording) {
                m_thread = new VoiceNotesRecorderThread();
                m_thread.start();
                mRecording = true;
                this.setText("Stop");
            } else {
                m_thread.stop();
                mAudioData = m_thread.getData();
                zoomToFitScreen();
                mRecording = false;
                this.setText("Record");
            }
        }
    };

    MenuItem mPaintZoomIn = new MenuItem("Zoom In", 0, 0) {
        public void run() {
            zoomIn();
        }
    };

    MenuItem mPaintZoomOut = new MenuItem("Zoom Out", 0, 0) {
        public void run() {
            zoomOut();
        }
    };

    MenuItem mPaintZoomToFitScreen = new MenuItem("Fit Screen", 0, 0) {
        public void run() {
            zoomToFitScreen();
        }
    };

    MenuItem mPaintMoveLeft = new MenuItem("Left", 0, 0) {
        public void run() {
            moveLeft();
        }
    };

    MenuItem mPaintMoveRight = new MenuItem("Right", 0, 0) {
        public void run() {
            moveRight();
        }
    };

    MenuItem mPaintMoveToBegin = new MenuItem("To Begin", 0, 0) {
        public void run() {
            moveToBegin();
        }
    };

    private void zoomOut() {
        if (mZoom < 200)
            mZoom++;
        mGraphField.setBitmap(getGraph(mAudioData, mZoom, mStartFrom));
    }

    private void zoomIn() {
        if (mZoom > 1)
            mZoom--;
        mGraphField.setBitmap(getGraph(mAudioData, mZoom, mStartFrom));
    }

    private void zoomToFitScreen() {
        int lenght = mAudioData.length;
        mZoom = (lenght / 2) / Display.getWidth();
        mGraphField.setBitmap(getGraph(mAudioData, mZoom, mStartFrom));
    }

    private void moveRight() {
        if (mStartFrom < mAudioData.length - 30)
            mStartFrom += 30;
        mGraphField.setBitmap(getGraph(mAudioData, mZoom, mStartFrom));
    }

    private void moveLeft() {
        if (mStartFrom > 30)
            mStartFrom -= 30;
        mGraphField.setBitmap(getGraph(mAudioData, mZoom, mStartFrom));
    }

    private void moveToBegin() {
        mStartFrom = 0;
        mGraphField.setBitmap(getGraph(mAudioData, mZoom, mStartFrom));
    }

    protected boolean navigationMovement(int dx, int dy, int status, 
        int time) {

        if (dx < 0) {
            moveLeft();
        } else if (dx > 0) {
            moveRight();
        }
        if (dy < 0) {
            zoomIn();
        } else if (dy > 0) {
            zoomOut();
        }
        return super.navigationMovement(dx, dy, status, time);
    }
}

كان مفيدا:
ADC -> FENGER PCM ملف -> معالجة الإشارات
لذلك - كيف يتم تمثيل الصوت بالأرقام؟
تحويل صفيف البايت إلى عدد صحيح

نصائح أخرى

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

لتسجيل الصوت الذي تحتاجه لاستخدام Manager.createPlayer ("التقاط: // Audio"). اترك أيضا الترميز (PCM أو AMR) لتنفيذ الجهاز لأن بعض الهواتف لا تدعم PCM / AMR

أتمنى أن يساعدك هذا!

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