All Products
Search
Document Center

ApsaraVideo VOD:Praktik terbaik untuk agent

Last Updated:Aug 21, 2026

Dalam tutorial ini, Anda menggunakan AI Coding Agent untuk membangun alur kerja ApsaraVideo VOD end-to-end. Demo sisi server melakukan upload batch video berdasarkan URL, secara otomatis melakukan transkoding dengan kelompok template transkoding yang ditentukan, dan mengambil URL pemutaran melalui callback event. Demo sisi klien menyediakan aplikasi Android dengan pemutaran video tunggal dan penampil streaming langsung interaktif yang didukung oleh AUI Kits.

Prasyarat

Demo sisi server

  • Pasangan AccessKey untuk Pengguna RAM, disimpan sebagai variabel lingkungan. Jangan gunakan AccessKey akun root.

  • Python dengan Alibaba Cloud SDK untuk VOD (aliyunsdkcore dan aliyunsdkvod) telah diinstal.

  • Titik akhir HTTP yang dapat diakses publik untuk menerima callback notifikasi event.

  • Wilayah VOD diatur ke cn-shanghai (upload berbasis URL hanya didukung di wilayah China (Shanghai)).

Demo sisi klien

  • Android Studio dengan compileSdk 34 dan minSdk 21.

  • File lisensi AliPlayer (license.crt) ditempatkan di app/src/main/assets/.

  • Modul AUI Kits (AUILiveRoomCore, AUILiveRoomViewer, AUIInteraction) diimpor ke dalam proyek.

  • Titik akhir AppServer yang mengeluarkan token penonton untuk penampil streaming langsung interaktif.

Demo sisi server: Upload batch, transkoding, dan pemutaran

Kode berikut mengirimkan pekerjaan upload batch dengan kelompok template transkoding. Menentukan TemplateGroupId saat upload memicu transkoding otomatis, sehingga tidak perlu panggilan API terpisah.

request = UploadMediaByURLRequest()
request.set_UploadURLs(','.join([urllib.parse.quote(url, safe='') for url in urls]))  # URL harus diencode!
request.set_UploadMetadatas(json.dumps([{'SourceURL': urllib.parse.quote(u, safe=''), 'Title': f'Video{i}'} for i, u in enumerate(urls)]))
request.set_TemplateGroupId('your_template_group_id')  # Kunci: Tentukan ini untuk transkoding otomatis setelah upload
response = json.loads(client.do_action_with_exception(request))
# Mengembalikan daftar JobId. Lacak progres melalui notifikasi event.

Layanan callback HTTP (logika kunci): Segera mengembalikan HTTP 200 untuk mencegah retry sisi server (kendala S-7).

class CallbackHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        body = json.loads(self.rfile.read(int(self.headers['Content-Length'])))
        self.send_response(200)  # Harus segera mengembalikan 200; retry dipicu setelah timeout 5 detik
        self.end_headers()

        if body['EventType'] == 'UploadByURLComplete' and body['Status'] == 'success':
            print(f"Upload selesai: VideoId={body['VideoId']}, menunggu transkoding...")

        elif body['EventType'] == 'TranscodeComplete' and body['Status'] == 'success':
            # Semua transkoding selesai -> Dapatkan URL pemutaran
            play_info = get_play_info(body['VideoId'])
            for stream in play_info['PlayInfoList']['PlayInfo']:
                print(f"  [{stream['Definition']}] {stream['PlayURL']}")

Ambil URL pemutaran (logika kunci):

request = GetPlayInfoRequest()
request.set_VideoId(video_id)
request.set_Formats('mp4,m3u8')
request.set_AuthTimeout(3600)  # URL berlaku selama 1 jam
response = json.loads(client.do_action_with_exception(request))
# response['PlayInfoList']['PlayInfo'] → URL pemutaran untuk setiap definisi

Hasil eksekusi

Mengirimkan upload batch:

$ python vod_batch_upload.py

[1/2] Menginisialisasi klien VOD... ✓ (wilayah: cn-shanghai)
[2/2] Mengirimkan pekerjaan upload batch (3 video)... ✓
  RequestId: 25818875-5F78-4AF6-D7393642CA58****
  JobId: ad90a501b1b9****  ← sample1.mp4
  JobId: bd81b612c2c8****  ← sample2.mp4
  JobId: ce72c723d3d9****  ← sample3.mp4

