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 (
aliyunsdkcoredanaliyunsdkvod) 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 34danminSdk 21.File lisensi AliPlayer (
license.crt) ditempatkan diapp/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 definisiHasil 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 → GetPlayInfoLayanan 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 dijalankanKeputusan 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 |
Pelacakan status | Callback event HTTP | Kendala S-3 (WAJIB): Jangan polling. |
Waktu pengambilan URL pemutaran | Setelah TranscodeComplete | Dokumentasi menyatakan bahwa |
Manajemen AccessKey | Variabel lingkungan | Kendala S-1, S-2 (WAJIB): Jangan hardcoding. |
Penanganan URL |
| 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)Aplikasi Android mengirim permintaan
GET /api/v1/live/viewer/token?roomId=xxxke AppServer dengan status login.AppServer memverifikasi status login dan mengeluarkan
userId,nick,pullUrl, danimsToken.Setelah aplikasi menerima
ViewerTokenInfo, aplikasi memanggilLiveRoomViewerActivity.start(params)untuk memasuki ruang langsung.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:
SimplePlayerActivitydimulai, dan video diputar dengan lancar diSurfaceViewtanpa layar hitam.Klik Interactive Live Streaming Viewer:
LiveRoomViewerActivityAUI 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, danIMS: connectedmenunjukkan 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 dijalankanKeputusan desain utama
Titik keputusan | Pilihan agent | Dasar dalam dokumentasi |
Bundle SDK | AliVCSDK_InteractiveLive | Matriks seleksi di |
Waktu lisensi | Application.onCreate | Kendala C-1 (WAJIB): Harus dipanggil sebelum |
Pengikatan Surface |
| Kendala C-2 (WAJIB): Template standar |
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) |
|
Penanganan error |
|
|
Daftar periksa pra-peluncuran
Dimensi | Item pemeriksaan |
Lisensi | Lisensi pengujian dan produksi telah diajukan dan dikonfigurasi dalam BuildConfig masing-masing. |
Ukuran paket |
|
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.gradleDemo 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 | 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 |
Lainnya | - | - | Coding Agent apa pun yang dapat mengakses URL, menulis file lokal, dan memanggil perintah shell. |
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.