J2ME/BlackBerry- 오디오 신호 진폭 레벨을 얻습니까?
-
19-09-2019 - |
문제
J2ME에서 JSR-135 플레이어가 만든 오디오 레코드의 신호 진폭을 측정 할 수 있습니까?
버퍼에 액세스 할 수 있다는 것을 알고 있지만 무엇입니까?
대상 모델 BOLD 9000, 지원되는 형식 PCM 및 AMR. 어떤 형식을 사용해야합니까?
또한보십시오BlackBerry 오디오 녹음 샘플 코드
방법 - BlackBerry 스마트 폰에서 오디오를 녹음하십시오
고맙습니다!
해결책
원시 PCM 신호 레벨을 얻습니다
- 메뉴와 트랙 휠을 사용하여 확대/아웃하고 그래프 내에서 왼쪽/오른쪽으로 이동하십시오.
- 오디오 형식 : RAW 8000 Hz 16 비트 모노 PCM.
- Bold 9000 Rim OS 4.6에서 테스트
- AlgoryThM은 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-> 정수 PCM 파일 -> 신호 처리
그래서 - 오디오는 숫자로 어떻게 표시됩니까?
바이트 배열을 정수로 변환합니다
다른 팁
대부분의 장치에서는 단일 트랙이있는 중간 형식 만 지원됩니다. 이것이 하나의 단일 트랙에서 여러 악기를 지원하는 MID0 형식입니다. API가 신호의 진폭을 측정하기위한 시설을 제공하는지 확실하지 않습니다. 중간 파일을 변환하려면 사용할 수 있습니다 안빌 스튜디오 무료 및 프로 버전이 모두 있습니다
오디오를 녹음하려면 manager.createplayer ( "capture : // audio")를 사용해야합니다. 또한 일부 휴대폰이 PCM/AMR을 지원하지 않기 때문에 장치 구현에 인코딩 (PCM 또는 AMR)을 남겨 둡니다.
도움이 되었기를 바랍니다!
제휴하지 않습니다 StackOverflow