วิดีโอวนซ้ำอย่างราบรื่นด้วย VideoView


88

ฉันมีรหัสต่อไปนี้เพื่อใช้วิดีโอเป็นแหล่งข้อมูลดิบเริ่มวิดีโอและวนซ้ำ แต่ฉันต้องการให้วิดีโอวนซ้ำอย่างราบรื่น ณ ตอนนี้เมื่อมันมาถึงจุดสิ้นสุดของคลิปและเริ่มคลิปอีกครั้งการเปลี่ยนระหว่างสาเหตุ a สั่นไหวเพียงเสี้ยววินาทีซึ่งฉันไม่มีแอพของฉันจริงๆ

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;<--- เขียนสิ่งนี้ในนอก method หรือประกาศเป็นตัวแปรสุดท้าย

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

ยังคง rebuffer ทุกลูปมันไม่ราบรื่นเหมือนวิธีก่อนสำหรับฉัน
Pencilcheck

@Pencilcheck นี่เป็นการวนลูปง่ายๆสำหรับวิดีโอในเครื่องหากคุณต้องการใช้เป็น url และบัฟเฟอร์คุณต้องใช้ตรรกะอื่น ๆ
PravinDodia

FYI สำหรับทุกคนสิ่งนี้ใช้ไม่ได้กับวิดีโอท้องถิ่นเช่นกัน หากคุณเล่นวิดีโอที่มีเสียงคงที่คุณจะได้ยินเสียงหยุดชั่วคราวระหว่างลูป
Edison

1
@PravinDodia ใช้งานได้กับวิดีโอ mp4 (ไฟล์) แต่ไม่ทำงานกับ m3u8 โปรดแนะนำวิธีแก้ปัญหาให้ฉันหากคุณมีความคิดเกี่ยวกับไฟล์ m3u8
Maroti

2
@PravinDodia ขอบคุณสำหรับข้อมูล ใช่ฉันใช้สตรีมวิดีโอแล้ว ฉันใช้ vv.start () ใน MediaPlayer OnCompletionListener () แทนการวนซ้ำ
Maroti

7

ไม่แน่ใจว่าจะช่วยได้หลายปีต่อมาหรือไม่ แต่ฉันใช้

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

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

และมีห่วงที่ไร้รอยต่อ


5

การหยุดชั่วคราวมีไว้สำหรับการMediaPlayerรีเฟรชบัฟเฟอร์ ระยะเวลาที่ใช้จะขึ้นอยู่กับปัจจัยหลายประการซึ่งหลายปัจจัยอยู่นอกเหนือการควบคุมของคุณ (เช่นความเร็วของ CPU ความเร็วของแฟลชจัดเก็บข้อมูลในตัว

สิ่งที่คุณสามารถควบคุมได้คือนำวิดีโอของคุณออกจากแหล่งข้อมูลและเข้าสู่ระบบไฟล์ ทรัพยากรจะถูกเก็บไว้ใน APK ซึ่งเป็นไฟล์ ZIP ดังนั้นการแยกวิดีโอด้วยวิธีนี้อาจใช้เวลาเพิ่มขึ้น

คุณอาจต้องเปลี่ยนจากVideoViewและใช้ a SurfaceViewกับสองMediaPlayersสลับกัน - อันหนึ่งกำลังเล่นในขณะที่กำลังเตรียมการต่อไปดังนั้นเมื่อการเล่นจบลงคุณสามารถเปลี่ยนไปใช้เครื่องเล่นใหม่ ฉันไม่ได้ลองสิ่งนี้ดังนั้นฉันจึงไม่รู้ว่าการแบ่งส่วนอาจเป็นอย่างไร อย่างไรก็ตามฉันรู้ว่าเทคนิคนี้มักใช้ในการเล่นเสียงเพื่อเปลี่ยนจากคลิปหนึ่งไปยังอีกคลิปหนึ่ง


ถ้าฉันจำไม่ผิด MediaPlayers จะใช้ surfaceViews เมื่อเตรียมการดังนั้นคุณจึงไม่สามารถเตรียม MediaPlayer อื่นได้ในขณะที่กำลังใช้งานอยู่
Edison


1

สายเล็กน้อย แต่มีเหตุผลใดที่คุณไม่สามารถใช้สิ่งต่อไปนี้ได้?

MediaPlayer.setLooping(true);

1
นี่เป็นเวลานานมาแล้ว แต่ด้วยเหตุนี้ฉันจึงคิดว่ามีการหยุดชั่วคราวที่เห็นได้ชัดในวิดีโอเมื่อมีการเรียกวนรอบ
SamRowley

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");
                }
            });

ใช้แบบฟอร์มสั้น Arrow Expression

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.