VideoViewによるシームレスなビデオループ


88

ビデオを生のリソースとして取得し、ビデオを開始してループする次のコードがありますが、クリップの終わりになり、クリップを再開するときに、ビデオをシームレスにループする必要があります。ほんの一瞬ちらつきますが、これは私のアプリでは本当にあり得ません。

public class Example extends Activity {
    VideoView vv;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        vv = (VideoView)findViewById(R.id.VideoView01);

        //Video Loop
        vv.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
                vv.start(); //need to make transition seamless.
            }
        });

        Uri uri = Uri.parse("android.resource://com.example/"
                + R.raw.video);

        vv.setVideoURI(uri);
        vv.requestFocus();    
        vv.start();
    }
}

クリップの長さはわずか22秒ですが、シームレスに作成されているため、遅延なく作業できます。

回答:


230

これを試してみてください100%動作します


VideoView videoView;<---これをメソッドの外部に書き込むか、最終変数として宣言します。

videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});

それでもすべてのループに対して再バッファリングしますが、以前の方法ほどスムーズではありません
Pencilcheck 2013

@Pencilcheckこれはローカルビデオの単純なループです。URLとバッファリングに使用する場合は、他のロジックを実装する必要があります。
PravinDodia 2014年

参考までに、これはローカルビデオでも機能しません。一定の音でビデオを再生すると、ループ間の一時停止が聞こえます。
エジソン

1
@PravinDodia mp4ビデオ(ファイル)では機能しますが、m3u8では機能しません。m3u8ファイルについて何かアイデアがあれば、私に解決策を提案してください。
マロティ2015

2
@PravinDodia情報をありがとう。はい、ストリームビデオを使用しました。ループする代わりに、MediaPlayer.OnCompletionListener()でvv.start()を使用しました。
マロティ2015

7

これが数年後に役立つかどうかはわかりませんが、私は使用しました

vv.start();
vv.setOnCompletionListener ( new MediaPlayer.OnCompletionListener() {

 @Override 
  public void onCompletion(MediaPlayer mediaPlayer) {   
    vv.start();
  }
});

そしてそれはシームレスなループを持っています


5

一時停止は、基になるMediaPlayerバッファを更新するためのものです。所要時間は多くの要因によって異なりますが、その多くは制御できません(CPUの速度、オンボードフラッシュストレージの速度など)。

制御できるのは、ビデオをリソースからファイルシステムに取り込むことです。リソースはZIPファイルであるAPKに保存されるため、この方法でビデオを抽出するには、おそらく余分な時間がかかります。

を切り替えて、2つを交互にVideoView使用する必要がある場合があります。1つは再生中、もう1つは準備中なので、再生が終了したら、新しいプレーヤーに切り替えることができます。私はこれを試したことがないので、どのような影響があるのか​​わかりません。ただし、この手法は、オーディオ再生で1つのクリップから別のクリップに移行するために頻繁に使用されることを知っています。SurfaceViewMediaPlayers


私の記憶が正しければ、MediaPlayerは準備するときにsurfaceViewsを保持するため、使用中に別のmediaPlayerを準備することはできません。
エジソン

2

Kotlinでは単に使用します

videoView.setOnPreparedListener { mp -> mp.isLooping = true }

1

少し遅れましたが、以下が使えない理由はありますか?

MediaPlayer.setLooping(true);

1
これはかなり前のことですが、ループアラウンドが呼び出されたときにビデオに顕著な一時停止があったと思います。
SamRowley 2011

1

Kotlinを使用している場合

 videoView.setOnPreparedListener(object : MediaPlayer.OnPreparedListener {
                override fun onPrepared(mp: MediaPlayer?) {
                    //Start Playback
                    videoView.start()
                    //Loop Video
                    mp!!.isLooping = true;
                    Log.i(TAG, "Video Started");
                }
            });

矢印式の短縮形の使用

videoView.setOnPreparedListener { mp ->
            //Start Playback
            videoView.start()
            //Loop Video
            mp!!.isLooping = true;
            Log.i(TAG, "Video Started");
        };

0

これに対する答えは、ビデオからオーディオを削除し、それを.oggシームレスにループできるファイルに変換してから、オーディオなしのビデオを使用してループすることです。これは機能します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.