2012-03-27 218 views
0

我在mediaplayer中播放視頻時遇到問題。我有一個聲音,但沒有視頻。我嘗試了一切,找不到解決辦法。或者,也許你知道如何在videoview中播放sdp文件?下面的代碼:沒有視頻媒體播放器

public class TestStream1 extends Activity implements Callback{ 
MediaPlayer mMediaPlayer; 
String SrcPath = "rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov"; 
private SurfaceView mPreview; 
private SurfaceHolder holder; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mPreview = (SurfaceView) findViewById(R.id.surface); 
     holder = mPreview.getHolder(); 
     holder.addCallback(TestStream1.this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     holder.setFixedSize(400,300); 
     mMediaPlayer = new MediaPlayer(); 
     try{ 
      mMediaPlayer.setDataSource(SrcPath); 
      mMediaPlayer.setDisplay(holder); 
      mMediaPlayer.prepare(); 
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mMediaPlayer.start(); 

     }catch(Exception e){ 
      Toast .makeText(TestStream1.this, "Fail", Toast.LENGTH_LONG).show(); 
     } 

} 
@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 

} 
} 

編輯:佈局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" /> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
     <SurfaceView 
      android:id="@+id/surface" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 
    </LinearLayout> 
</LinearLayout> 

回答

2

有些視頻無法在媒體播放器演奏,如果它沒有a/v的編解碼器,或者它太複雜或交錯嚴重(查看Logcat查找某些標誌)。可能是一個或多個原因。要確保媒體播放器可以播放要播放的視頻類型,請將具有相同a/v編解碼器和擴展名的視頻文件保存到SD卡中,然後嘗試使用默認媒體播放器播放。 儘管如此,請嘗試使用videoView來檢查視頻是否可以播放。您的代碼似乎沒問題。

試試此代碼:

package a.b;

public class TestStream1 extends Activity implements Callback{ 
    MediaPlayer mMediaPlayer; 
    String SrcPath = "rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov"; 
    private SurfaceView mPreview; 
    private SurfaceHolder holder; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mPreview = (SurfaceView) findViewById(R.id.surface); 
     holder = mPreview.getHolder(); 
     holder.addCallback(TestStream1.this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     holder.setFixedSize(400,300); 
     mMediaPlayer = new MediaPlayer(); 

    } 
    @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 
     try{ 
      mMediaPlayer.setDisplay(holder); 
      mMediaPlayer.setDataSource(SrcPath); 
      mMediaPlayer.prepare(); 
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mMediaPlayer.start(); 

     }catch(Exception e){ 
      Toast .makeText(TestStream1.this, "Fail", Toast.LENGTH_LONG).show(); 
     } 

    } 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
mMediaPlayer.release(); 
    } 
} 

SurfaceHolders被ansynchronously創建的,所以我們必須等待,直到表面已經被創建,然後將返回的表面持有者對象。 ,我使用了以下佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" /> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <SurfaceView 
      android:id="@+id/surface" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 
</LinearLayout> 

上述解決方案應該工作。

+0

我試圖在videoView中做同樣的事情,它的工作原理有聲音和視頻。唯一的問題是媒體播放器。 mediaplayer和videoview使用相同的編解碼器嗎? – 2012-03-27 12:46:49

+0

是的,他們使用同一個媒體播放器。 VideoView只是surfaceHolder的包裝,非常方便。這意味着代碼需要檢查。如果可以,你可以去videoView。發佈你的佈局xml如果你不想要,我們將嘗試糾正代碼。 :) – Akhil 2012-03-27 17:06:35

+0

我的意思是如果你不想使用視頻視圖,並繼續與表面視圖 – Akhil 2012-03-27 17:48:13

1

注肯定,但嘗試設置數據源,如:

mMediaPlayer.setDataSource(this, SrcPath); 
+0

是的,我試過這個,但沒有任何變化 – 2012-03-27 12:47:59