-1
소개스레드 스트리밍
나는 안드로이드 클라이언트에 TCP 패킷으로 비디오 패킷을 보내는 자바 서버가 있습니다.
안드로이드 클라이언트 측에서는 Java 서버의 패킷을받는 DowloadVideo와 비디오가있는 미디어 플레이어를 시작하는 스레드가 있습니다.
문제
내 문제는 내가 패킷을 수신 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();
}
});
}
}
감사합니다.
힌트 : 다른 사람들이 그곳에서 버그를 찾기 위해 모든 코드를 읽는 데 많은 시간을 할애해야한다고 심각하게 생각합니다. 그러나 당신은 모든 소스 코드를 적절하게 포맷하기 위해 몇 분을 소비하지 않으므로 다른 사람들을 읽기가 더 쉽습니다! 진심으로? – GhostCat