2012-06-19 8 views
8

Co chcę zrobić, to Pokaż obraz tła na SurfaceView przed rozpoczęciem odtwarzania wideo.Błąd "[SurfaceView] połącz: już podłączony", jeśli narysuję mapę bitową jako tło SurfaceView, a następnie odtwarzam wideo

  1. Próbowałem po prostu narysować obraz jpeg jako jego tło z SurfaceView. Zadziałało.
  2. Próbowałem także odtworzyć wideo na SurfaceView. To też zadziałało.

Ale kiedy próbowałem narysować obrazek jpeg jako tło powierzchni w funkcji powierzchniowej, a następnie odtworzyć wideo. Wystąpił błąd "[SurfaceView] connect: already connected".

Wszelkie pomysły? Dzięki.

Oto kod częściowego

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

Odpowiedz

0

myślę, problemem jest to, można korzystać z boku SurfaceHolder wystarczy zmienić obiekt mHolder z lokalnego obiektu posiadacz będzie to praca. nie mogę tego wypróbować po mojej stronie.

0

Oto kilka rzeczy, które widzę źle w oparciu o moje doświadczenia z MediaPlayer.

  • Najpierw użyj metody prepareAysnc() zamiast przygotować().
  • Po drugie, ustaw najpierw detektory przed wywołaniem funkcji prepare(). W twoim przypadku, mMediaPlayer.setOnPreparedListener (to)

jest poprzedzone przez przygotować(). Rozważmy scenariusz, w którym prepare() po zakończeniu szuka OnPreparedListener i nie znajduje go, ponieważ nie został jeszcze ustawiony. A ustawienie go później nie pomoże, ponieważ odtwarzacz multimediów jest już w stanie PREPARED, a zatem nigdy nie otrzymasz wywołania zwrotnego onPrepared().

Tak więc w twoim przypadku, mMediaPlayer.start() może nigdy nie zostać wykonane.

Najpierw ustaw wszystkie niezbędne detektory przed wywołaniem ich wyzwalaczy.

Powiązane problemy