2011-01-29 2 views
18

Sto riproducendo file video locali utilizzando MediaPlayer e SurfaceView. SurfaceView è l'unico controllo in attività, mentre i miei file video sono QVGA o altro. Il problema è che il video si sta allungando, come posso riprodurre il video nelle sue dimensioni originali, ad es. qvga con area rimanente nera.Android: Mediaplayer: come utilizzare SurfaceView o mediaplayer per riprodurre video nella dimensione corretta

Da iterazione,

quando sto con forza imposta layout_height/larghezza SurfaceView in XML, video visualizzato bene. surface_holder.setFixedSize(w,h) non ha alcun effetto, né mp.setdisplay().

Guida in questo.

UPDATE

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

utilizzo MediaPlayer è secondo seguente link

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

Grazie in anticipo.

risposta

-3

Sul tuo SurfaceView in XML stai utilizzando wrap_content? Questo dovrebbe risolvere il tuo problema se non. Potrebbe essere necessario incollare un po 'più di codice per ulteriori indagini se ciò non risolve il problema.

Cambia anche la larghezza della vista della superficie in wrap_content.

+0

sto usando wrap_content in XML, un fonte dded. Il video è a schermo intero, allungato, voglio mostrare il video nelle sue dimensioni originali. – JRC

+0

Ho aggiornato la mia risposta, per favore cambia la larghezza per avvolgere anche il contenuto. Con uno di questi set da riempire, il layout allungherà proporzionalmente il video in entrambe le direzioni. – Joey

+0

Questo non funziona –

77

L'impostazione del layout di SurfaceView su wrap_content è non dimensioni un video da riprodurre con le proporzioni corrette.

  • Un SurfaceView è una superficie di disegno ottimizzato
  • Un video viene attirata da un SurfaceView, non all'interno di esso

wrap_content è sinonimo di fill_parent per un SurfaceView.

Quello che vuoi fare è ottenere le dimensioni del tuo video dall'oggetto MediaPlayer. È quindi possibile impostare le proporzioni di SurfaceView in modo che corrispondano al video.

Alcuni di inizializzazione di base

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

Poi la roba buona. Ho omesso il controllo degli errori qui per ridurre il codice, le chiamate di MediaPlayer dovrebbero essere racchiuse in una prova {}.

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

Si noti che questo codice formula alcune ipotesi sulle dimensioni del video. Così com'è, massimizza la larghezza e assume che l'altezza non sia maggiore dell'altezza dello schermo.

Si consiglia di adattare l'altezza anziché la larghezza, inoltre è possibile controllare il calcolo della quota e assicurarsi che non sia maggiore dello schermo o dello schermo - other_layout_elements.

+2

Non ho parole per ringraziarti Errore 454 .. Hai salvato il mio progetto .. – Farhan

+0

Contento di aver sentito questo ha funzionato per te :) –

+0

Nota: getVideoWidth e getVideoHeight sono invertiti nell'esempio sopra riportato – coco

3

ecco il codice attualmente utilizzo in un progetto:

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

il layout che sto utilizzando (si può semplicemente ignorare la barra di avanzamento)

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

forse 'android.widget.VideoView' lo fa già da solo – sherpya

+0

per favore scrivi il codice completo ... non hai creato l'istanza di' MediaPlayer' e non hai mostrato la relazione tra titolare e lettore multimediale. –

+0

Sto usando 'VideoView' ora, è un widget che puoi usare direttamente nel layout, gestisce da solo le proporzioni – sherpya