线程流式处理



简介

我有一个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();
            }
        });
    }
}

最新更新