Langkah-langkah berikutnya dipicu secara otomatis oleh notifikasi event:
  UploadByURLComplete → Auto Transcode → TranscodeComplete → GetPlayInfo

Layanan callback menerima event:

$ python callback_server.py
Layanan callback dimulai: http://0.0.0.0:8080 | Menunggu callback...

[UploadByURLComplete] VideoId=93ab850b**** | Status=success
  → Upload selesai, menunggu transkoding otomatis...

[StreamTranscodeComplete] VideoId=93ab850b**** | Status=success
  → Transkoding definisi LD selesai (siap untuk diputar)

[TranscodeComplete] VideoId=93ab850b**** | Status=success
  → Semua transkoding selesai, mendapatkan URL pemutaran:
    [LD] https://vod.example.com/****/sample1-ld.mp4?auth_key=****
    [SD] https://vod.example.com/****/sample1-sd.mp4?auth_key=****
    [HD] https://vod.example.com/****/sample1-hd.mp4?auth_key=****

Pengambilan dokumen oleh agent

Prompt: "Batch upload + transkode + pemutaran"
  │
  ▼
┌── llms.txt (Pencocokan quick start + Kendala kesalahan umum) ──┐
│  ✓ "Batch URL upload"         → media-upload/url-based-upload.md  │
│  ✓ "Event notification"       → event-notification/event-notification_2.md  │
│  ✓ "Playback URL"             → api-reference/get-playback-url.md   │
│  ✓ "Python init"              → api-reference/initialization_2.md   │
│  ✓ "Auto transcode"           → media-processing/workflow.md        │
│  ✗ #1 Jangan gunakan root AK ✗ #3 Jangan polling ✗ #5 Encode URL ✗ #6 Backoff QPS │
└────────────────────────┬─────────────────────────────────────┘
                         │
   ┌─────────────────────┼─────────────────────┐
   ▼                     ▼                     ▼
url-based-upload.md  event-notification_2.md get-playback-url.md
- UploadMediaByURL  - Daftar jenis event       - Parameter request/response
- URL harus diencode - Format callback HTTP    - Enumerasi Definition
- Batasan wilayah    - Kebijakan timeout & retry - QPS=360/detik
- Maks 20 URL        - Timeout 5 detik        - Status=Normal
   │                     │                     │
   ▼                     ▼                     ▼
   └────► initialization_2.md (konstruktor klien SDK) ◄────┘
                         │
                         ▼
                  workflow.md (Transkode otomatis dengan TemplateGroupId)
                         │
                         ▼
                Hasilkan kode lengkap yang dapat dijalankan

Keputusan desain utama

Tabel berikut mencantumkan keputusan desain utama untuk demo ini, dengan ID kendala eksplisit yang dirujuk kembali ke referensi kendala terstruktur.

Titik keputusan

Pilihan agent

Dasar dalam dokumentasi

Metode upload

UploadMediaByURL

Dokumentasi menentukan API ini untuk upload batch dari daftar URL publik.

Pemicu transkoding

Tentukan TemplateGroupId saat upload

Dokumentasi menyatakan bahwa menentukan TemplateGroupId saat upload memicu transkoding otomatis, sehingga tidak perlu panggilan API terpisah.

Pelacakan status

Callback event HTTP

Kendala S-3 (WAJIB): Jangan polling.

Waktu pengambilan URL pemutaran

Setelah TranscodeComplete

Dokumentasi menyatakan bahwa GetPlayInfo memerlukan status video menjadi Normal.

Manajemen AccessKey

Variabel lingkungan

Kendala S-1, S-2 (WAJIB): Jangan hardcoding.

Penanganan URL

quote(url, safe='')

Kendala S-5 (WAJIB): Harus diencode.

Wilayah

cn-shanghai

Dokumentasi menyatakan bahwa upload berbasis URL hanya didukung di wilayah China (Shanghai).

Toleransi kesalahan

Retry backoff eksponensial

Kendala S-6 (WAJIB): Backoff untuk pembatasan kecepatan.

Demo sisi klien: Pemutar Android dan penampil langsung

Bagian ini membangun demo Android yang dapat dijalankan di atas alur kerja sisi server. Demo ini memutar file MP4 dengan kode minimal dan mengintegrasikan penampil streaming langsung interaktif dengan AUI Kits.

