2009-07-27 19 views
9

Sto creando un videoregistratore e vorrei creare un video player per visualizzare in anteprima i video registrati. Modificando il codice from this page ho creato una classe MediaPreview seguente modo:Android: come creare un lettore video?

public class MediaPreview extends Activity implements OnErrorListener, 

OnBufferingUpdateListener, 
OnCompletionListener, OnPreparedListener, SurfaceHolder.Callback{ 

private static final String TAG = "MediaPreview"; 

private MediaPlayer mp; 
private SurfaceView mPreview; 
private SurfaceHolder holder; 
private Button btnPlay; 
private Button btnPause; 
private Button btnReset; 
private Button btnStop; 

private String mPath; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.media_preview); 

    mPreview = (SurfaceView)findViewById(R.id.mPreview); 
    btnPlay = (Button)findViewById(R.id.btnPlay); 
    btnPause = (Button)findViewById(R.id.btnPause); 
    btnReset = (Button)findViewById(R.id.btnReset); 
    btnStop = (Button)findViewById(R.id.btnStop); 

    getPathFromParentDialog(); 

    btnPlay.setOnClickListener(new View.OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      playVideo(); 
     } 
    }); 

    btnPause.setOnClickListener(new View.OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if(mp != null){ 
       mp.pause(); 
      } 
     } 
    }); 

    btnReset.setOnClickListener(new View.OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      if(mp != null){ 
       mp.seekTo(0); 
      } 
     } 
    }); 

    btnStop.setOnClickListener(new View.OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      if(mp != null){ 
       mp.stop(); 
       mp.release(); 
      } 
     } 
    }); 

    getWindow().setFormat(PixelFormat.TRANSPARENT); 
    holder = mPreview.getHolder(); 
    holder.addCallback(this); 
    holder.setFixedSize(400, 300); 
} 

@Override 
protected void onResume() { 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    super.onResume(); 
} 

@Override 
public boolean onError(MediaPlayer mp, int what, int extra) { 
    if(mp != null){ 
     mp.stop(); 
     mp.release(); 
    } 
    return false; 
} 

@Override 
public void onBufferingUpdate(MediaPlayer mp, int percent) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onCompletion(MediaPlayer mp) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onPrepared(MediaPlayer mp) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 

private void playVideo() { 
    try{ 
     mp = new MediaPlayer(); 
     mp.setOnErrorListener(this); 
     mp.setOnBufferingUpdateListener(this); 
     mp.setOnCompletionListener(this); 
     mp.setOnPreparedListener(this); 
     mp.setAudioStreamType(2); 

     mp.setDisplay(mPreview.getHolder()); 
     Runnable r = new Runnable(){ 
      @Override 
      public void run() { 
       try{ 
        setDataSource(mPath); 
       } 
       catch(Exception ex){ 
        Log.e(TAG, ex.getMessage()); 
       } 
       try { 
        mp.prepare(); 
        Log.v(TAG, "Duration: ===> " + mp.getDuration()); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        Log.e(TAG, e.getMessage()); 
       } 
       mp.start(); 
      } 

     }; 
     new Thread(r).start(); 
    } 
    catch(Exception ex){ 
     String sDummy = ex.toString(); 
     if(mp != null){ 
      mp.stop(); 
      mp.release(); 
     } 
    } 

} 

private void setDataSource(String path) throws IOException { 
    if(!URLUtil.isNetworkUrl(mPath)){ 
     mp.setDataSource(mPath); 
    } 
    else{ 
     URL url = new URL(mPath); 
     URLConnection cn = url.openConnection(); 
     cn.connect(); 
     InputStream stream = cn.getInputStream(); 
     if(stream == null){ 
      throw new RuntimeException("stream is null"); 
     } 
     File fileTemp = File.createTempFile("mediaplayerTmp", "dat"); 
     String tempPath = fileTemp.getAbsolutePath(); 
     FileOutputStream out = new FileOutputStream(fileTemp); 
     byte buf[] = new byte[128]; 
     do{ 
      int numRead = stream.read(buf); 
      if(numRead <= 0){ 
       break; 
      } 
      out.write(buf, 0, numRead); 
     }while(true); 
     mp.setDataSource(tempPath); 
     try{ 
      stream.close(); 
     } 
     catch(Exception ex){ 
      String sDummy = ex.toString(); 
     } 
    } 
} 

private void getPathFromParentDialog() 
{ 
    Intent intent = getIntent(); 
    mPath = intent.getExtras().getString(MediaLibrary.FILENAME); 
} 
} 

Il codice viene eseguito con successo (senza eccezioni) until mp.start();, ma lo schermo è vuoto (ci sono solo pulsanti sullo schermo).

Qualcuno sa cosa potrebbe essere sbagliato nel codice sopra o c'è qualche esempio che funziona disponibile sul web?

Vorrei davvero apprezzare il vostro aiuto

+0

ho il problema simile ... se u avuto trovare alcuna soluzione, fatemi sapere gentilmente –

risposta

6

a braccio, penso che hai bisogno di un po 'di logica in alcuni dei vostri metodi di callback, come surfaceCreated().

+1

questo link è stato rimosso. –

+0

è un collegamento interrotto –

6

È necessario collegare la superficie al gioco dopo che la superficie è stata creata.

chiamata

mp.setDisplay(mPreview.getHolder()); 

dall'interno

public void surfaceCreated(SurfaceHolder holder) 
Problemi correlati