Advertisement
  1. Code
  2. Android SDK

Membuat Sebuah Penglihat Video 360 Android Cardboard

Scroll to top
Read Time: 8 min

Indonesian (Bahasa Indonesia) translation by Husain Ali Yahya (you can also view the original English article)

Augmented dan virutal reality, walaupun masih baru, telah menjadi populoer untuk aplikasi, termasuk bermain game dan edukasi. Sebelumnya, saya menunjukkanmu cara memasang Cardboard menggunakan Android SDK dan cara membuat penglihat gambar panorama. Posting ini akan menunjukkanmu cara menggunakan video 360 derajat di dalam aplikasimu.

Image of beach scene with Google CardboardImage of beach scene with Google CardboardImage of beach scene with Google Cardboard

Persiapan

Sebelum kamu membuat aplikasi penglihat video, kamu akan butuh mengklon Cardboard Android SDK ke komputermu melalui Git. Kamu bisa menemukan petunjuknya di seri artikel sebelumnya.

Untuk contoh kami, buat sebuah proyek Android dengan API 19 (KitKat) sebagai minimalnya dan gunakan template Empty Activity.

Ketika proyek dasar terlah dibuat, kamu perlu mengkopi folder common, commonwidget, dan videowidget dari Cardboard SDK ke akar dari proyekmu. Ketika direktori tersebut sudah dipindahkan, kamu akan perlu menambahkan modul ke dalam proyek dengan mengedit settings.gradle untuk tampak seperti berikut.

1
include ':app', ":common", "commonwidget", "videowidget"

Akhirnya, masukkan pustaka yang dibutuhkan di proyekmu dengan menambahkan baris berikut ke app module build.gradle di bawah node dependencies.

1
dependencies {
2
    compile 'com.android.support:appcompat-v7:25.0.0'
3
4
    compile project(':common')
5
    compile project(':commonwidget')
6
    compile project(':videowidget')
7
8
    compile 'com.google.android.exoplayer:exoplayer:r1.5.10'
9
    compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
10
}

Kamu akan menyadarı bahwa kıta menambahkan Pustaka Protocol Buffers darı Google yang membantu mengatur resource runtıme dan Exoplayer yang merupakan pustaka pemutar vıdeo buatan Google yang menggunakan komponen VrVıdeoVıew. Kedua pustaka dıbutuhkan oleh Cardboard SDK agar bısa berfungsıö kamu mungkın akan menyadarı ExoPlayer yang dıgunakan versı pertama bukan kedua. Jadı akan menımbulkan konflık jıka kamu menggunakan ExoPlayer V2 di proyekmu.

Lalu, kita akan memperbaharui berkas activity_main.xml untuk proyek sampel untuk memasukkan sebuah VrVideoView, Seekbar, dan Button yang akan dikerjakan nanti.

1
<?xml version="1.0" encoding="utf-8"?>
2
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
    android:layout_width="match_parent"
4
    android:layout_height="match_parent"
5
    android:orientation="vertical">
6
7
    <com.google.vr.sdk.widgets.video.VrVideoView
8
        android:id="@+id/video_view"
9
        android:layout_width="match_parent"
10
        android:layout_height="250dp"/>
11
12
    <SeekBar
13
        android:id="@+id/seek_bar"
14
        android:layout_height="32dp"
15
        android:layout_width="match_parent"
16
        style="?android:attr/progressBarStyleHorizontal"/>
17
18
    <Button
19
        android:id="@+id/btn_volume"
20
        android:layout_width="wrap_content"
21
        android:layout_height="wrap_content"
22
        android:text="Volume Toggle"/>
23
24
</LinearLayout>

Ketika kamu telah selesai mempersiapkan pustaka Cardboar dan memiliki layout yang akan digunakan, ini adalah waktunya untuk kode Java.

Bekerja dengan Cardboard dan VR Video

Sebelum kita mulai menulis semua kode yang mengatur keadaan pemutar, posisi, dan memuat video 360 derajat, kita perlu menentukan sumber dari video. Untuk tutorial ini, kita akan membuat folder assets di bawah direktori utama, dan meletakkan video 360 derajat di sana. Sementara ada beberapa sumber video 360 derajat online, saya telah menambahkan sebuah video umum dari Sea World tentang kura-kura laut yang ditemani proyek GitHub untuk tutorial ini.

Menginisialisasi dan Struktur

Sekarang kamu telah memiliki berkas video untuk diputar, bukan class MainActivity.

Pertama kamu perlu menyatakan dan menginisialisasi item View yang didefinisikan berkas layout, nilai boolean akan menjaga dari keadaan muted dan play/pause. Sebagai tambahan, kita akan meletakkan OnClickListener di objek volume Button.

