Android 애플리케이션을 개발 중입니다 .1KHz ~ 20KHz의 주파수 범위의 사운드를 생성하고 싶습니다. 어쨌든 특정 주파수에서 사운드를 생성합니다.특정 사운드 빈도를 생성하는 방법?
답변
다른 SO 게시물에서이 코드를 발견했습니다. 내가 말할 수있는 것에서 그것은 아직도 약간의 버그 다. 그러나 그것은 트릭을해야한다.
public class PlaySound extends Activity {
// originally from http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html
// and modified by Steve Pomeroy <[email protected]>
private final int duration = 3; // seconds
private final int sampleRate = 8000;
private final int numSamples = duration * sampleRate;
private final double sample[] = new double[numSamples];
private final double freqOfTone = 440; // hz
private final byte generatedSnd[] = new byte[2 * numSamples];
Handler handler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onResume() {
super.onResume();
// Use a new tread as this can take a while
final Thread thread = new Thread(new Runnable() {
public void run() {
genTone();
handler.post(new Runnable() {
public void run() {
playSound();
}
});
}
});
thread.start();
}
void genTone(){
// fill out the array
for (int i = 0; i < numSamples; ++i) {
sample[i] = Math.sin(2 * Math.PI * i/(sampleRate/freqOfTone));
}
// convert to 16 bit pcm sound array
// assumes the sample buffer is normalised.
int idx = 0;
for (final double dVal : sample) {
// scale to maximum amplitude
final short val = (short) ((dVal * 32767));
// in 16 bit wav PCM, first byte is the low order byte
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
}
void playSound(){
final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, numSamples,
AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}
}
ㅎ. 나는 방금 [http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html] 같은 것을 발견했다. 버그를 수정하기 위해 해당 링크에서 코드가 업데이트되었다고 가정합니다. –
그래,하지만 의견에 따르면 여전히 일부는 ... 어느 쪽이든 그것은 좋은 기반입니다. – Reid
이 코드는 sampleRate = 44100으로 설정하더라도 17000Hz 이상 재생되지 않으므로이 코드에 문제가 있습니다. 예를 들어 Flash에서 이러한 동일한 알고리즘이 작동하며 사용중인 전화가이 주파수를 재생할 수 있습니다. 파일. 누구든지이 문제를 해결하는 방법을 알고 있습니까? – PSIXO
- 1. Android : 빈도를 생성하는 방법?
- 2. 특정 시간대에 고객의 주문 빈도를 표시하는 방법.
- 3. html5에서 서라운드 사운드 효과를 생성하는 방법
- 4. 자바에서 특정 문자의 빈도를 계산하십시오.
- 5. 단어 빈도를 사용하여 '상위 목록'을 생성하는 알고리즘
- 6. 특정 장치에서 사운드 재생
- 7. 특정 사운드 카드에서 사운드를 재생하는 방법
- 8. C++ 특정 사운드 출력?
- 9. 특정 값이 배열에 나타나는 빈도를 계산하십시오.
- 10. 리눅스에서 타이머 빈도를 결정하는 방법
- 11. KeyDown 동작 빈도를 제한하는 방법
- 12. 내 사운드 카드가 파이썬을 사용하여 사운드를 생성하는 방법?
- 13. 안드로이드에서 특정 주파수의 사운드 재생
- 14. 특정 순서로 집합의 교차 곱을 생성하는 방법
- 15. .exe를 실행하여 특정 폴더에 출력을 생성하는 방법
- 16. 사운드 카드에서 사운드 재생이 중지되었는지 확인하는 방법
- 17. Lucene에서 여러 단어의 빈도를 얻는 방법?
- 18. 외부 링크를 클릭하는 빈도를 파악하는 방법?
- 19. 문서 필드에서 특정 용어의 빈도를 계산하는 방법은 무엇입니까?
- 20. 롤오버 사운드 적용 방법
- 21. Lucene에서 용어 빈도를 얻으십시오
- 22. 배열의 숫자 빈도를 계산합니다.
- 23. 클릭 빈도를 ImageView에서 제거하십시오.
- 24. 배열의 값의 빈도를 계산하십시오.
- 25. PHP에서 날짜를 생성하는 방법
- 26. 특정 사운드 피치에 대한 Android 음성 인식
- 27. Android, 사운드 풀에서 사운드 재생
- 28. 문자열의 단어 빈도를 효율적으로 계산하십시오.
- 29. 커스텀 UIImagePickController를 생성하는 방법
- 30. 범위에서 num을 생성하는 방법
설명하는 범위는 초음파가 아닙니다. 나는. 그것은 여전히 들릴 수 있습니다. – Sjoerd
그냥 nitpicking : 초음파 _starts_에서 20KHz. 원하는 범위의 주파수는 음향입니다. –
@alextsc, BlackBerry 또는 Java-ME에있는 경우 대답도 환영합니다. – Android