Praktik terbaik untuk berbagi video

Banyak orang membagikan video menggunakan perangkat Android. Kualitas item baris yang diterima video sering kali lebih rendah dari aslinya karena pemrosesan yang dilakukan oleh aplikasi berbagi. Dokumen ini menjelaskan cara mengoptimalkan kualitas video bersama dan beberapa perangkap pemrosesan video umum yang harus dihindari. Untuk mengoptimalkan untuk berbagi konten video HDR, lihat Gunakan modul Transformer untuk melakukan transcoding HDR ke SDR di halaman ini.

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

Pipeline berbagi

Gambar 1 mengilustrasikan alur umum untuk berbagi video:

Pipeline berbagi video Gambar 1. Pipeline berbagi video.

Pipeline mencakup 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, memperbaiki, atau memproses video dengan cara lain.
  3. Skalakan atau ubah ukuran video sebagai persiapan untuk transcoding.
  4. Lakukan transcoding pada video untuk dibagikan. Pemfilteran di langkah 2 sering diterapkan sebagai sebagai bagian dari langkah ini.

Terdapat dua langkah dalam pipeline di mana Anda memiliki kesempatan untuk parameter yang menentukan kualitas video: encoding selama perekaman, dan transcoding video sebelum dibagikan. Selain itu, Anda mungkin perlu mengubah skala video sebelum tahap transcoding terakhir, yang juga dapat memengaruhi kualitas.

Rekomendasi

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

Parameter Rekam Bagikan
Profil Y Y
Penyelesaian Y Y
Bitrate Y Y
Parameter Kuantisasi (QP) (jarang) Y
Frame B N Y

Tabel 1. Parameter utama yang menentukan kualitas video

Profil

Untuk hasil yang lebih baik, gunakan profil lanjutan yang disediakan oleh codec. Untuk encoding AVC, pilih Profil tinggi dan tingkat 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 pengkodean yang dapat Anda gunakan di seluruh saluran. Ingat juga bahwa ekstrem pemangkasan akan menghasilkan gambar berkualitas rendah, terutama jika Anda meningkatkan kualitas gambar yang dipangkas gambar. Ikuti pedoman berikut:

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

    • Jika encoding berbagi menghasilkan resolusi 720x1280, sebaiknya Resolusi gambar 720x1280.
    • Jika langkah perantara antara menangkap dan berbagi termasuk pemangkasan, gunakan resolusi gambar yang lebih tinggi seperti 1080x1920, dan meningkatkan menangkap kecepatan bit untuk menangani piksel tambahan.
  • Pemangkasan ekstrem menghasilkan gambar berkualitas rendah, terutama jika dipangkas telah ditingkatkan kualitasnya.

  • Hindari peningkatan skala dari resolusi rendah ke resolusi yang lebih tinggi. Upaya peningkatan skala untuk membuat detail yang tidak ada. Memiliki resolusi lebih tinggi yang diinginkan dari 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, membawa gambar video melalui pipeline berbagi yang pada akhirnya melakukan transcoding ke kecepatan bit rendah menghasilkan gambar dengan kualitas yang lebih rendah daripada memulai dengan resolusi yang lebih rendah. Sebagai kecepatan bit menurun, ada titik crossover di mana resolusi yang lebih kecil dimulai untuk memberikan hasil yang lebih baik:

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

Tabel 2. Kecepatan bit versus Resolusi

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

Bitrate

Merekam

Penggunaan kecepatan bit encoding yang lebih tinggi memberikan peningkatan terbesar pada kualitas video {i>sandwich<i} itu. Sebaiknya pilih kecepatan bit yang cocok dengan aplikasi kamera native. Untuk Resolusi 720x1280, kami menyarankan kecepatan bit tangkapan 10 Mbps.

Karena pengkodean tangkapan dilakukan di perangkat, Anda dapat menggunakan kecepatan bit yang lebih tinggi untuk mengompensasi sebagian besar transformasi langkah berbagi dengan sedikit hal negatif tersebut. File yang dihasilkan berukuran 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 paling besar pada waktu berbagi, karena langsung berhubungan dengan ukuran video yang akan diupload. Ada imbal balik antara video kualitas, waktu transmisi file, dan biaya penyimpanan {i>cloud<i}.

