3

現在、VideoView を使用して rtsp ライブ ストリーミング ソースを再生しています。これはうまくいきます。

VideoView は、最初は「通常の」状態の他の要素を含むフラグメント内にあり、フルスクリーンのトグル ボタンを実装しようとしています。

フルスクリーン モードにするには、VideoView をその親 (LinearLayout) から削除してから、別の LinearLayout に追加し、getActivity().addContentView() を使用して他のすべての上に追加します。コードは次のとおりです。

    LayoutInflater lf = getActivity().getLayoutInflater();          
    vFullScreen = lf.inflate(R.layout.full_screen, myViewGroup, false);             

    LinearLayout fullscreenCont = (LinearLayout) vFullScreen.findViewById(R.id.fullscreen_container);

    ((ViewGroup) vsPlayer.getParent()).removeView(vsPlayer);

    fullscreenCont.addView(vsPlayer);

    LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    getActivity().addContentView(vFullScreen, params);

問題は、元の親ビューから削除されるとビデオが黒くなることです。

私が達成しようとしているのは、再接続/再度バッファリングする必要がないようにビデオ インスタンスを保持することですが、この親の切り替え中にビデオの再生を保持する方法がわかりません。アイデアはありますか?

編集:

次のように、videoView を一時停止してから再開すると、次のようになります。

LayoutInflater lf = getActivity().getLayoutInflater();          
vFullScreen = lf.inflate(R.layout.full_screen, myViewGroup, false);             

LinearLayout fullscreenCont = (LinearLayout) vFullScreen.findViewById(R.id.fullscreen_container);

vsPlayer.getVideoView().suspend();
((ViewGroup) vsPlayer.getParent()).removeView(vsPlayer);

fullscreenCont.addView(vsPlayer);

LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getActivity().addContentView(vFullScreen, params);
vsPlayer.getVideoView().resume();

ビデオの再生が中断されます (数秒間真っ暗になります) が、その後再開されます。

もう 1 つのあまり良くない点は、クラス VideoView のメソッド suspend() および resume() が API レベル 8 以降で使用可能であり、API レベル 7 と互換性を持たせる必要があることです。

4

2 に答える 2

1

使用しているVideoViewが黒くなり、ビューの切り替えの間に一時的に長引くという問題はありますか?

もしそうなら、私は今、しっかりした一週間、その問題の原因を解明しようとしています。私は実際の原因を理解することができませんでしたが、私の回避策はVideoViewが画面の変更を通して持続するのを防ぎます:

public void hideVideoView(){        
    runOnUiThread(new Runnable() {
        public void run() {
            findViewById(R.id.yourVideoView).setVisibility(View.INVISIBLE);
        }
    });    
}

基本的には、ビューが切り替わるたびにビューを非表示に設定しているだけで、ビューがリロードされた場合は、View.Visibleに戻すだけです。

于 2012-06-04T15:27:24.623 に答える
0

これはおそらくあなたの問題を解決しません:)しかし、VideoViewを削除する前にあなたがいる位置を探すことができます:

long progress = vsPlayer.getCurrentPosition(); 


LayoutInflater lf = getActivity().getLayoutInflater();          
vFullScreen = lf.inflate(R.layout.full_screen, myViewGroup, false);             

LinearLayout fullscreenCont = (LinearLayout)    vFullScreen.findViewById(R.id.fullscreen_container);

((ViewGroup) vsPlayer.getParent()).removeView(vsPlayer);

fullscreenCont.addView(vsPlayer);

LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getActivity().addContentView(vFullScreen, params);

vsPlayer.seekTo(progress);

私は実際に少し前に同じ問題を抱えていました..私がやったことは、VideoViewのlayoutparamsを削除する代わりにmatch_parentに変更することでした。

mVideoView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
mVideoView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
于 2012-06-04T14:58:48.657 に答える