J2ME/Blackberry-获取音频信号振幅级别?

J2ME/Blackberry-获取音频信号振幅级别?,blackberry,audio,java-me,core-audio,pcm,Blackberry,Audio,Java Me,Core Audio,Pcm,在j2me中是否可以测量JSR-135播放器制作的音频记录的信号幅度? 我知道我可以访问缓冲区,但那又怎么样 目标型号Bold 9000,支持PCM和AMR格式。我应该使用哪种格式 另见 谢谢大家! 在大多数设备中,仅支持带有单轨的MID格式。这是一种mid0格式,支持一个音轨中的多个乐器。我不确定api是否提供了测量信号振幅的工具。要将mid文件转换为,您可以使用具有免费和专业版本的 要录制音频,您需要使用Manager.createPlayer(“capture://audio"). 另

在j2me中是否可以测量JSR-135播放器制作的音频记录的信号幅度?
我知道我可以访问缓冲区,但那又怎么样

目标型号Bold 9000,支持PCM和AMR格式。我应该使用哪种格式

另见


谢谢大家!

在大多数设备中,仅支持带有单轨的MID格式。这是一种mid0格式,支持一个音轨中的多个乐器。我不确定api是否提供了测量信号振幅的工具。要将mid文件转换为,您可以使用具有免费和专业版本的

要录制音频,您需要使用Manager.createPlayer(“capture://audio"). 另外,由于某些手机不支持PCM/AMR,因此将编码(PCM或AMR)留给设备实现

希望这有帮助

获取原始PCM信号电平
  • 使用菜单和滚轮在图形中放大/缩小和左/右移动
  • 音频格式:原始8000赫兹16位单声道pcm
  • 在Bold 9000 RIM OS 4.6上测试
  • 算法应该适用于任何支持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;
    }
}
以及使用字节[]缓冲区绘制图形的方法:

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;
}
private Bitmap getGraph(字节[]缓冲区、整数缩放、整数启动){
位图结果=新位图(Display.getWidth(),Display.getHeight());
图形g=新图形(结果);
g、 设置颜色(颜色为黑色);
int xPos=0;
int yPos=Display.getHeight()>>1;
对于(int i=startFrom;i30)
mStartFrom-=30;
setBitmap(getGraph(mAudioData、mZoom、mStartFrom));
}
私有void moveToBegin(){
mStartFrom=0;
setBitmap(getGraph(mAudioData、mZoom、mStartFrom));
}
受保护的布尔导航移动(int dx、int dy、int status、,
整数时间){
if(dx<0){
左移();
}如果(dx>0),则为else{
moveRight();
}
if(dy<0){
zoomIn();
}如果(dy>0),则为else{
zoomOut();
}
返回super.navigationMovement(dx、dy、状态、时间);
}
}
已收到帮助:



谢谢Ram,我需要录制音频并从中测量信号电平,不能使用这种方法。但我会检查midi,这可能也有帮助。我不得不从你的帖子中删除图像,因为ImageShack已经删除了它,并用广告代替了它。有关更多信息,请参阅。如果可能的话,你最好重新上传。谢谢
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);
    }
}