14

surfaceview と mediaplayer でビデオプレーヤーを作りました。10 個のビデオと 10 個のボタンがあります。各ボタンをクリックすると、各動画が再生されます。

ここに私のコードがあります..

//onCreate   
holder = surfaceview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


//Button1
if(mp == null)mp = new MediaPlayer();

mp.setDataSource(mediaplay_path);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();


//Button2
if(mp != null){
    mp.stop();
    mp.reset();
}

mp.setDataSource(mediaplay_path2);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();

//Button3~Button10 is same as Button2..

すべて順調。私のカスタムビデオビューは問題なく動作しています。しかし、ビデオが次のビデオに移るとき、前のビデオの最後のシーンがしばらく残り、次のビデオ シーンに変わります。

次のビデオが再生される前に、前のサーフェスビューがクリアされている必要があるためだと思います。しかし、サーフェスビューまたはサーフェスホルダーをクリアする方法がわかりません。

私はこれを検索しましたが、ビデオを再生する方法しか見つけられませんでした。

助けてください~~!

4

5 に答える 5

7

これを理解するのに2週間かかりました。サーフェスホルダーを TRANSPARENT に設定すると、Android はサーフェスを破棄します。次に、OPAQUE に戻すと、サーフェスを「クリア」する新しいサーフェスが作成されます。surfacecreate および surfacedestroy イベントが発生することに注意してください。コードがある場合は注意してください。イメージビューを黒に設定して、背景を黒にしました。そのためのより良い方法があるかもしれません。

private void playVideoA() { 
     imageViewBlack.bringToFront();
     surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
     surfaceHolder.setFormat(PixelFormat.OPAQUE);
     surfaceView.bringToFront();
     mediaPlayerA.setDisplay(surfaceHolder);
     //surfaceView.setAlpha((float) 0.01);
     mediaPlayerA.start();
};
private void prepareVideoA(String url) {
     try {
        mediaPlayerA = new MediaPlayer();
        mediaPlayerA.setDataSource(url);
        mediaPlayerA.prepareAsync();
        mediaPlayerA.setOnPreparedListener(this);
        mediaPlayerA.setOnCompletionListener(this);
        mediaPlayerA.setOnBufferingUpdateListener(this);
        mediaPlayerA.setOnInfoListener(this);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
};
@Override
public void onPrepared(MediaPlayer mp) {
     playVideoA()
}
于 2013-09-19T23:36:18.337 に答える
1

removeView を使用して古いカスタムのビデオビューを削除し、新しいビューを追加できる場合があります

于 2013-07-21T09:13:44.710 に答える