Android: problema di formato video di MediaPlayer

Ho un problema che non riesco a risolvere. Sto usando la class MediaPlayer per riprodurre video; tuttavia, sto perdendo sempre il rapporto di aspetto originale. Qui viene menzionato il codice del lettore multimediale e il codice xml. Ho provato tante cose ma ancora non sono in grado di risolvere il problema. Ho bisogno di mantenere il rapporto di aspetto originale. Ho dichiarato questa attività come schermo a pieno schermo nel mio file Manifest di Android. Ho anche allegato il codice xml qui dopo il codice del lettore multimediale. Per favore consigliami.

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

E qui è l'XML:

  • BottomSheetBehavior non funziona quando la libreria di progettazione viene aggiornata a 24.2.0
  • Frammento di Android - spostarsi da una vista all'altra?
  • Colbind punti sulla mappa con le righe
  • Come dovrei gestire i timeout del server e le risposte ai codici di errore in un post http in App Android?
  • le tracce di stack si fermano prima di arrivare al mio codice (su Android utilizzando NDK)
  • Analisi della memory di Android
  •  <?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> 

    Può chiunque mi prega di consigliarmi come posso mantenere il rapporto di aspetto del video?

  • android: Imposta il collegamento con <a href> in TextView
  • Riconoscitore vocale Android con microfono Bluetooth
  • JWPlayer Javascript API per la visualizzazione di WebView Android
  • Utilizzo di Android NDK e C ++
  • Genera un dump di nucleo in android
  • SimpleCursorTreeAdapter e CursorLoader per ExpandableListView
  • One Solution collect form web for “Android: problema di formato video di MediaPlayer”

    Innanzitutto creare un layout relativo con Gravity.CENTER e colbind in essa la tua superficie. Ciò assicurerà che il video sarà centrato all'interno dello schermo.

    Anche se si utilizza un'attività, utilizzare il tema "nero" per evitare la sfumatura

    Nel tuo SurfaceView, crea 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); } }; 

    Infine il metodo di riempimento nel tuo SurfaceView. Questo functionrà su paesaggio e ritratto

     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); } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.