Pilihan profil encoding, bingkai B, dan nilai pembatas QP juga lebih pada tahap ini dibandingkan selama pengambilan gambar.

Kami menyarankan kecepatan bit antara 4-5 Mbps (untuk resolusi 720x1280) untuk memastikan kualitas visual yang baik.

Parameter Kuantisasi (QP)

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

Merekam

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

Sebaiknya jangan menyesuaikan setelan QP untuk kecepatan bit 10 Mbps (untuk 720x1280). Jika kecepatan bit penangkapan jauh lebih rendah, di bawah 5 Mbps untuk 720x1280, pengaturan QP 40 adalah kompromi yang baik antara peningkatan kualitas tanpa memaksa codec untuk terlalu melebihkan kecepatan bit target.

Berbagi

Kami merekomendasikan batas QP maksimum 40, terutama jika kecepatan bit di bawah 4 Mbps. Meskipun hal ini memastikan kualitas minimum untuk video yang dienkode, hal ini dapat menghasilkan hasil dengan kecepatan bit yang lebih tinggi. Peningkatan kecepatan bit bergantung pada video yang lebih kompleks. Meskipun aplikasi berbagi mungkin menoleransi beberapa varian dalam kecepatan bit video yang dihasilkan, kecepatan bit mungkin tidak menoleransi peningkatan ambang batas tertentu.

Anda dapat membatasi peningkatan kecepatan bit dengan mengenkode ulang video untuk dibagikan dengan yang tidak begitu ketat (lebih tinggi) yang terikat dengannya. Cara ini memberi {i>codec <i}lebih banyak kebebasan untuk mengorbankan kualitas dan mempertahankan bagian lain dari video. Anda dapat mengenkode ulang video untuk dibagikan, karena ini adalah operasi transcoding; kamu sudah merekam video yang ingin Anda bagikan.

Kelemahannya adalah mengulangi langkah transcoding dengan meningkatkan waktu yang dibutuhkan untuk berbagi video. Salah satu cara untuk mengurangi latensi ini adalah melihat video yang di-transcoding sebagian untuk memutuskan apakah video dalam toleransi terhadap kelebihan kecepatan bit. Jika tidak, Anda dapat menghentikan {i>transcoding <i}dan coba lagi dengan parameter QP yang lebih sesuai.

Frame B dan profil encoding

Pertimbangkan untuk menggunakan bingkai B hanya selama langkah berbagi, dan hanya saat menjalankan Android 10 atau yang lebih baru.

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

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

Android 10

API 29 atau yang lebih tinggi

Gunakan profil tertinggi yang didukung dan tetapkan parameter B-frame 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. Ini mengakomodasi beberapa batasan dalam MediaMuxer dalam versi sistem ini

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

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

Jika aplikasi Anda tidak menggunakan MediaMuxer untuk menyusun file output akhir, Anda dapat aktifkan frame B dengan menyetel nilai KEY_LATENCY ke 2, bukan 1. Seharusnya memungkinkan codec untuk menghasilkan {i>frame<i} B.

Android 7.1 dan yang lebih lama

API 25 dan yang lebih lama

Gunakan profil dasar pengukuran untuk mendapatkan hasil yang paling aman.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Sebelum versi 7, AOSP Android hanya mendukung profil dasar pengukuran. Namun, kemungkinan 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 tinggi saat codec mendukungnya. Tidak ada kunci format publik untuk mengontrol jumlah B- {i>frame<i}.

Menggunakan modul Transformer untuk melakukan transcoding HDR ke SDR

Mulai Android 13 (level API 33), sebaiknya gunakan aplikasi Jetpack Media3 Transformator modul ini untuk berbagi konten HDR ke aplikasi, layanan, dan perangkat yang tidak mendukung HDR. Modul Transformer bekerja dengan pemetaan nada sebuah memasukkan streaming video HDR ke SDR dan menyimpan hasilnya sebagai MP4, yang memungkinkan pemutaran berhasil tanpa kehilangan detail atau kecerahan gambar.

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

Kode berikut menyiapkan sebuah Transformer yang nada memetakan input ke SDR dan mengenkode ulangnya 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.