Android: problema de la relación de aspecto de vídeo de MediaPlayer

Estoy teniendo un problema que no puedo resolver. Estoy usando la clase MediaPlayer para reproducir video; Sin embargo, siempre estoy perdiendo la relación de aspecto original. El código del reproductor multimedia y el código xml se mencionan aquí. He intentado muchas cosas pero todavía no puedo resolver el problema. Necesito mantener la relación de aspecto original. He declarado esta actividad como pantalla completa en mi archivo de manifiesto de Android. También he adjuntado el código xml aquí después del código del reproductor multimedia. Por favor aconsejame.

private class ErrorListener implements OnErrorListener { // FIXME: @Override public boolean onError(MediaPlayer mp, int what, int extra) { String message = "Unknown error"; switch (what) { case MediaPlayer.MEDIA_ERROR_UNKNOWN: message = "Unable to play media"; showError(message); break; case MediaPlayer.MEDIA_ERROR_SERVER_DIED: message = "Server failed"; showError(message); break; case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK: message = "Invalid media"; showError(message); break; } return false; } } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.videoview); Intent intent = getIntent(); uri = intent.getData(); new loadMovie().execute(); mPreview = (SurfaceView) findViewById(R.id.videoview); mPreview.bringToFront(); holder = mPreview.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mediaPlayer = new MediaPlayer(); }// onCreate Method Ends private void playVideo() { doCleanUp(); try { mediaPlayer.setDataSource(this, uri); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.setDisplay(holder); try { mediaPlayer.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.setOnErrorListener(new ErrorListener()); mediaPlayer.setOnBufferingUpdateListener(this); mediaPlayer.setOnCompletionListener(this); mediaPlayer.setOnPreparedListener(this); mediaPlayer.setOnVideoSizeChangedListener(this); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaController = new MediaController(this); } @Override public boolean onTouchEvent(MotionEvent event) { mediaController.show(); return false; } // --MediaPlayerControl // methods---------------------------------------------------- public void start() { mediaPlayer.start(); } public void pause() { mediaPlayer.pause(); } public int getDuration() { return mediaPlayer.getDuration(); } public int getCurrentPosition() { return mediaPlayer.getCurrentPosition(); } public void seekTo(int i) { mediaPlayer.seekTo(i); } public boolean isPlaying() { return mediaPlayer.isPlaying(); } public int getBufferPercentage() { return 0; } public boolean canPause() { return true; } public boolean canSeekBackward() { return true; } public boolean canSeekForward() { return true; } // End of MediaPlayer // Controls-------------------------------------------------------- // ------------------------ public void onPrepared(MediaPlayer mediaPlayer) { mediaController.setMediaPlayer(this); mediaController.setAnchorView(findViewById(R.id.videoview)); mIsVideoReadyToBePlayed = true; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } handler.post(new Runnable() { public void run() { mediaController.setEnabled(true); mediaController.show(); } }); } public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub playVideo(); } public void surfaceDestroyed(SurfaceHolder arg0) { } private void startVideoPlayback() { holder.setFixedSize(mVideoWidth, mVideoHeight); mediaPlayer.start(); } public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { if (width == 0 || height == 0) { return; } mIsVideoSizeKnown = true; mVideoWidth = width; mVideoHeight = height; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } public void onCompletion(MediaPlayer arg0) { } public void onBufferingUpdate(MediaPlayer mp, int percent) { } private void releaseMediaPlayer() { mediaPlayer.release(); mediaPlayer = null; } private void doCleanUp() { mVideoWidth = 0; mVideoHeight = 0; mIsVideoReadyToBePlayed = false; mIsVideoSizeKnown = false; } 

Y aquí está el XML:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" > <SurfaceView android:id="@+id/videoview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

¿Puede alguien por favor aconsejarme cómo puedo mantener la relación de aspecto del vídeo?

One Solution collect form web for “Android: problema de la relación de aspecto de vídeo de MediaPlayer”

Primero crea un Layout Relativo con Gravity.CENTER y adjunta su Vista de Superficie en ella. Esto asegurará que el video se centrará dentro de la pantalla.

También si está utilizando una actividad, utilice el tema "negro" para evitar el degradado

En su SurfaceView, cree un Listener:

 mMediaPlayer = new MediaPlayer(); 

MMediaPlayer.setOnVideoSizeChangedListener (mOnVideoSizeChangedListener);

 MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { setFitToFillAspectRatio(mp, width, height); } }; 

Finalmente el método de ajuste para llenar en su SurfaceView. Esto funciona en el paisaje y el retrato

 private void setFitToFillAspectRatio(MediaPlayer mp, int videoWidth, int videoHeight) { if(mp != null) { Integer screenWidth = ((Activity) mContext).getWindowManager().getDefaultDisplay().getWidth(); Integer screenHeight = ((Activity) mContext).getWindowManager().getDefaultDisplay().getHeight(); android.view.ViewGroup.LayoutParams videoParams = getLayoutParams(); if (videoWidth > videoHeight) { videoParams.width = screenWidth; videoParams.height = screenWidth * videoHeight / videoWidth; } else { videoParams.width = screenHeight * videoWidth / videoHeight; videoParams.height = screenHeight; } setLayoutParams(videoParams); } } 
  • Llamar al reproductor multimedia predeterminado con un URI en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.