2012-06-19 14 views
8

Quello che voglio fare è Mostrare un'immagine di sfondo su SurfaceView prima di iniziare a riprodurre video.visualizza l'errore "[SurfaceView] connetti: già connesso" se disegno una bitmap come sfondo di SurfaceView e poi riproduco video

  1. Ho cercato di disegnare un'immagine jpeg come sfondo di SurfaceView. Ha funzionato.
  2. Ho anche provato a riprodurre un video su SurfaceView. Ha funzionato anche.

Ma, quando ho provato a disegnare l'immagine jpeg come sfondo di Surface nella funzione surfaceCreated e quindi riprodurre un video. Ho ricevuto l'errore "[SurfaceView] connetti: già connesso".

Qualche idea? Grazie.

Ecco il codice parziale

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
    Bitmap background = BitmapFactory.decodeResource(getResources(), R.drawable.pic1); 
    float scale = (float) background.getHeight()/(float)mPreview.getHeight(); 
    int newWidth = Math.round(background.getWidth()/scale); 
    int newHeight = Math.round(background.getHeight()/scale); 
    mScaledBitmap = Bitmap.createScaledBitmap(background, newWidth, newHeight, true); 
    Canvas canvas = mHolder.lockCanvas(); 
    canvas.drawBitmap(mScaledBitmap, 0, 0, null); 
    mHolder.unlockCanvasAndPost(canvas); 
    } catch (Exception e) 
    {} 
      // initialize mediaplayer 
    try { 
     mMediaPlayer = new MediaPlayer(); 
     mMediaPlayer.setDataSource("/sdcard/Movies/2.mp4"); 
     mMediaPlayer.setDisplay(mHolder); 
     mMediaPlayer.setLooping(true); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.setOnPreparedListener(this); 
     mMediaPlayer.setOnCompletionListener(this); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.e(TAG, "error: " + e.getMessage(), e); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e(TAG, "error: " + e.getMessage(), e); 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 
    Log.i(TAG, "surfaceChanged(w="+ width + ", h=" + height); 
    mSurfaceWidth = width; 
    mSurfaceHeight = height; 
    mVideoWidth = mMediaPlayer.getVideoWidth(); 
    mVideoHeight = mMediaPlayer.getVideoHeight(); 
    Log.i(TAG, "video size w=" + mVideoWidth + ", h=" + mVideoHeight +")");  
} 


@Override 
public void onPrepared(MediaPlayer mp) { 
    // TODO Auto-generated method stub 
    Log.i(TAG, "onPrepared"); 
    mMediaPlayer.start(); 
} 

risposta

0

penso problema è che si può utilizzare fuori SurfaceHolder lato basta cambiare oggetto mHolder con portaoggetti locale sarà il lavoro. non posso provarlo dalla mia parte

0

Ecco un paio di cose che vedo male in base alla mia esperienza con MediaPlayer.

  • Per prima cosa, utilizzare prepareAysnc() anziché prepare().
  • In secondo luogo, impostare gli ascoltatori prima di chiamare prepare(). Nel tuo caso, mMediaPlayer.setOnPreparedListener (this)

è seguito da prepare(). Considerare lo scenario in cui prepare() al completamento cerca OnPreparedListener e non lo trova, perché non lo hai ancora impostato. Non è quindi possibile impostarlo in seguito, poiché il lettore multimediale è già in stato PREPARATO e quindi non si otterrà mai il callbackPrepared().

Quindi nel tuo caso, mMediaPlayer.start() potrebbe non essere mai eseguito.

In generale, impostare prima tutti gli ascoltatori necessari, prima di richiamare i trigger.

Problemi correlati