Prompt yang dikirimkan ke agent:

Berdasarkan indeks llms sisi klien (dalam direktori seperti `client-side-player/`,
`client-side-upload/`, `client-side-short-video/`), implementasikan aplikasi demo untuk Android.
Persyaratan spesifik:
1. Pilih paket dependensi minimum yang diperlukan untuk memutar URL pemutaran yang dikembalikan
   oleh respons GetPlayInfo demo sisi server.
2. Dalam aplikasi yang sama, tambahkan titik masuk lain untuk memasuki penampil streaming langsung
   interaktif menggunakan AUI Kits (dengan penarikan aliran, komentar langsung (danmaku), suka,
   dan hadiah).
3. Jadikan nama paket, lisensi, dan domain AppServer dapat dikonfigurasi untuk menghindari
   hardcoding.

Proses eksekusi agent

Fase 1: Baca indeks llms sisi klien dan cocokkan skenario

Hasil pencocokan quick start:
  "Mulai pemutaran VOD di Android"   → client-side-player/player-atomic-android.md
  "Cara memilih paket/dependensi" → client-side-player/player-overview.md
  "Cara mengintegrasikan lisensi"      → client-side-player/player-common-license.md
  "Penampil streaming langsung interaktif" → client-side-player/player-kits-aui.md
  "Kode error 4400/4013"           → client-side-player/player-common-error-codes.md

Kesalahan umum yang dicocokkan:
  ✗ Menginisialisasi lisensi setelah membuat pemutar → Harus dilakukan di Application.onCreate (C-1)
  ✗ Memanggil setSurface sebelum Surface siap      → Harus menunggu surfaceCreated (C-2)
  ✗ Menggunakan paket fitur lengkap secara default        → Pilih paket minimal untuk skenario (C-3)
  ✗ Hardcoding domain AppServer                   → Abstraksi ke BuildConfig / gradle.properties (C-4)
  ✗ Memanggil PrivateService.init beberapa kali        → Inisialisasi hanya sekali di kelas Application (C-5)

Fase 2: Muat dokumentasi detail sesuai permintaan

Dokumen

Tujuan

client-side-player/player-overview.md

Keputusan pemilihan paket (BasicLive / UGC / InteractiveLive / Standard)

client-side-player/player-atomic-android.md

Dependensi Gradle, izin Manifest, obfuscation, dan kode pemutaran minimal

client-side-player/player-common-license.md

Waktu integrasi lisensi dan troubleshooting untuk error 4400/4013

client-side-player/player-kits-aui.md

Modul sisi klien AUI Kits dan model kolaborasi AppServer

client-side-player/player-common-error-codes.md

Referensi cepat untuk kegagalan memulai pemutaran

Fase 3: Ekstrak keputusan utama

Pemilihan paket:
  Hanya pemutaran          → AliVCSDK_BasicLive
  Pemutaran + video pendek   → AliVCSDK_UGC
  Termasuk co-hosting/streaming langsung interaktif  → AliVCSDK_InteractiveLive   ← Demo ini memilih yang ini
  Fitur lengkap          → AliVCSDK_Standard / Premium

Lisensi:
  PrivateService.initService(ctx, licenseFile, licenseKey)
  Harus diselesaikan sebelum panggilan pertama ke createAliPlayer

AUI Kits:
  AppServer + sisi klien; AppServer mengeluarkan Identity Token, Live Room Token, dan IMS Token.
  Klien: Tiga modul - AUILiveRoomCore, AUILiveRoomViewer, dan AUIInteraction.

Siapkan dependensi proyek

Dalam file build.gradle tingkat proyek:

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url "https://maven.aliyun.com/nexus/content/repositories/releases" }
    }
}

Dalam file build.gradle tingkat aplikasi:

android {
    compileSdk 34
    defaultConfig {
        applicationId "com.example.aliplayer.sample"
        minSdk 21
        targetSdk 34

        ndk { abiFilters "armeabi-v7a", "arm64-v8a" }

        buildConfigField "String", "APP_SERVER_HOST",
                "\"${project.findProperty('APP_SERVER_HOST') ?: 'https://your-appserver.example.com'}\""
        buildConfigField "String", "APP_SERVER_API_PREFIX", "\"/api/v1/live/\""
        buildConfigField "String", "LICENSE_KEY",
                "\"${project.findProperty('LICENSE_KEY') ?: ''}\""
    }
    buildFeatures { buildConfig true }
}