1
public class MainActivity extends AppCompatActivity {
2
3
    private VrVideoView mVrVideoView;
4
    private SeekBar mSeekBar;
5
    private Button mVolumeButton;
6
    
7
    private boolean mIsPaused;
8
    private boolean mIsMuted;
9
10
    @Override
11
    protected void onCreate(Bundle savedInstanceState) {
12
        super.onCreate(savedInstanceState);
13
        setContentView(R.layout.activity_main);
14
15
        initViews();
16
17
    }
18
19
    private void initViews() {
20
        mVrVideoView = (VrVideoView) findViewById(R.id.video_view);
21
        mSeekBar = (SeekBar) findViewById(R.id.seek_bar);
22
        mVolumeButton = (Button) findViewById(R.id.btn_volume);
23
24
        mVolumeButton.setOnClickListener(new View.OnClickListener() {
25
            @Override
26
            public void onClick(View view) {
27
                onVolumeToggleClicked();
28
            }
29
        });
30
    }
31
32
    public void playPause() {
33
34
    }
35
36
    public void onVolumeToggleClicked() {
37
38
    }
39
}

Selanjutnya, buat sebuah class yang meng-extend VrVideoEventListener. Class ini akan memiliki 5 metode berbeda yang bisa diimplementasikan ke penglihat video sederhana kita.

1
private class ActivityEventListener extends VrVideoEventListener {
2
    @Override
3
    public void onLoadSuccess() {
4
        super.onLoadSuccess();
5
    }
6
7
    @Override
8
    public void onLoadError(String errorMessage) {
9
        super.onLoadError(errorMessage);
10
    }
11
12
    @Override
13
    public void onClick() {
14
        super.onClick();
15
    }
16
17
    @Override
18
    public void onNewFrame() {
19
        super.onNewFrame();
20
    }
21
22
    @Override
23
    public void onCompletion() {
24
        super.onCompletion();
25
    }
26
}

Kamu juga perlu mengimplementasikan SeekBar.OnSeekBarChangeListener di class-mu dan membuat metode stubs untuk interface tersebut.

1
public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
2
3
...
4
5
    public void onPlayPausePressed() {
6
7
    }
8
9
    public void onVolumeToggleClicked() {
10
11
    }
12
13
    @Override
14
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
15
16
    }
17
}

Setelah kamu membuat inner class baru dan implementasi Seekbar, asosiasikan mereka dengan VrVideoView dan Seekbar pada akhir dari initviews() yang telah didefinisikan di atas.

1
mVrVideoView.setEventListener(new ActivityEventListener());
2
mSeekBar.setOnSeekBarChangeListener(this);

Ada satu bagian persiapan yang perlu kamu perhatikan. Kamu perlu menangani lifecycle Android Activity dengan memnduku onPause(), onResume() dan onDestroy() untuk menjeda, memulai render di VrVideoView, atau mematikannya sepenuhnya. Kamu juga akan butuh melacak kondısı jeda darı metode ını.

1
@Override
2
protected void onPause() {
3
    super.onPause();
4
    mVrVideoView.pauseRendering();
5
    mIsPaused = true;
6
}
7
8
@Override
9
protected void onResume() {
10
    super.onResume();
11
    mVrVideoView.resumeRendering();
12
    mIsPaused = false;
13
}
14
15
@Override
16
protected void onDestroy() {
17
    mVrVideoView.shutdown();
18
    super.onDestroy();
19
}

Sekarang persiapan untuk panduan telah selesai, kita akan pindah ke topik yang lebih menarik: memuat video, mengatur pemutaran dan mengkostumisasi user experience.

Memulai dan Mengontrol VrVideoView

Karena memuat video 360 bisa diambil dalam hanya sekejap maupun beberapa detik, kamu ingin menghandle pemuatan video melalui tugas di latarbelakang. Mari mulai dengan sebuah AsyncTask baru yang akan membuat objek VrVideoView.Options baru, atur input untuk sesuai dengan format video ( dalam kasus ini, TYPE_MONO). lalu muat video dari direktori assets.

1
class VideoLoaderTask extends AsyncTask<Void, Void, Boolean> {
2
3
    @Override
4
    protected Boolean doInBackground(Void... voids) {
5
        try {
6
            VrVideoView.Options options = new VrVideoView.Options();
7
            options.inputType = VrVideoView.Options.TYPE_MONO;
8
            mVrVideoView.loadVideoFromAsset("seaturtle.mp4", options);
9
        } catch( IOException e ) {
10
            //Handle exception

11
        }
12
13
        return true;
14
    }
15
}

Lalu, pergi ke onCreate() dan buat sebuah instance dari tugas ini, lalu panggil execute() untuk memulainya. Sementara ada lebih banyak yang harus diselesaikan untuk menjaga task, kita hanya akan menggunakannya secara lokal dalam metode ini demi kesederhanaan dan jangan khawatir tentang AsyncTask lifecycle.

