studio reproducir programacion móviles mediaplayer español ejemplo desarrollo curso aplicaciones android media-player

reproducir - programacion android pdf 2018



Android: Mediaplayer: cómo usar SurfaceView o mediaplayer para reproducir video en el tamaño correcto (3)

Estoy reproduciendo un archivo de video local usando MediaPlayer y SurfaceView. SurfaceView es el único control en actividad, mientras que mis archivos de video son QVGA u otros. El problema es que el video se estira, ¿Cómo puedo reproducir el video en su tamaño original, por ejemplo qvga con el área restante en negro?

De la iteración,

Cuando estoy forzado a establecer layout_height / width de Surfaceview en XML, el video se muestra bien. surface_holder.setFixedSize(w,h) no tiene ningún efecto, ni mp.setdisplay ().

Por favor guíe en esto.

ACTUALIZAR

Archivo XML

<?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>

El uso de MediaPlayer es según el siguiente enlace

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

Gracias por adelantado.


¿En su SurfaceView en XML está usando wrap_content? Esto debería solucionar su problema si no. Es posible que deba pegar un poco más de código para una mayor investigación si eso no soluciona su problema.

Cambie el ancho de la vista de superficie a wrap_content también.


Al configurar el diseño de SurfaceView en wrap_content no se ajustará el tamaño de un video para reproducirlo con la relación de aspecto adecuada.

  • Un SurfaceView es una superficie de dibujo optimizada
  • Un video se dibuja en un SurfaceView, no contenido en él

wrap_content es sinónimo de fill_parent para un SurfaceView.

Lo que quieres hacer es obtener las dimensiones de tu video del objeto MediaPlayer. Luego puede configurar la relación de aspecto de SurfaceView para que coincida con el video.

Algunos inicialización básica

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

Entonces las cosas buenas. He omitido la comprobación de errores aquí para reducir el código, las llamadas de MediaPlayer deben ajustarse en un intento {}.

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

Tenga en cuenta que este código hace algunas suposiciones sobre las dimensiones de su video. Tal como está, maximiza el ancho y asume que la altura no es mayor que la altura de la pantalla.

Es posible que desee ajustar la altura en lugar del ancho, también puede verificar el cálculo de la dimensión y asegurarse de que no sea mayor que la pantalla o la pantalla - other_layout_elements.


Aquí está el código que uso actualmente en un proyecto:

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

el diseño que estoy usando (puedes ignorar la barra de progreso)

<?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>