dependencies {
    implementation 'com.aliyun.aio:AliVCSDK_InteractiveLive:6.0.0'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.11.0'
    implementation 'com.squareup.okhttp3:okhttp:4.12.0'
    implementation 'com.google.code.gson:gson:2.10.1'
}

Konfigurasikan izin dan obfuscation

Dalam file AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Dalam file proguard-rules.pro:

-keep class com.alivc.**{*;}
-keep class com.aliyun.**{*;}
-keep class com.cicada.**{*;}
-dontwarn com.alivc.**
-dontwarn com.aliyun.**
-dontwarn com.cicada.**

Inisialisasi lisensi

Buat file SampleApp.java:

public class SampleApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // Tempatkan license.crt di app/src/main/assets/
        PrivateService.initService(getApplicationContext(),
                "file:///android_asset/license.crt",
                BuildConfig.LICENSE_KEY);
    }
}

Daftarkan SampleApp dalam file AndroidManifest.xml:

<application
    android:name=".SampleApp"
    android:label="@string/app_name"
    android:theme="@style/Theme.MaterialComponents.DayNight">
    <activity android:name=".MainActivity" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".SimplePlayerActivity" />
</application>

Bangun UI pemutaran video tunggal

Buat file layout activity_player.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000">

    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="220dp"
        android:layout_gravity="center" />
</FrameLayout>

Buat file SimplePlayerActivity.java:

public class SimplePlayerActivity extends AppCompatActivity {

    public static final String EXTRA_PLAY_URL = "play_url";

    private AliPlayer aliPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);

        SurfaceView surfaceView = findViewById(R.id.surfaceView);
        aliPlayer = AliPlayerFactory.createAliPlayer(getApplicationContext());

        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override public void surfaceCreated(SurfaceHolder h) {
                aliPlayer.setSurface(h.getSurface());
            }
            @Override public void surfaceChanged(SurfaceHolder h, int f, int w, int hh) {
                aliPlayer.surfaceChanged();
            }
            @Override public void surfaceDestroyed(SurfaceHolder h) {
                aliPlayer.setSurface(null);
            }
        });

        aliPlayer.setOnPreparedListener(() -> aliPlayer.start());
        aliPlayer.setOnErrorListener(err ->
                Log.e("AliPlayer", "code=" + err.getCode() + " msg=" + err.getMsg()));

        UrlSource source = new UrlSource();
        // Sumber: URL pemutaran (dengan auth_key) dari respons GetPlayInfo demo sisi server
        String playUrl = getIntent().getStringExtra(EXTRA_PLAY_URL);
        source.setUri(playUrl != null ? playUrl : "https://your.cdn/test.mp4");
        aliPlayer.setDataSource(source);
        aliPlayer.setAutoPlay(true);
        aliPlayer.prepare();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (aliPlayer != null) {
            aliPlayer.stop();
            aliPlayer.release();
        }
    }
}

Jika event prepared dan event frame pertama muncul di log serta SurfaceView merender gambar dengan benar, tautan dasarnya jelas.

Integrasikan penampil langsung AUI Kits

Impor modul AUI Kits

Dalam file settings.gradle:

include ':app',
        ':AUILiveRoomCore',
        ':AUILiveRoomViewer',
        ':AUIInteraction'

Dalam file build.gradle tingkat aplikasi, tambahkan dependensi berikut:

implementation project(':AUILiveRoomCore')
implementation project(':AUILiveRoomViewer')
implementation project(':AUIInteraction')

Model kolaborasi AppServer

Klien tidak pernah menyimpan kredensial sensitif secara langsung. Sebagai gantinya, AppServer mengeluarkannya setelah autentikasi. Diagram berikut menunjukkan alur kerja lengkap untuk memasuki ruang langsung:

