2009-07-27 41 views
9

Tôi đang tạo một máy quay video và muốn tạo trình phát video để xem trước các video đã ghi. Sửa đổi mã from this page Tôi đã tạo ra một lớp MediaPreview theo cách sau:Android: Cách tạo trình phát 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); 
} 
} 

Mã này thực hiện thành công (không có bất kỳ ngoại lệ) until mp.start();, nhưng màn hình trống (chỉ có các nút trên màn hình).

Có ai biết điều gì có thể sai trong mã ở trên hoặc có ví dụ nào hoạt động trên web không?

tôi sẽ thực sự đánh giá cao sự giúp đỡ

+0

Tôi có vấn đề tương tự ... nếu u đã tìm thấy bất kỳ giải pháp, hãy để tôi vui lòng biết –

Trả lời

6

của bạn Off the cuff, tôi nghĩ rằng bạn cần một số logic hơn trong một số các phương pháp gọi lại của bạn, giống như surfaceCreated().

+1

liên kết này được lấy ra. –

+0

liên kết bị hỏng –

6

Bạn cần đính kèm bề mặt để phát sau khi bề mặt được tạo.

gọi

mp.setDisplay(mPreview.getHolder()); 

từ bên

public void surfaceCreated(SurfaceHolder holder) 
Các vấn đề liên quan