2009-07-27 33 views
9

Video kaydedici oluşturuyorum ve kayıtlı videoları önizlemek için video oynatıcı oluşturmak istiyorum. Bir MediaPreview sınıf şu şekilde oluşturduk kodu from this page değiştiriliyor:Android: Video oynatıcı nasıl oluşturulur?

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

kodu başarıyla (istisnasız) çalıştırır until mp.start();, ancak ekran boştur (sadece ekranda düğmeler vardır).

Yukarıdaki kodda neyin yanlış olabileceğini bilen var mı, yoksa web üzerinde çalışan bir örnek var mı?

Gerçekten manşeti Kapalı yardımına

+0

içinden çağrı

mp.setDisplay(mPreview.getHolder()); 

Ben benzer bir sorun var ... u bana lütfen bu linki kaldırılır –

cevap

6

takdir ediyorum, seni surfaceCreated() gibi, geri arama yöntemlerden bazıları biraz daha mantık gerektiğini düşünüyorum.

+1

bildirin, herhangi bir çözüm bulmak olsaydı. –

+0

bozuk link –

6

Yüzey oluşturulduktan sonra çalınacak yüzeye yapıştırmanız gerekir.

public void surfaceCreated(SurfaceHolder holder) 
İlgili konular