[Aplikasi Android]                                [AppServer]
   │                                              │
   │── GET /api/v1/live/viewer/token?roomId=xxx ─►│
   │                                              ├── Autentikasi dan mengeluarkan:
   │                                              │     userId / nick / pullUrl / imsToken
   │◄──────── 200 OK + ViewerTokenInfo ───────────┤
   │
   │── LiveRoomViewerActivity.start(params) ──►(Di dalam AUI Kits)
   │                                              │
   │   (AliPlayer untuk penarikan aliran + IMS untuk komentar langsung)
  1. Aplikasi Android mengirim permintaan GET /api/v1/live/viewer/token?roomId=xxx ke AppServer dengan status login.

  2. AppServer memverifikasi status login dan mengeluarkan userId, nick, pullUrl, dan imsToken.

  3. Setelah aplikasi menerima ViewerTokenInfo, aplikasi memanggil LiveRoomViewerActivity.start(params) untuk memasuki ruang langsung.

  4. Secara internal, AUI Kits menggunakan AliPlayer untuk penarikan aliran dan terhubung ke Interactive Messaging Service (IMS) untuk fitur komentar langsung (danmaku), suka, dan hadiah.

AppServerClient (implementasi OkHttp)

Buat file AppServerClient.java dan ViewerTokenInfo.java:

public class AppServerClient {

    public interface Callback {
        void onSuccess(ViewerTokenInfo info);
        void onFail(String msg);
    }

    private static final OkHttpClient client = new OkHttpClient();

    public static void fetchViewerToken(String roomId, Callback cb) {
        HttpUrl url = HttpUrl.parse(
                BuildConfig.APP_SERVER_HOST + BuildConfig.APP_SERVER_API_PREFIX + "viewer/token")
                .newBuilder()
                .addQueryParameter("roomId", roomId)
                .build();

        Request req = new Request.Builder()
                .url(url)
                .header("Authorization", "Bearer " + LoginManager.getToken())
                .build();

        client.newCall(req).enqueue(new okhttp3.Callback() {
            @Override public void onFailure(Call call, IOException e) {
                cb.onFail(e.getMessage());
            }
            @Override public void onResponse(Call call, Response resp) throws IOException {
                if (!resp.isSuccessful() || resp.body() == null) {
                    cb.onFail("HTTP " + resp.code());
                    return;
                }
                ViewerTokenInfo info = new Gson().fromJson(
                        resp.body().string(), ViewerTokenInfo.class);
                cb.onSuccess(info);
            }
        });
    }
}

public class ViewerTokenInfo {
    public String roomId;
    public String userId;
    public String nick;
    public String pullUrl;   // Salah satu dari rtmp, flv, m3u8, atau artc
    public String imsToken;  // Token Interactive Messaging Service (IMS)
}

Gabungkan entri demo

Buat file layout activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="24dp"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button android:id="@+id/btnSimple"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Simple Playback" />

    <Button android:id="@+id/btnLiveRoom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Interactive Live Viewer" />
</LinearLayout>

Buat file MainActivity.java:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btnSimple).setOnClickListener(v -> {
            Intent intent = new Intent(this, SimplePlayerActivity.class);
            // Dalam aplikasi nyata, berikan URL pemutaran dari respons GetPlayInfo demo sisi server di sini
            intent.putExtra(SimplePlayerActivity.EXTRA_PLAY_URL,
                    "https://vod.example.com/****/sample1-hd.mp4?auth_key=****");
            startActivity(intent);
        });

        findViewById(R.id.btnLiveRoom).setOnClickListener(v -> enterRoom("demo_room_001"));
    }

    private void enterRoom(String roomId) {
        AppServerClient.fetchViewerToken(roomId, new AppServerClient.Callback() {
            @Override public void onSuccess(ViewerTokenInfo info) {
                LiveRoomEnterParams params = new LiveRoomEnterParams.Builder()
                        .roomId(info.roomId)
                        .userId(info.userId)
                        .userNick(info.nick)
                        .pullUrl(info.pullUrl)
                        .imsToken(info.imsToken)
                        .build();
                LiveRoomViewerActivity.start(MainActivity.this, params);
            }
            @Override public void onFail(String msg) {
                Toast.makeText(MainActivity.this, "Gagal memasuki ruang: " + msg, Toast.LENGTH_LONG).show();
            }
        });
    }
}

Daftar periksa verifikasi

