Topik ini menjelaskan masalah umum dan solusinya saat menggunakan kit pengembangan perangkat lunak (SDK) Pemutar Android.
Masalah lisensi
Untuk masalah seperti lisensi tidak valid atau kedaluwarsa, lihat FAQ Lisensi.
Masalah umum pada pemutar di berbagai client
Untuk masalah yang mungkin terjadi di client mana pun, lihat FAQ Pemutar Umum.
Jika Anda memiliki pengalaman pengembangan, Anda juga dapat mendiagnosis sendiri pengecualian pemutaran.
Masalah pengembangan
Cara mendapatkan progres pemutaran saat ini
Secara default, SDK pemutar menyediakan callback untuk progres pemutaran setiap 500 ms. Anda dapat mengubah interval callback ini. Untuk mengambil progres pemutaran lebih sering, perpendek interval tersebut. Kode berikut memberikan contohnya:
// Ubah interval callback.
PlayerConfig config = mAliyunLivePlayer.getConfig();
config.mPositionTimerIntervalMs = 100;// Interval callback dalam milidetik.
mAliyunLivePlayer.setConfig(config);
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentPosition){
// Progres pemutaran saat ini.
long currentPosition = infoBean.getExtraValue();
}
}
});Dapatkan data audio dan video sumber
Untuk mengambil data audio dan video mentah, alihkan ke decoding software dan putar video yang tidak dienkripsi. Kode berikut memberikan contohnya:
// Alihkan ke decoding software.
mAliPlayer.enableHardwareDecoder(false);
IPlayer.RenderFrameCallbackConfig renderFrameCallbackConfig = new IPlayer.RenderFrameCallbackConfig();
// Menentukan apakah hanya mengembalikan alamat data video dasar. Nilai default: true.
renderFrameCallbackConfig.mVideoDataAddr = false;
// Menentukan apakah hanya mengembalikan alamat data audio dasar. Nilai default: false.
renderFrameCallbackConfig.mAudioDataAddr = false;
mAliPlayer.setRenderFrameCallbackConfig(renderFrameCallbackConfig);
mAliPlayer.setOnRenderFrameCallback(new IPlayer.OnRenderFrameCallback() {
@Override
public boolean onRenderFrame(FrameInfo frameInfo) {
return false;
}
});Dapatkan lebar dan tinggi video
Anda dapat mengambil lebar dan tinggi video dengan salah satu dari tiga cara berikut:
Setelah instans AliPlayer menyelesaikan metode `prepare` dan memasuki status `prepared`, Anda dapat mengambil lebar dan tinggi menggunakan metode berikut:
mAliyunPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { mAliyunPlayer.getVideoWidth(); mAliyunPlayer.getVideoHeight(); } });Dengarkan callback perubahan ukuran video:
mAliyunPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(int width, int height) { } });Anda dapat memperolehnya menggunakan metode track:
mAliyunPlayer.setOnTrackReadyListener(new IPlayer.OnTrackReadyListener() { @Override public void onTrackReady(MediaInfo mediaInfo) { List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); for (TrackInfo trackInfo : trackInfos) { if(trackInfo.getType() == TrackInfo.Type.TYPE_VIDEO){ trackInfo.getVideoWidth(); trackInfo.getVideoHeight(); } } } });
Cara mendapatkan piksel setiap frame video di pemutar
Untuk pemutar Android, Anda dapat mengambil piksel dengan mendengarkan callback OnRenderFrameCallback.
player.setOnRenderFrameCallback(frameInfo -> {
if (frameInfo.frameType == FrameInfo.FrameType_video) {
// Data video
} else {
// Data audio
}
return false;
});Logika switching bitrate otomatis
Saat Anda mengaktifkan switching bitrate otomatis dengan memanggil antarmuka mAliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX), SDK pemutar menghitung kecepatan jaringan saat ini. Jika kecepatan jaringan dapat mendukung level bitrate berikutnya selama 10 detik, pemutar akan beralih ke bitrate tersebut. Jika tidak, pemutar tidak beralih.
Saat beralih dari bitrate tinggi ke bitrate rendah, jika kecepatan jaringan mencapai level bitrate berikutnya dalam waktu 10 detik, pemutar menyelesaikan pemutaran konten bitrate tinggi yang telah dicache sebelum beralih.
Saat beralih dari bitrate rendah ke bitrate tinggi, pemutar beralih secara langsung. Peralihan terjadi jika kecepatan jaringan meningkat ke level bitrate berikutnya selama 10 detik.
Untuk mengaktifkan switching bitrate otomatis, Anda harus terlebih dahulu melakukan transkoding video menjadi aliran bitrate adaptif di Konsol. Kemudian, tentukan bahwa pemutar mengambil aliran bitrate adaptif tersebut. Kode berikut menunjukkan contoh penggunaan metode pemutaran VidAuth:
VidAuth vidAuth = new VidAuth();
List<Definition> list = new ArrayList<>();
list.add(Definition.DEFINITION_AUTO);
vidAuth.setDefinition(list);Logika retry kustom
Dalam skenario retry jaringan, SDK pemutar secara default mencoba ulang dua kali, dengan timeout jaringan 15 detik untuk setiap percobaan. Jika kedua percobaan gagal, callback `Error` dipicu.
Anda dapat menyesuaikan logika retry. Saat retry dipicu, event retry dikirim ke layanan eksternal yang menentukan logika retry spesifik. Kode berikut memberikan contohnya:
PlayerConfig config = mAliPlayer.getConfig();
// 1. Atur jumlah retry. Dalam contoh ini, diatur ke 0.
config.mNetworkRetryCount = 0;
mAliPlayer.setConfig(config);
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
// 2. Dengarkan event retry.
if(infoBean.getCode() == InfoCode.NetworkRetry){
// TODO: Proses logika sesuai kebutuhan.
}
}
});Terjadi error unsupported protocol saat memutar aliran ARTC
Penyebab 1: SDK pemutar diintegrasikan, tetapi layer bridge (AlivcArtc) dan komponen Real-Time Streaming (RTS) (RtsSDK) tidak diintegrasikan.
Solusi: Integrasikan komponen-komponen tersebut. Untuk informasi lebih lanjut, lihat Implementasikan penarikan aliran RTS di Android.
Penyebab 2: Versi layer bridge (AlivcArtc) tidak sesuai dengan versi pemutar.
Solusi: Layer bridge (AlivcArtc) dan pemutar harus memiliki nomor versi yang sama. Untuk informasi lebih lanjut, lihat Implementasikan penarikan aliran RTS di Android.
Penyebab 3: Komponen RTS (RtsSDK) tidak dimuat.
Solusi: Muat komponen RTS (RtsSDK) di file Application atau Activity target sesuai kebutuhan.
static {
System.loadLibrary("RtsSDK");
}Penyebab 4: Versi minSDK terlalu tinggi, sehingga layer bridge (AlivcArtc) tidak dimuat dengan benar.
// 1. Ubah minSdk
Turunkan minSdk ke 21
// 2. Muat manual library ARTC
static {
System.loadLibrary("RtsSDK");
System.loadLibrary("cicada_plugin_artcSource");
}Progress bar melompat mundur setelah operasi seek
Penyebab: Secara default, pemutar menggunakan seek tidak akurat. Setelah operasi seek, pemutar mulai memutar dari keyframe terdekat dengan titik seek.
Solusi: Alihkan ke mode seek akurat.
Cara beralih antara mode seek akurat dan tidak akurat
Kode berikut menunjukkan cara mengalihkan mode seek:
// Seek tidak akurat.
mAliPlayer.seekTo(1000);
mAliPlayer.seekTo(1000, IPlayer.SeekMode.Inaccurate);
// Seek akurat.
mAliPlayer.seekTo(1000,IPlayer.SeekMode.Accurate);Progress bar tetap melompat mundur setelah beralih ke mode seek akurat
Penyebab: Seek akurat memerlukan waktu lebih lama daripada seek tidak akurat. Jika jarak dari titik seek ke keyframe terdekat besar dan melebihi interval maksimum untuk seek akurat, SDK pemutar secara otomatis beralih ke seek tidak akurat. Hal ini menyebabkan progress bar melompat mundur.
Solusi: Anda dapat menggunakan antarmuka untuk mengatur interval maksimum untuk seek akurat. Meningkatkan interval maksimum mengurangi frekuensi peralihan dari seek akurat ke tidak akurat, sehingga meningkatkan akurasi seek. Namun, interval yang lebih panjang berarti operasi seek akan memakan waktu lebih lama jika titik seek jauh dari keyframe. Anda harus mengatur interval maksimum yang wajar untuk seek akurat berdasarkan kebutuhan bisnis Anda. Kode berikut memberikan contohnya:
// Satuan: ms.
mAliPlayer.setMaxAccurateSeekDelta(10000);Cache lokal: Apakah direktori cache dapat diatur ke direktori penyimpanan internal?
Ya, bisa. Anda dapat mengubah direktori penyimpanan eksternal perangkat Android ke direktori penyimpanan internal. Namun, Anda harus memastikan memiliki izin akses ke direktori penyimpanan internal agar caching berfungsi dengan benar.
Terjadi error `encrypt check fail` saat caching video
Caching mirip dengan pengunduhan. Jika unduhan aman diaktifkan, Anda harus memastikan bahwa file verifikasi enkripsi sesuai dengan informasi aplikasi Anda. Anda perlu mengunduh file verifikasi enkripsi yang dihasilkan di Unduhan offline dan menyimpannya ke SDK pemutar. Untuk informasi lebih lanjut, lihat Unduhan video. Jika tidak, caching atau pengunduhan akan gagal.
Masalah pemutaran
Terjadi crash saat membuat pemutar
Diagnosis masalah sebagai berikut:
Periksa apakah arsitektur CPU adalah x86.
SDK pemutar hanya mendukung arsitektur arm64-v8a dan armeabi-v7a. SDK tidak mendukung arsitektur x86.
Periksa apakah file .so dan dependensi Maven untuk SDK pemutar diintegrasikan dalam proyek.
Contohnya, Anda mungkin telah mengintegrasikan SDK pemutar menggunakan dependensi Maven di `build.gradle` dan juga mengintegrasikan library dinamis terkait pemutar di direktori `libs` modul proyek.
Solusi yang direkomendasikan: Jika Anda menggunakan kedua metode tersebut, hapus library dinamis dan gunakan hanya dependensi Maven. Jika Anda harus mengintegrasikan library dinamis, pastikan semua file .so terkait SDK pemutar berasal dari versi yang sama. Untuk informasi tentang cara mengintegrasikan SDK pemutar dan mendapatkan library dinamis, lihat Integrasikan SDK. Gambar berikut menunjukkan library dinamis terkait pemutar:

