2011-01-29 2 views
18

Я играю в локальный видеофайл с помощью MediaPlayer и SurfaceView. SurfaceView - единственный элемент управления в действии, в то время как мои видеофайлы - QVGA или другие. Проблема в том, что видео растягивается, как я могу воспроизводить видео в его первоначальном размере, например. qvga с оставшейся областью черного цвета.Android: Mediaplayer: Как использовать SurfaceView или медиаплеер для воспроизведения видео в правильном размере

От итерации

Когда я принудительно устанавливает layout_height/ширина SurfaceView в XML, видео отображается нормально. surface_holder.setFixedSize(w,h) не имеет никакого эффекта, ни mp.setdisplay().

В этом руководстве.

UPDATE

XML flie

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/home_container" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

<SurfaceView 
     android:id="@+id/surface" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="10dip" /> 
</framelayout> 

использование MediaPlayer как на следующей ссылке

http://davanum.wordpress.com/2007/12/29/android-videomusic-player-sample-from-local-disk-as-well-as-remote-urls/

Спасибо заранее.

ответ

-3

На вашем SurfaceView в XML вы используете wrap_content? Это должно решить вашу проблему, если нет. Возможно, вам понадобится вставить еще немного кода для дальнейшего расследования, если это не решит вашу проблему.

Измените ширину обзора поверхности на wrap_content.

+0

Я использую wrap_content в XML, a . По-прежнему видео - это полный экран, растянутый, я хочу отображать видео в оригинальном размере. – JRC

+0

Я обновил свой ответ, пожалуйста, измените свою ширину, чтобы обернуть контент. Если один из них настроен для заполнения, это приведет к тому, что макет будет растягивать видео пропорционально в любом направлении. – Joey

+0

Это не работает –

77

Настройка вашего изображения SurfaceView на wrap_content будет не Размер видео для воспроизведения в правильном соотношении сторон.

  • SurfaceView представляет собой оптимизированную поверхность чертежа
  • Видео обращается к SurfaceView, не содержится в нем

wrap_content является синонимом fill_parent для SurfaceView.

Что вы хотите сделать, это получить размеры вашего видео с объекта MediaPlayer. Затем вы можете установить соотношение сторон SurfaceView в соответствии с видео.

Некоторые основные инициализации

public class YourMovieActivity extends Activity implements SurfaceHolder.Callback { 
    private MediaPlayer mp = null; 
    //... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mp = new MediaPlayer(); 
     mSurfaceView = (SurfaceView) findViewById(R.id.surface); 
     //... 
    } 
} 

Тогда хороший материал. Здесь я пропустил проверку ошибок, чтобы уменьшить код, вызовы MediaPlayer должны быть завернуты в try {}.

@Override 
public void surfaceCreated(SurfaceHolder holder) { 

    mp.setDataSource("/sdcard/someVideo.mp4"); 
    mp.prepare(); 

    //Get the dimensions of the video 
    int videoWidth = mp.getVideoWidth(); 
    int videoHeight = mp.getVideoHeight(); 

    //Get the width of the screen 
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); 

    //Get the SurfaceView layout parameters 
    android.view.ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams(); 

    //Set the width of the SurfaceView to the width of the screen 
    lp.width = screenWidth; 

    //Set the height of the SurfaceView to match the aspect ratio of the video 
    //be sure to cast these as floats otherwise the calculation will likely be 0 
    lp.height = (int) (((float)videoHeight/(float)videoWidth) * (float)screenWidth); 

    //Commit the layout parameters 
    mSurfaceView.setLayoutParams(lp);   

    //Start video 
    mp.start(); 
} 

Обратите внимание, что этот код делает некоторые предположения относительно размеров вашего видео. As-is, он максимизирует ширину и предполагает, что высота не превышает высоту экрана.

Возможно, вы захотите установить высоту вместо ширины, также вы можете проверить расчет размеров и убедиться, что он не больше, чем экран или экран - other_layout_elements.

+2

У меня нет слов, чтобы поблагодарить вас Ошибка 454 .. Вы сохранили мой проект .. – Farhan

+0

Рад услышать, что это сработало для вас :) –

+0

Примечание: getVideoWidth и getVideoHeight отменены в приведенном выше примере – coco

3

вот код, который я в настоящее время используют в проекте:

private MediaPlayer mMediaPlayer; 
private SurfaceView mSurfaceView; 
private SurfaceHolder holder; 
private int mPos = 0; 

...

int width = mSurfaceView.getWidth(); 
int height = mSurfaceView.getHeight(); 
float boxWidth = width; 
float boxHeight = height; 

float videoWidth = mMediaPlayer.getVideoWidth(); 
float videoHeight = mMediaPlayer.getVideoHeight(); 

Log.i(TAG, String.format("startVideoPlayback @ %d - video %dx%d - box %dx%d", mPos, (int) videoWidth, (int) videoHeight, width, height)); 

float wr = boxWidth/videoWidth; 
float hr = boxHeight/videoHeight; 
float ar = videoWidth/videoHeight; 

if (wr > hr) 
    width = (int) (boxHeight * ar); 
else 
    height = (int) (boxWidth/ar); 

Log.i(TAG, String.format("Scaled to %dx%d", width, height)); 

holder.setFixedSize(width, height); 
mMediaPlayer.seekTo(mPos); 
mMediaPlayer.start(); 

макет Я использую (вы можете просто игнорировать прогресс бар)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 

<ProgressBar 
    android:id="@+id/progressBar1" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

<SurfaceView 
    android:id="@+id/surface" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" > 
</SurfaceView> 

+0

возможно 'android.widget.VideoView' уже делает это сам – sherpya

+0

напишите полный код ... вы не создали экземпляр« MediaPlayer »и не показали связи между держателем и медиаплеером. –

+0

Теперь я использую 'VideoView', это виджет, который вы можете использовать непосредственно в макете, он сам обрабатывает соотношение сторон – sherpya

Смежные вопросы