2016-06-10 3 views
-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(); 
      } 
     }); 
    } 
} 

감사합니다.

+0

힌트 : 다른 사람들이 그곳에서 버그를 찾기 위해 모든 코드를 읽는 데 많은 시간을 할애해야한다고 심각하게 생각합니다. 그러나 당신은 모든 소스 코드를 적절하게 포맷하기 위해 몇 분을 소비하지 않으므로 다른 사람들을 읽기가 더 쉽습니다! 진심으로? – GhostCat

답변

0

실례합니다.

@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(); 
      } 
     }); 
    } 
}