2011-01-26 5 views
4

현재 AudioTrack을 사용하여 녹음 된 음악을 재생하고 있습니다. 이것은 트랙 데이터를 오디오 버퍼에 기록하는 것을 포함한다. 오디오 데이터 스트림을 사용하여 화면에서 실시간으로 재생되는 오디오를 나타내는 웨이브 폼을 그리려면 어떻게해야합니까? 나는 시작하는 방법을 모르기 전에 안드로이드에서 고급 그래픽을 사용하지 않았습니다. OpenGL을 사용해야합니까, 아니면 뷰를 구현할 수 있습니까? 또한 어떻게 데이터를 드로잉에 유용한 유용한 것으로 변환 할 수 있을까요?ByteStream에서 Android AudioTrack 시각화

답변

3

첫 번째 단계는 setPositionNotificationPeriod(periodInFrames)입니다. 이것은 응용 프로그램이 onPeriodicNotification 전화를받는 빈도를 결정합니다. 따라서 오실로스코프 형식의 시각화를 수행하고 있으며 주어진 순간에 화면에 50 밀리 초 분량의 오디오 데이터를 표시하려면 periodInFrames 값을 2205로 사용하십시오 (WAV 파일이 모노 인 경우 샘플 당 16 비트라고 가정) 및 44,100 Hz 샘플 속도).

알림 이벤트에서 현재 AudioTrack 개체의 재생 위치를 확인한 다음 원래 파일 또는 배열에서 해당 데이터 조각을 가져올 수 있습니다. 그런 다음 일반 2D 그래픽 방법을 사용하여이 데이터 조각을 뷰에 그리십시오 (여기서 OpenGL이 필요하지 않음). This answer에는 오디오 데이터 슬라이스를 그리기위한 C# 샘플이 있으며 Java로 쉽게 변환 할 수 있습니다.

그래서 코드는 종류의이 같은보고 끝날 것 :

audioTrack.setPositionNotificationPeriod(2205); 
audioTrack.setPlaybackPositionUpdateListener(this); 

... 

public void onPeriodicNotification(AudioTrack track) { 
    int pos = track.getNotificationMarkerPosition(); 
    short[] slice = Array.copy(_data, pos, _sliceSize) // pseudo-code 
    // render the slice to the view 
} 
+0

감사합니다. 시작해야하며 올바른 방향으로 이동해야합니다. 그러면 여러 스트림에서 어떻게 이것이 수행 될지 걱정해야합니다. – DeliveryNinja

+0

그래, 그건 당신의 난이도를 상당히 높일 겁니다. 모든 스트림을 하나의 스트림으로 미리 믹싱하는 것이 좋지만, 그렇게하는 것은 가능하지 않을 수 있습니다. – MusiGenesis

+0

실제로 시각화 기능을 갖춘 4 개의 오디오 트랙을 실행할 계획이며 대기 시간은 오디오를 레코딩 할 때 큰 요인이 될 것입니다. 이것이 어떻게 시작 될지 누가 알 수 있겠는가? NDK 2.3으로 전환해야 할 수도 있습니다. – DeliveryNinja

2

그 점에 관하여, 당신이 파형 배열 또는 주파수 배열의 생성을 처리 android.media.audiofx.Visualizer 클래스를 사용하는 것이 좋습니다 것입니다. 그래서 당신이 돌봐야 할 유일한 것은 그래픽의 그림입니다.

API 9 출시 이후이 클래스를 사용할 수 있습니다.