Jika Anda mengintegrasikan paket parsial, konfirmasi bahwa dependensi versi AlivcFFmpeg benar.
Untuk informasi tentang dependensi versi AlivcFFmpeg, lihat Dependensi versi AlivcFFmpeg.
Terjadi crash saat pemutar sedang berjalan
Diagnosis masalah sebagai berikut:
Konfirmasi apakah crash terjadi di SDK pemutar.
Periksa adanya stack crash dengan awalan
AliyunPlayer. Jika ada stack dengan awalan ini, masalahnya berada di SDK pemutar.Upgrade ke versi terbaru SDK pemutar dan verifikasi apakah masalah telah diperbaiki.
Jika masalah tetap ada, siapkan file crash terkait (termasuk semua thread), log crash, dan informasi skenario crash. Untuk informasi lebih lanjut, lihat Cara mengambil log masalah.
Muncul bilah hitam saat pemutaran video
Diagnosis masalah sebagai berikut:
Periksa apakah video sumber itu sendiri memiliki bilah hitam.
Anda dapat menyesuaikan mode penskalaan pemutar menggunakan antarmuka berikut.
/* SCALE_ASPECT_FILL: Mengisi layar secara proporsional. Video dipotong. SCALE_ASPECT_FIT: Menskalakan video secara proporsional. Bilah hitam mungkin muncul. SCALE_TO_FILL: Mengisi layar tanpa mempertahankan proporsi. Video terdistorsi. */ mAliPlayer.setScaleMode();Jika mode penskalaan tidak memenuhi kebutuhan Anda, Anda dapat menyesuaikan ukuran SurfaceView atau TextureView di lapisan aplikasi.
Audio diputar tetapi tidak ada video yang muncul
Diagnosis masalah sebagai berikut:
Mainkan video dengan pemutar lain untuk memeriksa apakah file tersebut hanya berisi audio.
Konfirmasi bahwa view yang merender video dikonfigurasi dengan benar. Misalnya, periksa apakah view tampilan telah diatur untuk pemutar atau telah dihapus dari antarmuka pemutaran. Untuk petunjuk mengatur view tampilan, lihat Langkah 4 di Fitur dasar.
Terjadi error `Invalid argument` saat memutar video lokal dengan izin baca
Jika terjadi error `Invalid argument` saat Anda memutar video lokal yang memiliki izin baca, periksa nama file dan jalur mutlaknya. Hindari menggunakan kombinasi karakter Tionghoa dan spasi dalam jalur tersebut.
Terjadi error `Permission denied` saat memutar video lokal dengan izin baca
Untuk menggunakan izin penyimpanan dengan benar pada perangkat yang menjalankan Android 10 (Android Q) atau versi lebih baru, Anda harus menambahkan android:requestLegacyExternalStorage="true" ke tag application di AndroidManifest.xml. Hal ini diperlukan karena versi Android tersebut memperkenalkan fitur scoped storage.
Kadang-kadang terjadi error `Redirect to a url` saat pemutaran video
Error ini dapat terjadi karena sumber video yang sedang diputar dibajak. Kami menyarankan agar Anda mengaktifkan fitur HTTPDNS pemutar untuk mengatasi masalah ini. Untuk informasi lebih lanjut, lihat Konfigurasikan HTTPDNS untuk Android.
Bilah notifikasi hitam berkedip pada layar berlekuk saat pemutaran layar penuh
Anda dapat mengatasinya dengan mengatur status bar imersif.
Gagal memutar video MOV
SDK pemutar Android mendukung video format MOV. Jika pemutaran video MOV gagal, kemungkinan karena atom moov (indeks data audio dan video) terletak setelah atom mdat (data audio dan video) dalam video sumber. Anda dapat mengatasi masalah ini dengan melakukan transkoding video sumber untuk memindahkan atom moov sebelum atom mdat. Untuk informasi lebih lanjut, lihat Langkah 2: Diagnosa aliran.
Terjadi error saat inisialisasi atau pemutaran, menunjukkan bahwa library dinamis .so SDK pemutar tidak ditemukan
Diagnosis masalah sebagai berikut:
Periksa apakah arsitektur CPU memenuhi persyaratan.
SDK pemutar hanya mendukung library dinamis untuk arsitektur arm64-v8a dan armeabi-v7a.
Periksa apakah versi SDK pemutar terlalu lama.
Jika Anda menggunakan SDK pemutar V5.4.6.0-full atau versi sebelumnya, kami menyarankan agar Anda upgrade ke V5.4.6.0-full-15467853 atau versi yang lebih baru. Untuk versi terbaru dan historis SDK pemutar, lihat Catatan rilis SDK Android.
Terjadi error saat menggunakan AliListPlayer untuk memutar video HLS (m3u8)
Versi SDK pemutar sebelum V5.4.5.0 tidak mendukung penggunaan pemutar daftar AliListPlayer untuk memutar video HLS (m3u8). Mulai dari V5.4.5.0, video HLS (m3u8) didukung. Namun, Anda harus mengaktifkan caching lokal. Untuk informasi tentang cara mengaktifkan caching lokal, lihat Cache lokal.
Apakah SDK pemutar Android mendukung pemutaran video dari folder assets dan raw dalam proyek Android?
Tidak, tidak mendukung. Anda perlu menyalin video ke penyimpanan ponsel, lalu menggunakan jalur mutlak untuk memutar video tersebut.
Terjadi error 403 dan pemutaran gagal setelah mengonfigurasi caching lokal untuk aliran video HLS
Gejala: Saat Anda memutar aliran video HLS (M3U8) menggunakan metode pemutaran VidAuth dengan caching lokal diaktifkan, pemutaran gagal dan dilaporkan error 403.
Penyebab: Setelah caching lokal diaktifkan, jika Anda keluar dari pemutaran sebelum video sepenuhnya dicache, bagian yang belum dicache diminta menggunakan informasi VidAuth yang kedaluwarsa dari sesi sebelumnya saat Anda memulai pemutaran berikutnya. Hal ini menyebabkan kegagalan autentikasi dan error 403.
Solusi: Untuk SDK pemutar V5.5.4.0 dan versi lebih baru, jika URL pemutaran video berisi parameter autentikasi dan protokol pemutaran adalah HLS, Anda dapat mengatur bidang PlayerConfig.mEnableStrictAuthMode untuk memilih mode autentikasi yang berbeda. Nilai default adalah `false`.
Autenikasi non-ketat (false): Autentikasi juga dicache. Jika hanya sebagian media yang dicache terakhir kali, pemutar menggunakan autentikasi yang dicache untuk membuat permintaan saat memutar bagian yang tidak dicache berikutnya. Jika periode validitas autentikasi URL sangat singkat, hal ini menyebabkan pengecualian pemutaran.
Autenikasi ketat (true): Autentikasi tidak dicache. Autentikasi dilakukan setiap kali pemutaran dimulai. Hal ini menyebabkan pemutaran gagal tanpa koneksi jaringan.
Apakah SDK pemutar Android mendukung play-while-downloading?
Tidak, tidak mendukung. SDK pemutar Android mendukung caching dan pengunduhan file video selama pemutaran saat Anda mengaktifkan fitur cache lokal. Saat Anda memutar video berikutnya, file yang dicache diputar langsung. SDK saat ini tidak mendukung pemutaran file video yang dicache secara lokal yang telah dipindahkan dari direktori file aslinya.
Apakah SDK pemutar Android mendukung pengambilan kecepatan buffering video?
Ya, mendukung. SDK pemutar Android mendukung pengambilan kecepatan buffering, laju frame rendering real-time, bitrate audio dan video, serta bitrate unduhan jaringan. Untuk informasi lebih lanjut, lihat Dapatkan informasi pemutaran.
Pemutaran video HDR tidak normal
SDK pemutar Android saat ini tidak mendukung video HDR yang memiliki sudut rotasi. Error pemutaran dapat terjadi untuk jenis video ini.
Jika video ditranskode menjadi beberapa definisi, definisi mana yang diputar oleh SDK pemutar secara default?
Urutan pemutaran default untuk definisi video adalah: FD, LD, SD, HD, 2K, 4K, OD. Untuk informasi lebih lanjut tentang definisi ini, lihat Definisi. SDK pemutar mencari definisi dalam urutan ini dan memutar video dalam definisi pertama yang tersedia.
Cara menentukan definisi pemutaran default
Kode berikut memberikan contohnya:
// Metode pemutaran VidSts digunakan sebagai contoh.
VidSts vidSts = new VidSts();
// Kode untuk mengatur parameter seperti vid, AccessKeyId, AccessKeySecret, dan token dihilangkan. Untuk informasi lebih lanjut, lihat pengaturan pembuatan pemutar di topik Fitur Dasar.
/*
Parameter 1: Definisi pemutaran yang diinginkan. Nilai yang valid: FD, LD, SD, HD, 2K, 4K, dan OD.
Parameter 2: Menentukan apakah akan memaksakan pemutaran definisi yang diinginkan. false: Tidak memaksakan pemutaran definisi yang diinginkan. SDK pemutar mencari definisi untuk diputar berdasarkan urutan default. true: Memaksakan pemutaran definisi yang diinginkan. Jika definisi yang diinginkan tidak ditemukan, video tidak diputar.
*/
vidSts.setQuality("",false);Jika suatu definisi memiliki beberapa aliran, aliran mana yang diputar oleh SDK pemutar?
Jika suatu definisi memiliki beberapa aliran, SDK pemutar memutar aliran terbaru.
Masalah lainnya
Cara memutar video tanpa watermark tetapi mengunduhnya dengan watermark
Transkodekan video ke beberapa definisi. Putar versi tanpa watermark dan unduh versi dengan watermark.
Cara mendapatkan log masalah
Saat Anda meminta dukungan teknis dari Alibaba Cloud, Anda dapat mengirimkan log masalah Anda untuk membantu kami menyelesaikan masalah Anda lebih efisien. Anda dapat mengambil log masalah sebagai berikut:
Ambil log masalah.
Kami menyarankan Anda menyetel tingkat log ke
AF_LOG_LEVEL_TRACEsebelum Anda mengambil log masalah. Untuk informasi selengkapnya, lihat Dapatkan log SDK.Berikan log yang dihasilkan kepada dukungan teknis Alibaba Cloud.