全部产品
Search
文档中心

Intelligent Media Services:Persiapan

更新时间:Jan 10, 2026

Pelajari cara menggunakan SDK Intelligent Media Services (IMS) untuk melakukan produksi video batch dengan memanggil API SubmitMediaProducingJob.

Apa itu produksi video batch

Produksi video batch memungkinkan Anda membuat beberapa video unik dengan menggabungkan sekelompok aset audio dan video beserta voiceover.

Kasus penggunaan

Seiring meningkatnya penggunaan platform video pendek untuk pemasaran oleh berbagai bisnis, mereka perlu mendistribusikan iklan ke berbagai akun key opinion leader (KOL) dan akun pemasaran. Untuk menghindari mekanisme deduplikasi pada platform tersebut yang memblokir konten identik, setiap video harus unik. Produksi video batch mengatasi hal ini dengan memungkinkan Anda membuat banyak variasi dari satu set aset media. Anda dapat mencapai hasil produksi yang berbeda dengan menyesuaikan parameter Timeline dalam API SubmitMediaProducingJob.

Penagihan

Mengirim pekerjaan pengeditan dan produksi video dapat dikenai biaya untuk beberapa item yang dapat ditagih. Untuk detailnya, lihat Produksi cerdas.

Cara kerja

  • Gabungkan satu atau beberapa aset video, audio, citra, dan subtitle menjadi video akhir dengan mengirim pekerjaan editing menggunakan konfigurasi parameter timeline yang berbeda melalui API SubmitMediaProducingJob.

  • Timeline mengatur aset media dan efek sesuai visi kreatif Anda. Timeline terutama terdiri dari tiga jenis objek: track, klip, dan efek. Untuk informasi selengkapnya, lihat Konfigurasi Timeline.

  • Produksi cerdas mendukung editing, rendering efek, dan produksi berbasis templat untuk aliran langsung (live stream), video on-demand, serta file aset di OSS. Untuk informasi selengkapnya, lihat Ikhtisar produksi cerdas.

Sebelum memulai

Langkah 1: Buat bucket OSS

Masuk ke Konsol OSS, pilih Buckets > Create Bucket, lalu atur Region ke China (Shanghai). Catat nama bucket tersebut karena akan digunakan sebagai tujuan output video akhir dan diperlukan pada langkah-langkah berikutnya.

image

