2016-10-01 3 views
0

ListView을 통해 추가되는 몇 가지 오디오 파일을 스트리밍하기 위해 android에 MediaPlayer을 사용하고 있습니다. 항목은 ListView에서 클릭 할 때 오디오가 재생됩니다.MediaPlayer : 오디오가 처음부터 스트림되지 않습니다.

스트림은 상당히 길며 (35 분 +) 사용자가 스트림이 끝나기 전에 응용 프로그램을 종료 한 경우입니다. 그런 다음 항목이 실행 후 ListView에서 다시 선택되면 스트림은 중단 된 동일한 위치에서 다시 시작되지만 항목이 ListView에서 선택 될 때마다 처음부터 시작됩니다.

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    musicService.player.reset(); 
    musicService.player.release(); 
    musicService.player = new MediaPlayer(); 

    try { 
     musicService.player.setDataSource(skURL[position]); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    musicService.player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    musicService.player.prepareAsync(); 
    musicService.player.setOnPreparedListener(this); 
} 

@Override 
public void onPrepared(MediaPlayer mp) { 
    musicService.playSK(); 
} 

//In the MusicService.java 

public void playSK(){ 
    player.start(); 
} 

나는 그것이

public void playSK(){ 
    player.seekTo(0); 
    player.start(); 
} 

같은 문제를 해결할하고 부분적으로했던 것을 생각하고 playSK() 방법 0으로 시크 위치를 설정하려 :

여기에 코드입니다. ListView의 첫 번째 항목을 선택하면 다음 스트림은 항상 처음부터 시작하지만 다른 항목을 클릭하면 다음과 같은 오류를 제공합니다 :

MediaPlayer : error (-2147483648, 0) 
MediaPlayer : start called in state 0 
MediaPlayer : error (-38, 0) 
MediaPlayer : Error (-2147483648, 0) 
MediaPlayer : Error (-38, 0) 

업데이트 :

그래서 내가 거기 왜 파고하기로 결정 트랙의 시작 부분을 찾으려고 할 때 발생하는 문제로, 미디어 플레이어가 프로토콜 예외로 인해 재생 시간을 가져올 수 없다는 것을 알았습니다.

10-01 17:35:06.065 10031-10031/project D/LOG: data source set 
10-01 17:35:06.065 10031-10031/project D/LOG: preparing media player 
10-01 17:35:06.067 10031-10066/project D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= stagefright/1.2 (Linux;Android 6.0.1) 
10-01 17:35:06.070 10031-10031/project D/MediaPlayer: setSubtitleAnchor in MediaPlayer 
10-01 17:35:06.073 10031-10031/porject D/LOG: media player prepared 
10-01 17:35:06.074 10031-10066/project D/MediaHTTPConnection: proxy null port 0 
10-01 17:35:06.171 10031-10066/project W/MediaHTTPConnection: readAt 12648448/32768 => java.net.ProtocolException 
10-01 17:43:43.352 21618-21618/project D/LOG: seeking to start 
10-01 17:43:43.352 21618-21618/project W/MediaPlayer: Stream has no duration and is therefore not seekable. 

어떻게이 예외를 처리하고 문제를 해결합니까?

+0

MP 객체의 여러 상태에 집중하십시오. 올바른 트랙이로드되어 있고 플레이어가 올바른 상태 인 경우 IMO에 seek() 호출이있는 NP가 있어야합니다. –

+0

Updated : ProtocolException을 어떻게 처리합니까? – Devansh

+0

ur가 ffmpeg에 익숙하지 않은 경우 YouTube에서 미디어를 업로드 한 다음 YouTube에서 다운로드하여 다운로드 한 버전을 다시 시도하십시오 .. utube remux'd it at Atom이 있기 때문에 괜찮을 수도 있습니다 –

답변

0

musicService.player.release(); 뒤에 미디어 플레이어 객체를 null로 설정해보십시오.

musicService.player = null; 

나도이 문제에 직면 해있다. 나를 위해 유일한 해결 방법은 null이된다. 문제가 계속되는 경우

+0

끝났습니다. 도움이되지 않았습니다. onPrepared 메소드에서 – Devansh

+0

을 사용하면 매개 변수 –

+0

안에있는 해당 객체를 사용해야합니다. 어느 쪽도 도움이되지 않습니다. 어떻게 든 장치가 노래에서 URL에 도달 한 지속 시간을 캐시 한 다음 캐시 된 지속 시간을 단순히 'player.setDataSource' 메소드로 전달할 수 있습니까? 항목을 반복해서 누르면 3 ~ 4 초 앞으로 건너 뛰고 처음부터 무작위로 시작되기 때문입니다. 따라서 임시 파일에 데이터를 버퍼링하고 저장했기 때문에 건너 뛰기가 쉽습니다. 버퍼링 된 데이터가 없어지면 트랙 시작 부분으로 이동합니다. – Devansh

관련 문제