J2ME/Blackberry-获取音频信号振幅级别?
在j2me中是否可以测量JSR-135播放器制作的音频记录的信号幅度?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"). 另
我知道我可以访问缓冲区,但那又怎么样 目标型号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);
}
}