Setelah menjalankan demo, verifikasi perilaku UI dan output log berikut:

  • Klik Simple Playback: SimplePlayerActivity dimulai, dan video diputar dengan lancar di SurfaceView tanpa layar hitam.

  • Klik Interactive Live Streaming Viewer: LiveRoomViewerActivity AUI Kits diluncurkan. AliPlayer menampilkan feed video host. Panel komentar langsung (danmaku), suka, dan hadiah di pojok kanan bawah berfungsi.

  • Log logcat utama: Kemunculan simultan AliPlayer: prepared, AliPlayer: first frame, dan IMS: connected menunjukkan bahwa penarikan aliran dan interaksi sudah siap.

Pengambilan dokumen agen

Prompt: "Pemutaran Android + masuk ruang langsung interaktif"
  │
  ▼
┌── Client-side llms.txt (Quick start + Kesalahan umum) ────────┐
│  ✓ "Pemutaran Android"        → player-atomic-android.md         │
│  ✓ "Cara memilih paket"   → player-overview.md               │
│  ✓ "Lisensi"                 → player-common-license.md          │
│  ✓ "Interaktif AUI Kits"    → player-kits-aui.md               │
│  ✓ "Kode error 4400/4013"   → player-common-error-codes.md     │
│  ✗ Lisensi harus diinisialisasi sebelum pembuatan pemutar           │
│  ✗ Jangan panggil setSurface sebelum Surface siap               │
│  ✗ Jangan gunakan paket fitur lengkap secara default              │
│  ✗ Jangan hardcoding domain AppServer                         │
│  ✗ Panggil PrivateService.init hanya sekali di Application          │
└────────────────────────┬────────────────────────────────────┘
                         │
  ┌─────────────┬────────┴─────────┬─────────────┐
  ▼             ▼                  ▼             ▼
player-      player-atomic-   player-common-  player-kits-aui.md
overview.md  android.md       license.md      - Kolaborasi AppServer
- Matriks paket - dependensi gradle    - PrivateService - Tiga jenis token
- Peta skenario - izin Manifest - 4400/4013     - Rincian modul
- Ukuran SDK     - kode Pemutaran  - Paket/BundleID - Integrasi klien 4 langkah
  └─────────────┴────────┬─────────┴─────────────┘
                         │
                         ▼
              player-common-error-codes.md
              (Panduan untuk 4400/4013/4034/4036)
                         │
                         ▼
              Hasilkan Demo Android lengkap yang dapat dijalankan

Keputusan desain utama

Titik keputusan

Pilihan agent

Dasar dalam dokumentasi

Bundle SDK

AliVCSDK_InteractiveLive

Matriks seleksi di player-overview.md merekomendasikan bundle ini untuk skenario streaming langsung interaktif (kendala C-3).

Waktu lisensi

Application.onCreate

Kendala C-1 (WAJIB): Harus dipanggil sebelum createAliPlayer.

Pengikatan Surface

setSurface dalam callback surfaceCreated

Kendala C-2 (WAJIB): Template standar player-atomic-android.md.

Domain AppServer

BuildConfig + gradle.properties

Kendala C-4 (WAJIB): Jangan hardcoding.

Integrasi sisi server

Gunakan kembali URL pemutaran dari respons GetPlayInfo demo sisi server

Ini memastikan konsistensi end-to-end antara demo sisi server dan sisi klien.

Penampil langsung interaktif

Tiga modul AUI Kits (Core / Viewer / Interaction)

player-kits-aui.md: Panduan integrasi sisi klien utama.

Penanganan error

setOnErrorListener adalah callback umum untuk pelaporan event. Kode 4400, 4013, 4034, dan 4036 dicadangkan untuk penanganan khusus sisi klien.

player-common-error-codes.md

Daftar periksa pra-peluncuran

Dimensi

Item pemeriksaan

Lisensi

Lisensi pengujian dan produksi telah diajukan dan dikonfigurasi dalam BuildConfig masing-masing.

Ukuran paket

abiFilters dibatasi hanya untuk armv7 + arm64. Bundle SDK minimal dipilih berdasarkan skenario.

Memulai pemutaran

Listener untuk 4400/4013/4034/4036 diimplementasikan untuk pemantauan.

Ruang langsung

Pembaruan otomatis untuk Token IMS yang kedaluwarsa diimplementasikan. AppServer telah mengaktifkan HTTPS dan CORS.

Privasi

Izin untuk perekaman audio, akses jaringan, dan pembacaan media semuanya dinyatakan dalam kebijakan privasi.

