Buat aliran siaran langsung 24/7 dari file video sesuai permintaan (VOD) Anda dengan menggunakan API. Gabungkan beberapa file VOD menjadi aliran siaran langsung yang berkelanjutan, jadwalkan siaran, dan sisipkan iklan secara real time atau pada interval terjadwal untuk menghasilkan pendapatan.
Cara kerja
Untuk membuat aliran siaran langsung dari VOD, panggil API untuk studio produksi dalam mode daftar putar. Proses ini terdiri dari empat langkah:
-
Aktifkan bucket sistem VOD: Setelah Anda mengaktifkan ApsaraVideo VOD, sistem akan menetapkan bucket sistem VOD independen di setiap wilayah layanan. Aktifkan bucket ini untuk mengunggah dan mengelola aset media Anda.
-
Unggah file audio dan video: Unggah file video yang ingin Anda siarkan ke penyimpanan ApsaraVideo VOD. Misalnya, unggah video A, B, dan C sesuai urutan pemutaran.
-
Tambahkan domain streaming: Domain ini menyediakan URL pemutaran untuk penonton Anda.
-
Gunakan API untuk mengonfigurasi studio produksi: Panggil API untuk menentukan berapa kali setiap video diputar dan berapa kali seluruh daftar episode diulang. Misalnya, konfigurasikan video A diputar sekali, video B dua kali, dan video C tiga kali. Kemudian ambil daftar episode dan mulai siaran.
Prasyarat
-
Anda telah membuat Akun Alibaba Cloud dan menyelesaikan verifikasi identitas.
-
ApsaraVideo VOD, ApsaraVideo Live, dan layanan Cloud Production Studio telah diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan ApsaraVideo VOD, Aktifkan dan beli ApsaraVideo Live, dan Aktifkan layanan Cloud Production Studio.
CatatanFitur studio produksi saat ini tersedia di wilayah China (Shanghai), China (Beijing), Asia Pasifik Tenggara 1 (Singapura), dan Asia Pasifik Tenggara 3 (Jakarta). Dukungan untuk wilayah lain akan tersedia di masa mendatang.
-
Anda memiliki domain streaming. Untuk memulai dengan cepat, kami menyarankan Anda memilih pusat siaran langsung yang berlokasi di luar Tiongkok daratan dan mengatur wilayah akselerasi ke Outside Chinese Mainland. Hal ini membebaskan domain dari persyaratan pendaftaran ICP.
-
Kebijakan sistem AliyunFCFullAccess, AliyunLiveFullAccess, dan AliyunVODFullAccess telah disambungkan ke Pengguna RAM. Untuk informasi lebih lanjut, lihat Buat Pengguna RAM dan berikan izin.
Langkah 1. Aktifkan bucket sistem VOD
Di Konsol ApsaraVideo VOD, pilih Configuration Management > Media Management > Storage. Untuk bucket sistem VOD, klik Enable.
Tunggu hingga alamat penyimpanan diaktifkan. Anda hanya dapat menggunakan alamat penyimpanan tersebut setelah sistem menampilkan pesan The dedicated bucket is enabled. dan status alamat penyimpanan berubah menjadi Normal.
Langkah 2. Unggah file audio dan video
-
Di Konsol ApsaraVideo VOD, buka halaman dan klik Upload Audio/Video .
-
Di halaman Upload Audio/Video , klik Add Media.
-
Di kotak dialog Add Media, pilih From Local, pilih tiga file video yang telah Anda siapkan secara berurutan, lalu klik Upload.
-
Setelah pengunggahan selesai, kembali ke halaman Audio/Video untuk melihat dan mencatat ID resource masing-masing file. Di kolom Actions untuk setiap video, klik More > Add to Production Studio. Hal ini membuat konten tersedia untuk studio produksi ApsaraVideo Live. Untuk informasi lebih lanjut tentang fitur studio produksi, lihat Ikhtisar fitur.
Langkah 3. Tambahkan domain streaming
-
Di Konsol ApsaraVideo Live, buka halaman Domain Names dan klik Add Domain.
-
Konfigurasikan detail domain dan klik Next. Untuk informasi lebih lanjut tentang parameter, lihat Tambahkan nama domain yang dipercepat.
Untuk tutorial ini, atur Business Type ke Streaming Domain, Acceleration Region ke Outside Chinese Mainland, masukkan Accelerated Domain Name Anda, dan atur Live Center ke China (Shanghai).
-
Catat nilai CNAME yang dihasilkan untuk langkah berikutnya.
Anda juga harus menambahkan rekaman CNAME pada penyedia DNS Anda untuk mengarahkan host record ke nilai CNAME tersebut. Hal ini mengaktifkan akselerasi CDN.
-
Di halaman DNS Alibaba Cloud, temukan domain yang ingin Anda konfigurasi dan klik Settings di kolom Actions.
-
Klik Add Record, lengkapi konfigurasi CNAME, dan klik Confirm. Untuk informasi lebih lanjut, lihat Konfigurasikan rekaman CNAME untuk nama domain.
Atur Record Type ke CNAME, Host ke @, dan Resolution Line ke Default. Di bidang Record Value, masukkan alamat target CNAME. Atur TTL ke 10 Minutes.
Langkah 4. Konfigurasi studio produksi dengan API
-
Buka IntelliJ IDEA dan buat proyek Maven. Di file pom.xml, buat tag <dependencies></dependencies> dan tambahkan dependensi berikut.
<dependency> <groupId>com.aliyun</groupId> <artifactId>live20161101</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> -
Di direktori
src/main/javaproyek Anda, klik kanan folderjavadan buat kelas Java baru. Untuk contoh ini, beri namaBodan. -
Konfigurasikan parameter dalam kode contoh berikut dan jalankan.
package com.alibaba.aliyundebug.common; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyun.live20161101.Client; import com.aliyun.live20161101.models.*; import com.aliyun.teaopenapi.models.Config; import org.apache.commons.codec.digest.DigestUtils; import java.util.List; import java.util.Random; import java.util.UUID; public class Bodan { private final static String ACCESS_KEY_ID = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private final static String ACCESS_KEY_SECRET = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); private static class LiveClient { private static volatile Client instance; private LiveClient() { } public static Client getInstance(String endpoint, String accessKeyId, String accessKeySecret) { if (instance == null) { synchronized (LiveClient.class) { if (instance == null) { try { Config config = new Config(); config.setEndpoint(endpoint); config.setAccessKeyId(accessKeyId); config.setAccessKeySecret(accessKeySecret); instance = new Client(config); } catch (Exception e) { throw new RuntimeException("Live client initialization failed: " + e.getMessage(), e); } } } } return instance; } } private static CreateCasterResponse createCaster(Client client) throws Exception { CreateCasterRequest request = new CreateCasterRequest(); Random random = new Random(); int i = random.nextInt(100000); request.setCasterName("casterName" + i); UUID uuid = UUID.randomUUID(); String token = "thisIsaToken"; String clientToken = DigestUtils.sha256Hex(token + uuid); request.setClientToken(clientToken); // Untuk menggunakan daftar episode, studio produksi harus dalam mode daftar putar. request.setNormType(6); request.setChargeType("PostPaid"); CreateCasterResponse response = client.createCaster(request); System.out.println("Studio produksi dibuat. Respons: " + JSON.toJSONString(response)); return response; } private static void setCasterConfig(Client client, String casterId,String domainName) throws Exception { SetCasterConfigRequest request = new SetCasterConfigRequest(); request.setCasterId(casterId); // Konfigurasikan nama domain. request.setDomainName(domainName); JSONObject transcodeConfig = new JSONObject(); JSONArray liveTemplate = new JSONArray(); // Konfigurasikan templat untuk studio produksi. liveTemplate.add("lld"); transcodeConfig.put("LiveTemplate", liveTemplate); // Konfigurasikan templat transkoding. transcodeConfig.put("CasterTemplate", "lp_sd"); request.setTranscodeConfig(transcodeConfig.toJSONString()); SetCasterConfigResponse response = client.setCasterConfig(request); System.out.println("Studio produksi dikonfigurasi. Respons: " + JSON.toJSONString(response)); } private static StartCasterResponse startCaster(Client client, String casterId) throws Exception { StartCasterRequest startCasterRequest = new StartCasterRequest(); startCasterRequest.setCasterId(casterId); StartCasterResponse acsResponse = client.startCaster(startCasterRequest); System.out.println("Studio produksi dimulai."); return acsResponse; } private static StopCasterResponse stopCaster(Client client, String casterId) throws Exception { StopCasterRequest stopCasterRequest = new StopCasterRequest(); stopCasterRequest.setCasterId(casterId); StopCasterResponse acsResponse = client.stopCaster(stopCasterRequest); System.out.println("Studio produksi dihentikan."); return acsResponse; } private static AddShowIntoShowListResponse addShowIntoShowList(Client client, String showName, String resourceId, String resourceUrl, String resourceType, Integer spot, Integer repeatTimes, String casterId, Long duration) throws Exception { AddShowIntoShowListRequest addShowIntoShowListRequest = new AddShowIntoShowListRequest(); if (casterId == null || resourceType == null) { return null; } if (resourceId == null && resourceUrl == null) { return null; } addShowIntoShowListRequest.setCasterId(casterId); addShowIntoShowListRequest.setResourceType(resourceType); if (showName != null) { addShowIntoShowListRequest.setShowName(showName); } if (resourceUrl != null) { addShowIntoShowListRequest.setResourceUrl(resourceUrl); } if (resourceId != null) { addShowIntoShowListRequest.setResourceId(resourceId); } if (spot != null) { addShowIntoShowListRequest.setSpot(spot); } if (repeatTimes != null) { addShowIntoShowListRequest.setRepeatTimes(repeatTimes); } if (duration != null) { addShowIntoShowListRequest.setDuration(duration); } return client.addShowIntoShowList(addShowIntoShowListRequest); } private static void removeShowFromShowList(Client client, String casterId, String showId) throws Exception { RemoveShowFromShowListRequest removeShowFromShowList = new RemoveShowFromShowListRequest(); removeShowFromShowList.setShowId(showId); removeShowFromShowList.setCasterId(casterId); RemoveShowFromShowListResponse removeShowFromShowListFromShowListResponse = client.removeShowFromShowList(removeShowFromShowList); System.out.println("Acara dihapus dari studio produksi. Respons: " + JSON.toJSONString(removeShowFromShowListFromShowListResponse)); } private static void modifyShowList(Client client, String casterId, String showId, Integer repeatTimes, Integer spot, String highPriorityShowId, String highPriorityShowStartTime) throws Exception { ModifyShowListRequest modifyShowListRequest = new ModifyShowListRequest(); if (casterId != null) { modifyShowListRequest.setCasterId(casterId); } if (showId != null) { modifyShowListRequest.setShowId(showId); } if (repeatTimes != null) { modifyShowListRequest.setRepeatTimes(repeatTimes); } if (spot != null) { modifyShowListRequest.setSpot(spot); } if (highPriorityShowId != null) { modifyShowListRequest.setHighPriorityShowId(highPriorityShowId); } if (highPriorityShowStartTime != null) { modifyShowListRequest.setHighPriorityShowStartTime(highPriorityShowStartTime); } ModifyShowListResponse modifyShowListResponse = client.modifyShowList(modifyShowListRequest); System.out.println("Daftar episode dimodifikasi. Respons: " + JSON.toJSONString(modifyShowListResponse)); } private static void describeShowList(Client client, String casterId) throws Exception { DescribeShowListRequest describeShowListRequest = new DescribeShowListRequest(); if (casterId != null) { describeShowListRequest.setCasterId(casterId); } DescribeShowListResponse describeShowListRequestResponse = client.describeShowList(describeShowListRequest); System.out.println("Kueri daftar episode berhasil. Respons: " + JSON.toJSONString(describeShowListRequestResponse)); DescribeShowListResponseBody showListBody = describeShowListRequestResponse.getBody(); JSONObject showList = JSON.parseObject(showListBody.getShowList()); JSONArray shows = showList.getJSONArray("Shows"); // Cetak daftar episode. for (int i = 0; i < shows.size(); i++) { JSONObject show = (JSONObject) shows.get(i); String showId = show.getString("ShowId"); String resourceType = show.getString("ResourceType"); String resourceInfo = show.getString("ResourceInfo"); Integer repeatTimes = show.getInteger("RepeatTimes"); Long duration = show.getLong("Duration"); String showInfo = String.format("show%d: showId: %s \n resourceType: %s \n resourceInfo: %s \n RepeatTimes: %d \n Duration: %d", i + 1, showId, resourceType, resourceInfo, repeatTimes, duration); System.out.println(showInfo); } } private static void playChoosenShow(Client client, String casterId, String showId) throws Exception { PlayChoosenShowRequest playChoosenShow = new PlayChoosenShowRequest(); playChoosenShow.setCasterId(casterId); playChoosenShow.setShowId(showId); PlayChoosenShowResponse playChoosenShowResponse = client.playChoosenShow(playChoosenShow); System.out.println("Berhasil beralih ke showId: " + showId); } private static List<DescribeCasterStreamUrlResponseBody.DescribeCasterStreamUrlResponseBodyCasterStreamsCasterStream> describeCasterStreamUrl(Client client, String casterId) throws Exception { DescribeCasterStreamUrlRequest describeCasterStreamUrlRequest = new DescribeCasterStreamUrlRequest(); describeCasterStreamUrlRequest.setCasterId(casterId); DescribeCasterStreamUrlResponse response = client.describeCasterStreamUrl(describeCasterStreamUrlRequest); return response.getBody().getCasterStreams().getCasterStream(); } public static void main(String[] args) throws Exception { Client client = LiveClient.getInstance("live.aliyuncs.com", ACCESS_KEY_ID, ACCESS_KEY_SECRET); // Buat studio produksi. CreateCasterResponse caster = createCaster(client); String casterId = caster.getBody().getCasterId(); // Konfigurasikan studio produksi. String domainName = "example.aliyundoc.com"; // Atur nama domain. setCasterConfig(client, casterId,domainName); // Tambahkan tiga file VOD. File pertama diputar sekali, yang kedua dua kali, dan yang ketiga tiga kali. String[] resourceIds = new String[]{"698d2b23581f476ea71107703e64****", "9c97e83e211a435b9f797e4e20ee****", "76c6addaa41c438985666a8a964f****"}; for (int i = 0; i < resourceIds.length; i++) { String showName = "ShowName#" + i; Integer repeatTimes = i; addShowIntoShowList(client, showName, resourceIds[i], null, "vod", null, repeatTimes, casterId, null); } modifyShowList(client, casterId, null, 10, null, null, null); describeShowList(client, casterId); startCaster(client, casterId); Thread.sleep(500000); stopCaster(client, casterId); } }Deskripsi parameter:
Parameter
Deskripsi
private final static String ACCESS_KEY_ID = "Your AccessKey ID"; private final static String ACCESS_KEY_SECRET = "Your AccessKey secret";Pasangan Kunci Akses digunakan untuk verifikasi identitas. Terdiri dari ID AccessKey dan Rahasia AccessKey.
-
ID AccessKey: mengidentifikasi pengguna.
-
Rahasia AccessKey: mengotentikasi pengguna. Simpan Rahasia AccessKey Anda secara rahasia.
Untuk informasi lebih lanjut, lihat Buat Pasangan Kunci Akses.
request.setDomainName("example.aliyundoc.com");Domain streaming.
String[] resourceIds = new String[]{"698d2b23581f476ea71107703e64****", "9c97e83e211a435b9f797e4e20ee****", "76c6addaa41c438985666a8a964f****"};ID resource. Lihat Langkah 2. Unggah file audio dan video untuk mendapatkannya.
-
-
Lihat hasil eksekusi.
Contoh hasil:
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" ... Studio produksi dibuat. Respons: {"casterId":"87564f62-8c51-4xxx","requestId":"853D754D-440A-5743-xxx"} Studio produksi dikonfigurasi. Respons:{"casterId":"87564f62-8c3xxx","requestId":"4727BCE9-2058-5xxx"} Daftar episode dimodifikasi. Respons: {"data":"{\"RequestId\":\"1B2E6CCF-7726-5xxx\",xxx}","httpResponse":{"encoding":"UTF-8","headers":{"Keep-Alive":"timeout=25","Access-Control-xxx"}}} Kueri daftar episode berhasil. Respons: {"data":"{\"RequestId\":\"CCE3BF90-E6A5-xxx\",\"ShowListInfo\":{\"TotalShowListRepeatTimes\":10,\"ShowListRepeatTimes\":10,\"ShowList\":xxx}}"} show1: showId: 69548057-i7z xxx resourceType: null resourceInfo: {"resourceId":"908xxx","resourceUrl":"https://outin-f7/07xxx-xxx-22ef7"} RepeatTimes: 0 -
Di halaman Production Studios, temukan studio produksi yang telah Anda buat dan klik Open di kolom Actions. Anda dapat melihat tiga file VOD yang ditambahkan ke daftar episode, diputar secara berurutan sesuai konfigurasi.
Langkah selanjutnya
Untuk memutar siaran, klik Streaming URL di studio produksi dan salin URL-nya. Gunakan pemutar media seperti VLC, demo siaran langsung, atau SDK pemutar untuk pemutaran. Untuk informasi lebih lanjut, lihat Pemutaran siaran langsung.
Kotak dialog Streaming URL menyediakan URL yang dikelompokkan berdasarkan resolusi, seperti Original dan lld. Setiap kelompok mencakup URL pemutaran untuk protokol FLV, RTMP, M3U8, dan RTS. Salin URL untuk protokol yang ingin Anda gunakan.