Praktik terbaik untuk berbagi video

Banyak orang berbagi video menggunakan perangkat Android. Kualitas video yang diterima sering kali lebih rendah daripada video asli karena pemrosesan yang dilakukan oleh aplikasi berbagi. Dokumen ini menjelaskan cara mengoptimalkan kualitas video yang dibagikan dan beberapa kesalahan pemrosesan video umum yang harus dihindari. Untuk mengoptimalkan berbagi konten video HDR, lihat Menggunakan modul Transformer untuk melakukan transcoding HDR ke SDR di halaman ini.

Hal utama yang harus dilakukan adalah mempertahankan resolusi yang konstan dan menjaga kualitas video setinggi mungkin selama mungkin saat bersiap untuk membagikan video.

Pipeline berbagi

Gambar 1 mengilustrasikan alur umum untuk berbagi video:

Berbagi pipeline video Gambar 1. Pipeline berbagi video.

Pipeline meliputi langkah-langkah berikut:

  1. Rekam dan enkode video, mungkin dengan menambahkan efek selama perekaman. Atau, pengguna dapat melewati langkah ini dan memilih video dari penyimpanan yang direkam sebelumnya dari aplikasi lain.
  2. Mengedit, memfilter, meningkatkan kualitas, atau memproses video.
  3. Menskalakan atau mengubah ukuran video untuk persiapan transcoding.
  4. Lakukan transcoding pada video untuk dibagikan. Pemfilteran di langkah 2 sering diterapkan sebagai bagian dari langkah ini.

Ada dua langkah dalam pipeline yang memungkinkan Anda menetapkan parameter yang menentukan kualitas video: encoding selama perekaman awal, dan transcoding sebelum membagikan video. Selain itu, Anda mungkin perlu menskalakan ulang video sebelum tahap transcoding akhir, yang juga dapat memengaruhi kualitas.

Konten

Tabel 1 menunjukkan lima parameter utama untuk kualitas video, dan menunjukkan langkah-langkah yang dapat menggunakannya.

Parameter Rekam Bagikan
Profil Y Y
Resolusi Y Y
Bitrate Y Y
Parameter Kuantisasi (QP) (jarang) Y
Bingkai B N Y

Tabel 1. Parameter utama yang menentukan kualitas video

Profil

Untuk hasil yang lebih baik, gunakan profil lanjutan yang disediakan oleh codec tertentu. Untuk encoding AVC, pilih Profil tinggi dan level 4.

Resolusi, pemangkasan, dan penskalaan

Anda dapat mengubah resolusi awal video yang direkam dalam langkah penskalaan sebelum melakukan transcoding untuk berbagi, tetapi penskalaan dapat menurunkan kualitas video. Sebaiknya hindari penskalaan dan pilih resolusi untuk encoding awal yang dapat Anda gunakan di seluruh pipeline. Ingat juga bahwa pemangkasan ekstrim menghasilkan gambar berkualitas rendah, terutama jika Anda meningkatkan kualitas gambar yang dipangkas. Ikuti pedoman berikut:

  • Pilih resolusi minimal sebesar resolusi berbagi akhir.
  • Resolusi pengambilan tidak boleh melebihi resolusi berbagi kecuali semua langkah perantara dirancang untuk mendukung resolusi yang lebih besar (seperti kecepatan bit yang lebih tinggi selama pengambilan awal).

    • Jika encoding berbagi menghasilkan resolusi 720x1280, sebaiknya gunakan resolusi pengambilan 720x1280.
    • Jika langkah perantara antara pengambilan dan berbagi mencakup pemangkasan, gunakan resolusi pengambilan yang lebih tinggi, seperti 1080x1920, dan tingkatkan kecepatan bit pengambilan untuk menangani piksel tambahan.
  • Pemangkasan ekstrem akan menghasilkan gambar berkualitas rendah, terutama jika kualitas gambar yang dipangkas ditingkatkan.

  • Hindari peningkatan resolusi dari resolusi lebih rendah ke resolusi yang lebih tinggi. Peningkatan skala mencoba membuat detail yang tidak ada. Bawa resolusi lebih tinggi yang diinginkan sejak awal.

  • Jika Anda harus meningkatkannya, sesuaikan parameter encoding. Misalnya, jika resolusi yang ditingkatkan memiliki piksel dua kali lebih banyak, dua kali kecepatan bit.

