2013-08-13 6 views
1

Android에서 Ogg Vorbis 오디오 스트림을 재생하는 데는 여러 가지 방법이 있지만 지금까지는 모든 기능에 다양한 문제가 있습니다. 이 작업을 수행하는 "올바른"방법에 대한 그물에 대한 많은 정보가있는 것 같지 않습니다.Android에서 Ogg Vorbis를 스트리밍하는 가장 좋은 방법은

첫 번째 요구 사항 : 내 res/raw 디렉토리에 저장된 Ogg 파일의 음악을 스트리밍합니다. intro.ogg와 loop.ogg라는 두 개의 파일이 있습니다. 인트로가 먼저 재생되고 루프가 이어지고 음악이 계속 재생되는 한 반복해야합니다. 스트림 간에는 절대 간격이 없어야하며, 적어도 오래된 4.0 버전 또는 가능한 경우 2.x 이전 버전의 Android를 지원하고 싶습니다.

이렇게하려면 세 가지 방법이 있습니다.

1) MediaPlayer. 가장 자주 추천되는 방법. 문제점 : 두 개의 스트림을 대기열에 넣으려면 API 레벨 16에서만 도입 된 setNextMediaPlayer()를 사용해야합니다. 스트림 간에는 작지만 눈에 띄지 않는 간격이 있습니다 (최소한 4.3을 실행하는 N4에서는). setNextMediaPlayer()를 사용자 지정 완료 리스너로 바꾸려고 할 때 gpless 재생을 얻을 수없는 것 같습니다.

2) AudioTrack, MediaExtractor 및 MediaCodec. MediaPlayer가 내부적으로하는 일을 꽤 많이합니다. Issues : API 레벨 16 부터만 사용할 수 있습니다. 또한 현재 스트림 사이에 작은 간격이 생깁니다. # 3 아래 gaplessly 작동하기 때문에, 나는 그것을 없앨 수 있어야한다고 생각합니다 (설명서가 여기에 매우 얇은 것).

3) AudioTrack 및 맞춤 Ogg 디코딩. jogg/jorbis JAR은 이러한 목적으로 잘 작동합니다. 재생 및 큐잉은 끊이지 않습니다. 문제 : 느립니다. 이전의 N1에서는 프레임 속도에 약간의 영향을 미치고 입력 응답 성이 강력하게 저하됩니다.

# 1과 # 2가 하드웨어 디코딩을 지원한다고 가정하지만 # 3은 분명히 소프트웨어에서만 실행됩니다. 내 N1에서 Ogg 스트림을 재생할 때 MediaPlayer가 성능 문제를 일으키지 않는 것 같지만 API 수준이 낮기 때문에 대기열을 확보 할 수 없습니다.

이 문제를 해결할 방법이 있습니까? 아니면 인트로 큐를 건너 뛰고 구형 장치의 루프 큐 (rue cue)에서 미숙 한 페이드 인 (fade in)을 시도하려합니까?

(사람이 내가 MediaExtractor & MediaCodec와 실제 끊김없는 재생을 달성, 또는 좋은 하우투 날 지점 수 있어야 확인 할 수 있습니다 경우에도, 그 도움이 될 것입니다)

답변

0

나의 제안은 사용하는 것 NDK가 네이티브 (아마도 Tremor)를 실행하는 vorbis 디코더를 얻은 다음 훨씬 느린 jogg/jorbis java 디코더를 사용하는 대신 앱에서 그 매우 빠른 네이티브 디코더를 사용합니다. (아마도 자바 디코더보다 더 빠른 속도 일 것입니다.)

그런 다음 AudioTrack 클래스를 사용하여 네이티브 디코드 된 PCM을 가져 와서 오디오 장치에 쓸 수 있습니다.

누군가가 아직이 일을하지 않았다면 나는 놀라실 것이다.