简介
我有一个Java服务器,它通过TCP中的数据包将视频数据包发送到Android客户端。
在Android客户端,我有一个类:DowloadVideo,用于接收Java服务器的数据包,以及一个启动带有视频的媒体播放器的线程。
问题
我的问题是,当我在接收数据包 5 秒后启动视频时,媒体播放器在媒体播放器启动时只读取接收数据包。
客户端继续接收数据包。.
但是媒体播放器无法读取更多的数据包继续。
法典
@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.seekTo(1000);
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() {
// Chemin de la vidéo
try {
Thread.sleep(5000);
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Movies/chrono2.mp4");
Long max = file.length();
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();
}
}
protected void displayToast(String message) {
Toast toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG);
toast.show();
}
// 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();
}
});
}
}
谢谢。
对不起。
@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 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() {
vidHolder = vidSurface.getHolder();
vidHolder.addCallback(this);
}
// 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();
}
});
}
}