1
VideoLoaderTask mBackgroundVideoLoaderTask = new VideoLoaderTask();
2
mBackgroundVideoLoaderTask.execute();

Pada titik ini, kamu harusnya sudah bisa menjalankan aplikasimu dan menjalankan Video 360 dari pemutar video Cardboard. Sekarang ini bekerja, mari tambahkan beberapa utilitas untuk pengguna. Kembali ke objek ActivityEventListener yang telah kamu buat sebelumnya, karena kita ingin menyempurnakan beberapa metode. Ketika video telah sukses dimuat, kita akan perlu mengatur nilai maksimal dari SeekBar, karena kita ingin terus melacak keadaan play/pause dari video.

1
@Override
2
public void onLoadSuccess() {
3
    super.onLoadSuccess();
4
5
    mSeekBar.setMax((int) mVrVideoView.getDuration());
6
    mIsPaused = false;
7
}

Saat video dimulai, kita akan memperbaharui SeekBar melalui onNewFrame(), dan me-reset video ke posisi awal di onCompletion(). Terakhir, di onClick(), kita akan memacu metode play/pause.

1
@Override
2
public void onClick() {
3
    playPause();
4
}
5
6
@Override
7
public void onNewFrame() {
8
    super.onNewFrame();
9
10
    mSeekBar.setProgress((int) mVrVideoView.getCurrentPosition());
11
}
12
13
@Override
14
public void onCompletion() {
15
    //Restart the video, allowing it to loop

16
    mVrVideoView.seekTo(0);
17
}

Sementara memperbaharui Seekbar berdasarkan playback merupakan hal penting. Kita juga akan ingin untuk membiarkan pengguna merubah di mana mereka berada dengan berinteraksi dengan SeekBar. Kita bisa melakukannya dengan menggunakan interface SeekBar.OnSeekBarChangeListener yang telah kita terapkan sebelumnya.

1
@Override
2
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
3
    if( fromUser ) {
4
        mVrVideoView.seekTo(progress);
5
    }
6
}

Untuk mengakhiri kontro VrVideoView kita perlu menerapkan metode play/pause dan toggle volume.

1
public void playPause() {
2
    if( mIsPaused ) {
3
        mVrVideoView.playVideo();
4
    } else {
5
        mVrVideoView.pauseVideo();
6
    }
7
8
    mIsPaused = !mIsPaused;
9
}
10
11
public void onVolumeToggleClicked() {
12
    mIsMuted = !mIsMuted;
13
    mVrVideoView.setVolume(mIsMuted ? 0.0f : 1.0f);
14
15
}

Pada titik ini, kamu harus sudah memiliki pemutar video 360 yang interaktif dan bekerja di aplikasimu.

360 video player shown in app360 video player shown in app360 video player shown in app

Namun, jika kamu memutar perangkat, kamu mungkin menyadari bahwa perilaku tidak diinginkan dari video yang terputar kembali. Kita bisa memperbaikinya dengan onSaveInstanceState() dan onRestoreInstanceState() untuk menyimpan dan mengulang state dari VrVideoView.

1
private static final String STATE_PROGRESS = "state_progress";
2
private static final String STATE_DURATION = "state_duration";
3
4
@Override
5
protected void onSaveInstanceState(Bundle outState) {
6
    outState.putLong(STATE_PROGRESS, mVrVideoView.getCurrentPosition());
7
    outState.putLong(STATE_DURATION, mVrVideoView.getDuration());
8
9
    super.onSaveInstanceState(outState);
10
}
11
12
@Override
13
protected void onRestoreInstanceState(Bundle savedInstanceState) {
14
    super.onRestoreInstanceState(savedInstanceState);
15
16
    long progress = savedInstanceState.getLong(STATE_PROGRESS);
17
18
    mVrVideoView.seekTo(progress);
19
    mSeekBar.setMax((int) savedInstanceState.getLong(STATE_DURATION));
20
    mSeekBar.setProgress((int) progress);
21
}

Sekarang ketika perangkat dirotasi, videomu seharusnya kembali ke posisi originalnya dan pengguna bisa melanjutkan tanpa pengalaman yang terganggu.

Kesimpulan

Sementara ada beberapa detil kecil yang perlu ditangani untuk menggukan VrVideoView Cardboard SDK, bagian sulitnya, seperti playback aktual dan optimisasi, ditangani untukmu dengan komponen yang mudah untuk diterapkan.

Kamu harusnya bisa menambahkan video 360 dari aplikasi media, menyediakan mpengguna dengan fitur menarik yang memperkaya pengalaman. Di tutorial berikutnya dari seri ini, kita akan fokus pada fitur VR experience baru bernama Daydream, dan bagaimana menggunakannya dengan kontroller dan aplikasimu.

Dalam waktu luang, cek beberapa tutorial lain tentang Android virtual reality dan augmented reality!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.