Android 4.0.4 MediaPlayer przygotowuje wydanie przy użyciu adresów URL RTSP
Mam dziwny problem z aplikacją do przesyłania strumieniowego wideo, nad którą pracuję. Rzeczywista transmisja wideo / audio działa dobrze na wszystkich moich urządzeniach testowych. Jednak na pozornie dowolnym urządzeniu 4.0+, gdy używa się adresu URL RTSP, preparat () zwraca natychmiast (powoduje to problem z przekazywaniem użytkownikom odpowiednich informacji podczas ładowania wideo i zakłóca działanie kilku innych systemów, które mam na swoim miejscu).
Poniżej znajduje się blok kodu, w którym inicjuję i konfiguruję MediaPlayer, ale pamiętaj o kilku rzeczach:
Moja metoda initPlayer jest wywoływana z AsyncTask.Film ostatecznie gra poprawnie, ale przygotowanie powrotu natychmiast powoduje brak informacji zwrotnej dla użytkownika podczas ładowania wideo.Podczas całego procesu nie występują żadne błędystart () jest wywoływany w MediaPlayer za pomocą metody onPrepared w moim OnPreparedListener, co oczywiście staje się problemem, gdy preparat prepare () powraca przed faktycznym przygotowaniem do odtworzenia.Strumienie HTTP wydają się działać poprawnie, a na każdym urządzeniu testowym poniżej 4.0 problem nie występuje.Próbowałem to naprawić przez śmieszną ilość czasu i nie udało mi się znaleźć nikogo, kto wpadłby w ten problem. Wszelkie pomysły byłyby bardzo mile widziane.
public void initPlayer() {
//We first need to make sure the MediaPlayer isn't null
if(mMediaPlayer==null){
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnPreparedListener(mediaPlayerPreparedListener);
mMediaPlayer.setOnCompletionListener(mediaPlayerCompletionListener);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
//If a video/stream has been chosen while another is already playing
else if(mMediaPlayer.isPlaying()){
mMediaPlayer.reset();
}
//Video is not in full screen mode
second = false;
try {
mMediaPlayer.setDataSource(videoString);
holder = mPreview.getHolder();
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//onPreparedListener
private OnPreparedListener mediaPlayerPreparedListener = new OnPreparedListener(){
public void onPrepared(MediaPlayer mp) {
mp.start();
vidPb.setVisibility(View.INVISIBLE);
}
};