Threads dans streaming video

RayanDin Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
BunoCS Messages postés 15952 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Introduction

J'ai un Serveur en Java qui envoi une vidéo paquet par paquet à un client Android.

Côté Android Client, j'ai une classe DownloadVideo qui me permet de réceptionner une vidéo et un Thread qui me permet de lancer la video avec le media player.


Problème

Quand je lance la vidéo au bout de 5s, le média player lit uniquement les paquets reçus au moment du lancement de la vidéo.
Seulement, les paquets continus d'être reçus... et j'aimerais que le média player puisse continuer sa lecture pour arriver à la fin de la vidéo.

Code

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();



vidSurface = (SurfaceView) findViewById(R.id.surfView);


ConcurrentLinkedDeque<OutputStream[]> list = new ConcurrentLinkedDeque<>();


Connexion connexion = new Connexion(list);
connexion.execute();

new Thread(new Task2(list)).start();



}

@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDisplay(vidHolder);
mediaPlayer.setDataSource(vidAddress);
mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
catch(Exception e){
e.printStackTrace();
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {

}
});
mediaPlayer.start();
}


private class Connexion extends AsyncTask<Void, Void, Void> {

private ConcurrentLinkedDeque<OutputStream[]> list;

public Connexion(ConcurrentLinkedDeque<OutputStream[]> list) {
this.list = list;
}
@Override
protected Void doInBackground(Void... params) {
ConcurrentLinkedDeque<OutputStream[]> list = new ConcurrentLinkedDeque<>();

DownloadVideo dv = new DownloadVideo(list);
dv.connexion();

return null;
}
}

public void launchVideo() {
try {
Thread.sleep(5000);

vidHolder = vidSurface.getHolder();
vidHolder.addCallback(this);

} catch (ActivityNotFoundException e2) {
// displayToast(getResources().getString(R.string.error_unknownMX)); // Erreur, on affiche un message à l'utilisateur
// Log.e( "Error", getResources().getString(R.string.error_unknownMX));
} catch (InterruptedException e) {
e.printStackTrace();
}
}

// Thread to read video
class Task2 implements Runnable {
private ConcurrentLinkedDeque<OutputStream[]> list;

public Task2(ConcurrentLinkedDeque<OutputStream[]> list) {
this.list = list;
}

@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
Log.d("1", "Thread2");
launchVideo();
}
});
}
}


Merci à vous.
A voir également:

3 réponses

BunoCS Messages postés 15952 Date d'inscription   Statut Modérateur Dernière intervention   3 918
 
Hello,

Alors d'abord, ce n'est pas du tout mon domaine...mais quelques petites choses me "choquent".

1. Tu lances la Task2 avec une liste en paramètre mais tu ne t'en sers pas?
2. Tu ré-implémente le principe du streaming? Pourquoi ne pas utiliser du tout prêt? https://developer.android.com/guide/topics/media/mediaplayer.html
0
RayanDin Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
Non je m'en sers pas mais je pense m'en servir pour la suite.

Pour moi le problème est que le lecteur video ne se rafraîchie pas avec les nouveux paquets reçus.
0
BunoCS Messages postés 15952 Date d'inscription   Statut Modérateur Dernière intervention   3 918
 
Je ne comprends pas trop ton AsyncTask
Connexion
. A quoi elle sert? Tu fais quoi dans ton objet
DownloadVideo
?
0