Resolusi dan kecepatan bit saling terkait. Misalnya, memindahkan video beresolusi tinggi melalui pipeline berbagi yang pada akhirnya melakukan transcoding ke kecepatan bit rendah akan menghasilkan gambar berkualitas lebih rendah daripada dimulai dengan resolusi lebih rendah. Saat kecepatan bit menurun, ada titik crossover ketika resolusi yang lebih kecil mulai memberikan hasil yang lebih baik:

Bitrate Resolusi
5+ Mbps 1080x1920
1,5 - 5+ Mbps 720x1280
1,5 Mbps atau kurang setara SD. Jumlah piksel yang sama dalam rasio aspek 9:16 adalah sekitar 416x736

Tabel 2. Kecepatan bit versus Resolusi

Banyak aplikasi populer membagikan video pada resolusi 720p atau lebih rendah. Data tersebut menunjukkan bahwa resolusi 720p adalah pilihan yang tepat untuk target kecepatan bit antara 1,5 dan 5 Mbps.

Bitrate

Merekam

Menggunakan kecepatan bit encoding yang lebih tinggi akan memberikan peningkatan terbesar pada kualitas video. Sebaiknya pilih kecepatan bit yang cocok dengan aplikasi kamera native. Untuk resolusi 720x1280, sebaiknya gunakan kecepatan bit tangkapan 10 Mbps.

Karena encoding pengambilan dilakukan di perangkat, Anda dapat menggunakan kecepatan bit yang lebih tinggi untuk mengompensasi sebagian besar transformasi langkah berbagi dengan sedikit dampak negatif. Hasil file yang lebih besar hanya digunakan untuk manipulasi di perangkat.

Anda dapat mengurangi kecepatan bit pada langkah transcoding akhir, seperti yang ditunjukkan pada tabel 2.

Berbagi

Kecepatan bit memiliki dampak terbesar pada waktu berbagi, karena berhubungan langsung dengan ukuran video yang akan diupload. Ada konsekuensi antara kualitas video, waktu transmisi file, dan biaya penyimpanan {i>cloud<i}.

Pilihan profil encoding, frame B, dan nilai pembatas QP juga lebih penting pada tahap ini daripada selama pengambilan gambar.

Sebaiknya gunakan kecepatan bit antara 4–5 Mbps (untuk resolusi 720x1280) untuk memastikan kualitas visual yang baik.

Parameter Kuantisasi (QP)

Di Android 12 dan yang lebih baru, kunci QP distandardisasi dan tersedia di MediaFormat API serta di library NDK Media. Pada versi Android sebelumnya, manipulasi QP hanya tersedia melalui fungsi framework menggunakan kunci khusus vendor dalam konfigurasi MediaFormat.

Merekam

Selama perekaman video, gunakan kontrol kecepatan bit, bukan setelan QP, yang tidak selalu tersedia.

Sebaiknya jangan sesuaikan setelan QP untuk kecepatan bit tangkapan 10 Mbps (untuk 720x1280). Jika kecepatan bit pengambilan gambar lebih rendah, di bawah 5 Mbps untuk 720x1280, setelan QP sebesar 40 merupakan kompromi yang baik antara peningkatan kualitas tanpa memaksa codec terlalu sering melampaui kecepatan bit target.

Berbagi

Sebaiknya gunakan QP maksimum 40, terutama jika kecepatan bit di bawah 4 Mbps. Meskipun memastikan kualitas minimum video yang dienkode, tindakan ini dapat memberikan hasil dengan kecepatan bit yang lebih tinggi. Peningkatan kecepatan bit bergantung pada kompleksitas video. Meskipun aplikasi berbagi mungkin menoleransi beberapa varian dalam kecepatan bit video yang dihasilkan, aplikasi tersebut mungkin tidak menoleransi peningkatan di luar batas tertentu.

Anda dapat membatasi peningkatan kecepatan bit dengan mengenkode ulang video untuk berbagi dengan batas QP maksimum yang tidak terlalu ketat (lebih tinggi). Dengan demikian, codec lebih leluasa untuk mengorbankan kualitas dan mempertahankan bagian lain dari video. Anda dapat mengenkode ulang video untuk dibagikan karena ini adalah operasi transcoding; Anda telah merekam video yang ingin dibagikan.

