2010-07-28 3 views
0

내 첫 번째 게시물을 여기에. 이 웹 사이트는 모두에게 안드로이드 프로그래밍을 배우는 데 매우 유용합니다.데이터 소스를 설정 한 후 Stagefright 미디어 지연 2.2?

MP3 스트림을로드하고 재생하는 간단한 앱이 있습니다. 그것은 1.6 및 2.1 잘 작동하지만 2.2 제대로 작동하지 않습니다. 내 서비스가 문제가 시작되는 것 같아요. ANR과 대화 상자에 "대기"를 탭해야합니다. 그러면 마침내 서비스가 시작됩니다. 서비스 시작에 오랜 시간이 걸리는 이유는 무엇입니까?

여기에 소스를 설정하고 오디오를 재생하는 내 간단한 코드입니다 :

public class MyActivityService extends Service { 

MediaPlayer player = new MediaPlayer(); 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
@Override 
public void onCreate() { 
    super.onCreate(); 

    try { 

    player.setDataSource("URL OF MUSIC FILE"); 
    } catch (IllegalArgumentException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IllegalStateException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    try { 

    player.prepare(); 
    player.setVolume(1, 1); 
     player.setLooping(true);   
     player.start();     

    Toast.makeText(getApplicationContext(), "Audio Service Started.", Toast.LENGTH_SHORT).show();} 

칙 :

가 빨리 시작 아니에요 오디오, 그것은 내 서비스가 시작되지되지 않았습니다 밝혀 2.2에서 충분하다 ... onCreate()onDestroy() 내 서비스의 메서드를 자신의 스레드에 넣음으로써 서비스가 시작되고 중단되었을 때 ANR을 제거 했으므로, 아마 처음부터 어떻게해야했을까요? 죄송합니다, 그냥 배우기.

하지만 진짜 문제가있어 지연이 명확히 남아있다 - 그것은 바로 지금처럼, 예를 들어,

, 내 코드를 벌금과 멋쟁이 작동하고 그냥 2.1에 그것을 할 방법과 2.2 때 http://dl.dropbox.com/u/6916184/TestSongStream.mp3

을하지만이 같은 오디오 스트림의 위치에 데이터 소스를 설정할 때이 같은 MP3 파일에 데이터 소스를 설정 http://d.liveatc.net/kjfk_twr 나이 : http://relay.radioreference.com:80/192236577 만 2.1에서 제대로 작동합니다.

2.2에서 소리가 결국 재생을 시작 않지만, 약 25 초 그래서 오디오가 시작할 때까지 다음과 같이 데이터 소스를 설정 한 후 "StagefrightPlayer"취

07-31 02:54:30.176: INFO/StagefrightPlayer(34): setDataSource('http://relay.radioreference.com:80/192236577') 
07-31 02:54:55.228: INFO/AwesomePlayer(34): calling prefetcher->prepare() 
07-31 02:54:56.231: INFO/Prefetcher(34): [0x2cc28] cache below low water mark, filling cache. 
07-31 02:54:56.337: INFO/AwesomePlayer(34): prefetcher is done preparing 
07-31 02:54:56.347: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12 
07-31 02:54:57.337: ERROR/AwesomePlayer(34): Not sending buffering status because duration is unknown. 

또한 동일한 금액을 소요 내 서비스의 onDestroy() 메서드에서 player.stop()이 호출 된 후 미디어 플레이어를 중지하고 onDestroy() 메서드가 메시지를 토스트하고 알림을 취소하기 위해 계속 약 25 초 걸립니다.

2.2와 똑같은 방식입니까? 그렇다면 지연 문제를 해결할 수 있습니다. 문제는 아닙니다. 아니면 내가 잘못하고있는 것일까? 1.6과 2.1에서 원하는대로 작동합니다!

코드를 더 게시 하시겠습니까?

내 코드는 매우 간단합니다. 오디오 컨트롤이 없거나 그런 것들은 없습니다. 오디오 스트림을 재생하는 서비스를 시작하고 중지하는 오디오 시작 단추 및 중지 오디오 단추 만 시작하면됩니다.

도움 주셔서 감사합니다.

+0

업데이트 :이 문제는 내가 연주하려고하는 특정 오디오 스트림과 관련이 있다는 것을 발견했습니다. 다른 스트림을 시도했는데 잘 돌아갔다. 어떤 유형의 오디오 스트림이 1.6과 2.1에서는 잘 동작하지만 2.2에서는 제대로 동작하지 않습니까? 2.2에서 미디어 프레임 워크가 모두 다르기 때문입니다. 서비스 시간 초과없이 작동하지 않는 스트림을 재생할 수 있어야합니다. 무엇을 시도해야합니까? 어떤 도움을 주셔서 감사합니다. – ShadowGod

+0

위의 업데이트 의견을 무시하고 본래의 질문에있는 부록을보십시오. 나는 진짜 문제를 분명히했습니다. 감사. – ShadowGod

+0

내 앱에서 똑같은 일을하고있어, @ ShadowGod 당신은 이것에 대한 해결책을 생각해 낼 수 있었습니까? –

답변

1

주 응용 프로그램 스레드, 특히 스트림의 경우 prepare()으로 전화하지 마십시오. ANR 전에 허용되는 것보다 훨씬 오래 걸릴 수 있습니다. 대신 prepareAsync()을 사용하십시오. 특정 문제의 근원인지는 모르지만 현재 구현중인 ANR의 원인 중 하나 일 것입니다.

+0

감사합니다. ANR을 수정했는데 위의 부록을 볼 수 있습니까? 이견있는 사람? – ShadowGod

+0

@ShadowGod : 죄송합니다. 문제에 관해 더 이상의 아이디어가 없습니다. – CommonsWare

+0

감사합니다. 고맙습니다. 감사합니다. – ShadowGod

관련 문제