Rilis canary

Pertama, rilis versi baru ke 5% pengguna. Pantau waktu frame pertama dan tingkat kegagalan selama 48 jam sebelum peluncuran penuh.

Pemantauan

Aktifkan layanan pemantauan kualitas pemutar Alibaba Cloud (QoS) dan pelacakan titik tunggal.

Struktur direktori akhir

AliPlayerSampleApp/
├── app/
│   ├── src/main/
│   │   ├── assets/license.crt
│   │   ├── java/com/example/aliplayer/sample/
│   │   │   ├── SampleApp.java
│   │   │   ├── MainActivity.java
│   │   │   ├── SimplePlayerActivity.java         ← Simple Playback
│   │   │   ├── AppServerClient.java              ← Streaming Langsung Interaktif
│   │   │   ├── ViewerTokenInfo.java
│   │   │   └── LoginManager.java
│   │   └── AndroidManifest.xml
│   └── build.gradle
├── AUILiveRoomCore/                               ← Streaming Langsung Interaktif
├── AUILiveRoomViewer/                             ← Streaming Langsung Interaktif
├── AUIInteraction/                                ← Streaming Langsung Interaktif
├── gradle.properties (APP_SERVER_HOST / LICENSE_KEY)
├── settings.gradle
└── build.gradle

Demo sisi server dan sisi klien membentuk alur kerja tertutup yang lengkap. Dengan menggunakan indeks llms.txt, Agent mencakup pengunggahan video, transkoding otomatis, pengambilan URL pemutaran, pemutaran video dasar, dan penampil streaming langsung interaktif dengan AUI Kits.

Lampiran: Seleksi dan pemeriksaan mandiri agent

Bagian ini ditujukan untuk pengembang yang belum menginstal Coding Agent.

Kapan menggunakan Coding Agent

Kasus penggunaan

Apakah diperlukan?

Anda ingin AI membaca llms.txt, memperluas sub-dokumen sesuai kebutuhan, dan menghasilkan proyek yang dapat dijalankan.

Ya

Anda hanya ingin membaca dokumen ini untuk memahami arsitektur, lalu menyalin dan memodifikasi kode secara manual.

Tidak. Browser web sudah cukup.

Anda ingin AI langsung menambah, menghapus, dan memodifikasi file di repositori lokal Anda serta menjalankan perintah untuk memvalidasi perubahan.

Ya

Opsi yang direkomendasikan

Kategori

Nama

Jenis

Deskripsi

Disarankan

Qoder / Cursor / Claude Code

IDE Desktop atau CLI

Secara native mendukung pengambilan dokumen panjang menggunakan indeks bergaya llms.txt dan bekerja dengan baik dengan SDK dari penyedia cloud Tiongkok. Qoder digunakan untuk memverifikasi demo dalam dokumen ini.

Lainnya

-

-

Coding Agent apa pun yang dapat mengakses URL, menulis file lokal, dan memanggil perintah shell.

Catatan

Gunakan tautan instalasi dari situs web resmi produk. Hindari menggunakan gambar pihak ketiga.

Pemeriksaan mandiri minimum

Kirimkan prompt berikut ke Coding Agent Anda untuk memverifikasi kemampuannya:

Silakan baca https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/vod/llms/llms.txt,
dan beri tahu saya:
1. Berapa banyak modul tingkat atas dalam indeks ini? Apa saja?
2. Dokumen sub mana yang terlibat dalam alur kerja "upload batch + transkoding otomatis + dapatkan URL pemutaran audio/video"? Harap cantumkan path relatifnya.
3. Di bagian "Kesalahan umum yang harus dihindari", apa catatan yang terkait dengan "AccessKey"?

Jawaban yang diharapkan:

  • Benar mencantumkan modul tingkat atas dari llms.txt.

  • Mencantumkan dokumen sub yang sebagian besar konsisten dengan tabel pemuatan sesuai permintaan dalam demo sisi server (upload media, notifikasi event, dapatkan URL pemutaran audio/video, inisialisasi SDK Python, alur kerja pemrosesan media).

  • Menyatakan dengan jelas: Jangan gunakan AccessKey Akun Alibaba Cloud. Gunakan Pengguna RAM sebagai gantinya.

Agent yang lulus ketiga pemeriksaan tersebut siap untuk demo di atas.