Kelemahannya adalah mengulangi langkah transcoding dengan parameter yang berbeda ini akan meningkatkan waktu yang diperlukan untuk membagikan video. Salah satu cara untuk mengurangi latensi ini adalah dengan melihat video yang di-transcoding sebagian untuk menentukan apakah video tersebut tidak berada dalam toleransi terhadap kelebihan kecepatan bit. Jika tidak, Anda dapat menghentikan transcoding dan mencoba lagi dengan parameter QP yang lebih sesuai.

B-frame dan profil encoding

Sebaiknya gunakan frame B hanya selama langkah berbagi, dan hanya saat menjalankan Android 10 atau yang lebih tinggi.

Aplikasi harus memeriksa profil encoding yang didukung menggunakan CodecCapabilities, karena tidak semua perangkat mendukung profil utama atau profil tinggi. Gunakan profil tertinggi yang didukung oleh encoder AVC: Tinggi > Utama > Dasar Pengukuran. Untuk hasil yang paling aman, jangan mengonfigurasi B-frame (KEY_LATENCY atau KEY_MAX_B_FRAMES) saat menggunakan profil dasar pengukuran karena beberapa encoder mungkin gagal dalam konfigurasi.

Segmen kode berikut mengasumsikan 'MediaFormat format' yang akan digunakan untuk mengonfigurasi encoder AVC

Android 10

API 29 atau yang lebih tinggi

Gunakan profil tertinggi yang didukung dan tetapkan parameter frame B ke 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

Jangan setel KEY_LATENCY dalam situasi ini.

Android 8, 8.1, dan 9

API 26, 27, 28

Gunakan profil yang didukung tertinggi, tetapi nonaktifkan pembuatan bingkai B. Hal ini mengakomodasi beberapa batasan dalam MediaMuxer pada versi sistem ini

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

Nilai KEY_LATENCY melarang codec menghasilkan frame B, tetapi masih memanfaatkan efisiensi codec lainnya.

Jika aplikasi Anda tidak menggunakan MediaMuxer untuk menyusun file output akhir, Anda dapat mengaktifkan frame B dengan menetapkan nilai KEY_LATENCY ke 2, bukan 1. Hal ini akan memungkinkan codec menghasilkan frame B.

Android 7.1 dan versi yang lebih lama

API 25 dan yang lebih lama

Gunakan profil dasar pengukuran untuk hasil yang paling aman.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Sebelum versi 7, AOSP Android hanya mendukung profil baseline. Namun, mungkin OEM mengaktifkan profil utama/tinggi di beberapa perangkat, mungkin dengan menggunakan profil khusus vendor.

Jika aplikasi Anda tidak menggunakan MediaMuxer, Anda dapat menggunakan profil utama atau profil tinggi saat codec mendukungnya. Tidak ada kunci format publik untuk mengontrol jumlah frame B.

Menggunakan modul Transformer untuk melakukan transcoding HDR ke SDR

Mulai Android 13 (API level 33), sebaiknya gunakan modul Transformer Jetpack Media3 untuk membagikan konten HDR ke aplikasi, layanan, dan perangkat yang tidak mendukung HDR. Modul Transformer berfungsi dengan memetakan nada streaming video HDR input ke SDR dan menyimpan hasilnya sebagai MP4, yang memungkinkan pemutaran yang sukses tanpa kehilangan detail atau kecerahan gambar.

Catatan: Di perangkat yang menargetkan versi sistem antara Android 12 (API level 32) hingga Android 7.0 (API level 24), modul Transformer berfungsi secara berbeda. Jika perangkat mendukung HDR, aplikasi akan memutar konten tanpa pemetaan nada. Jika tidak mendukung HDR, perangkat akan menampilkan error yang menunjukkan bahwa pemetaan tone HDR tidak didukung.

Kode berikut menyiapkan Transformer dengan tone yang memetakan input ke SDR dan mengenkode ulang dalam format input (seperti H.264/AVC):

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

Untuk mencoba fungsi pemetaan nada, lihat aplikasi demo Transformer.

Anda juga dapat menyiapkan pemetaan nada menggunakan MediaCodec, meskipun penerapannya lebih kompleks. Untuk informasi selengkapnya, lihat dokumentasi referensi MediaCodec.