Langkah 2: Jalankan kode

  1. Persyaratan lingkungan:

    • Sistem Operasi (OS): Windows 8.1 atau versi lebih baru, macOS, atau Linux.

    • IntelliJ IDEA 2020.1 atau versi lebih baru.

    • JDK 1.8 atau versi lebih baru.

  2. Buat proyek Maven baru untuk menjalankan kode.

  3. Impor dependensi pihak ketiga yang diperlukan.

    Catatan

    Versi SDK dalam contoh kode berikut hanya sebagai referensi. Untuk versi terbaru, lihat Server-side SDK.

    <dependencies>
      <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>ice20201109</artifactId>
        <version>2.3.0</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.9</version>
      </dependency>
    </dependencies>

    image.png

  4. Konfigurasikan AccessKey ID dan AccessKey Secret Anda. Untuk petunjuknya, lihat Kelola kredensial akses.

    Catatan

    Untuk metode lain dalam mengelola kredensial Anda, lihat Kelola kredensial akses.

  5. Buat kelas Java baru dan tempelkan contoh kode berikut.

    Klik untuk melihat contoh kode

    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.aliyun.ice20201109.Client;
    import com.aliyun.ice20201109.models.*;
    import com.aliyun.teaopenapi.models.Config;
    
    import java.util.*;
    
    // URL Video
    // http://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/ice_output/46b29eb5775f4f758846171ab79bfca7.mp4
    
    /**
     *  Dependensi Maven yang diperlukan:
     *   <dependency>
     *      <groupId>com.aliyun</groupId>
     *      <artifactId>ice20201109</artifactId>
     *      <version>2.3.0</version>
     *  </dependency>
     *  <dependency>
     *      <groupId>com.alibaba</groupId>
     *      <artifactId>fastjson</artifactId>
     *      <version>1.2.9</version>
     *  </dependency>
     */
    public class BatchProduceAlignment {
    
        static final String regionId = "cn-shanghai";
        static final String bucket = "Bucket yang Anda buat di Langkah 1";
        private Client iceClient;
        
        public static void main(String[] args) {
            try {
                BatchProduceAlignment batchProduce = new BatchProduceAlignment();
                batchProduce.initClient();
                batchProduce.run();
            } catch (Exception e) {
                System.out.println("Gagal memproduksi. Exception: " + e.toString());
            }
        }
    
        public void initClient() throws Exception {
    
            // Pasangan AccessKey dari Akun Alibaba Cloud memiliki izin untuk memanggil semua operasi API. Kami menyarankan agar Anda menggunakan RAM User untuk memanggil operasi API atau melakukan O&M rutin. 
            // Contoh ini menunjukkan cara menyimpan AccessKey ID dan AccessKey Secret Anda dalam variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi variabel lingkungan, lihat https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials
            com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
            Config config = new Config();
            config.setCredential(credentialClient);
    
            // Jika Anda ingin menyematkan AccessKey ID dan AccessKey Secret secara langsung, gunakan kode berikut. Namun, kami sangat menyarankan agar Anda tidak menyimpannya dalam kode proyek Anda untuk menghindari risiko keamanan.
            // config.accessKeyId = <your AccessKey ID>;
            // config.accessKeySecret = <your AccessKey Secret>;
            config.endpoint = "ice." + regionId + ".aliyuncs.com";
            config.regionId = regionId;
            iceClient = new Client(config);
        }
    
        public void run() throws Exception {
            // Materi teks.
            String text = "People describe life with mixed flavors because they understand that taste is a sentiment cherished in everyone's heart. In this era, everyone has experienced too much pain and joy. People tend to hide the bitterness in their hearts and turn happiness into food, presenting it on the dining table throughout the seasons.";
            // Materi video.
            String[] videoArray = new String[]{
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f1.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f2.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f3.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f4.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f5.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f6.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f7.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f8.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f9.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f10.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f11.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f12.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f13.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f14.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f15.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f16.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f17.mp4",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/food/f18.mp4"
            };
            // Materi musik latar.
            String[] bgMusicArray = new String[]{
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/music/m1.wav",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/music/m2.wav",
                    "https://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/music/m3.wav"
            };
            // Judul video.
            String title = "Delicacies on the tip of the tongue";
            // Jumlah video yang akan diproduksi.
            int produceCount = 3;
    
            // Kirim pekerjaan secara batch.
            List<String> jobIds = new ArrayList<String>();
            for (int i = 0; i < produceCount; i++) {
                String jobId = produceSingleVideo(title, text, videoArray, bgMusicArray);
                jobIds.add(jobId);
            }
            // Periksa status pekerjaan hingga semua pekerjaan selesai.
            System.out.println("menunggu pekerjaan selesai...");
            while (true) {
                Thread.sleep(3000);
                boolean allFinished = true;
                for (int i = 0; i < jobIds.size(); i++) {
                    String jobId = jobIds.get(i);
                    GetMediaProducingJobRequest req = new GetMediaProducingJobRequest();
                    req.setJobId(jobId);
                    GetMediaProducingJobResponse response = iceClient.getMediaProducingJob(req);
                    GetMediaProducingJobResponseBody.GetMediaProducingJobResponseBodyMediaProducingJob mediaProducingJob = response.getBody().getMediaProducingJob();
                    String status = mediaProducingJob.getStatus();
                    System.out.println("jobId: " + mediaProducingJob.getJobId() + ", status: " + status);
                    if ("Failed".equalsIgnoreCase(status)) {
                        System.out.println("Pekerjaan gagal. jobInfo: " + JSONObject.toJSONString(mediaProducingJob));
                        throw new Exception("Gagal memproduksi. jobid: " + mediaProducingJob.getJobId());
                    }
                    if (!"Success".equalsIgnoreCase(status)) {
                        allFinished = false;
                        break;
                    }
                }
                if (allFinished) {
                    System.out.println("Semua pekerjaan selesai.");
                    break;
                }
            }
        }
    
        public String produceSingleVideo(String title, String text, String[] videoArray, String[] bgMusicArray) throws Exception {
            text = text.replace(",", "。");
            text = text.replace("\n", "。");
            String[] sentenceArray = text.split("。");
    
            JSONArray videoClipArray = new JSONArray();
            JSONArray audioClipArray = new JSONArray();
    
            List<String> videoList = Arrays.asList(videoArray);
            Collections.shuffle(videoList);
    
            for (int i = 0; i < sentenceArray.length; i++) {
                String sentence = sentenceArray[i];
                String clipId = "clip" + i;
                String videoUrl = videoList.get(i);
                String videoClip = "{\"MediaURL\":\""+videoUrl+"\",\"ReferenceClipId\":\""+clipId+"\",\"Effects\":[{\"Type\":\"Background\",\"SubType\":\"Blur\",\"Radius\":0.1}]}";
                videoClipArray.add(JSONObject.parseObject(videoClip));
                String audioClip = "{\"Type\":\"AI_TTS\",\"Content\":\"" + sentence + "\",\"Voice\":\"zhichu\",\"ClipId\":\""+clipId+"\",\"Effects\":[{\"Type\":\"AI_ASR\",\"Font\":\"Alibaba PuHuiTi\",\"Alignment\":\"TopCenter\",\"Y\":0.75,\"FontSize\":55,\"FontColor\":\"#ffffff\",\"AdaptMode\":\"AutoWrap\",\"TextWidth\":0.8,\"Outline\":2,\"OutlineColour\":\"#000000\"}]}";
                audioClipArray.add(JSONObject.parseObject(audioClip));
            }
    
            String subtitleTrack = "{\"SubtitleTrackClips\":[{\"Type\":\"Text\",\"Font\":\"HappyZcool-2016\",\"Content\":\""+title+"\",\"FontSize\":80,\"FontColor\":\"#ffffff\",\"Y\":0.15,\"Alignment\":\"TopCenter\",\"EffectColorStyle\":\"CS0004-000005\",\"FontFace\":{\"Bold\":true,\"Italic\":false,\"Underline\":false}}]}";
    
            int bgMusicIndex = (int)(Math.random() * bgMusicArray.length);
            String bgMusicUrl = bgMusicArray[bgMusicIndex];
            String timeline = "{\"VideoTracks\":[{\"VideoTrackClips\":"+videoClipArray.toJSONString()+"}],\"AudioTracks\":[{\"AudioTrackClips\":"+audioClipArray.toJSONString()+"},{\"AudioTrackClips\":[{\"MediaURL\":\""+bgMusicUrl+"\"}]}],\"SubtitleTracks\":[" + subtitleTrack + "]}";
    
            //
            String targetFileName = UUID.randomUUID().toString().replace("-", "");
            String outputMediaUrl = "http://" + bucket + ".oss-" + regionId + ".aliyuncs.com/ice_output/" + targetFileName + ".mp4";
            int width = 720;
            int height = 1280;
            String outputMediaConfig = "{\"MediaURL\":\"" + outputMediaUrl + "\",\"Width\":"+width+",\"Height\":"+height+"}";
    
            SubmitMediaProducingJobRequest request = new SubmitMediaProducingJobRequest();
            request.setTimeline(timeline);
            request.setOutputMediaConfig(outputMediaConfig);
            SubmitMediaProducingJobResponse response = iceClient.submitMediaProducingJob(request);
            System.out.println("Pekerjaan dimulai. jobid: " + response.getBody().getJobId() + ", outputMediaUrl: " + outputMediaUrl);
            return response.getBody().getJobId();
        }
    
    }

  6. Ganti placeholder bucket dalam kode dengan nama bucket yang Anda buat di Langkah 1.

  7. Klik Run untuk menghasilkan video. Alur kerja keseluruhan kode adalah sebagai berikut: Hasilkan timeline -> Kirim pekerjaan produksi video -> Periksa status pekerjaan -> Cetak log ke konsol.

    image.pngimage.png

  8. outputMediaUrl adalah alamat output. Saat status pekerjaan berubah menjadi Success, Anda dapat melihat pratinjau video akhir. Karena bucket bersifat privat, URL tersebut tidak dapat diakses langsung. Untuk melihat pratinjau video, buka konsol OSS, temukan file output, lalu klik Copy Object URL untuk mendapatkan URL yang ditandatangani.

    image

  9. Variabel produceCount dalam kode menentukan jumlah video yang akan diproduksi. Anda dapat mengganti teks sampel dan aset video dalam kode dengan konten Anda sendiri. Untuk informasi selengkapnya, lihat Konfigurasi Timeline.image.png

Referensi

Langkah selanjutnya