All Products
Search
Document Center

Intelligent Media Services:Mulai

Last Updated:Jun 21, 2026

Topik ini menjelaskan cara menggunakan IMS SDK untuk melakukan produksi video batch dengan memanggil API SubmitMediaProducingJob.

Konsep utama

Produksi video batch

Produksi video batch menghasilkan beberapa video unik dengan menggabungkan satu set kecil klip audio dan video serta variasi narasi suara yang berbeda.

Kasus penggunaan

Platform video pendek sering menggunakan algoritma deduplikasi untuk mencegah pencurian konten. Untuk menjalankan kampanye pemasaran di berbagai saluran atau akun, Anda harus membuat variasi unik dari iklan video Anda. Fitur produksi video batch mengotomatiskan proses ini. Dengan menyesuaikan parameter timeline dalam pemanggilan API SubmitMediaProducingJob, Anda dapat menghasilkan output video yang berbeda sesuai kebutuhan Anda.

Penagihan

Pengiriman pekerjaan editing dan produksi dapat dikenai biaya untuk beberapa item yang dapat ditagih. Untuk informasi lebih lanjut, lihat produksi cerdas.

Cara kerja

  • Gabungkan klip video, audio, gambar, dan subtitle menjadi video final dengan mengirimkan pekerjaan editing menggunakan konfigurasi parameter timeline yang berbeda melalui API SubmitMediaProducingJob.

  • Timeline adalah tempat Anda menyusun klip dan mendesain efek untuk proyek video Anda. Timeline terdiri dari tiga objek utama: track, klip, dan efek. Untuk informasi lebih lanjut, lihat Konfigurasi timeline.

  • Fitur produksi cerdas mendukung editing dan produksi, rendering efek, serta produksi berbasis templat untuk live stream, video-on-demand (VOD), dan klip OSS. Untuk informasi lebih lanjut, lihat Ikhtisar produksi cerdas.

Sebelum memulai

  • Anda telah mengaktifkan IMS.

  • Anda telah membuat RAM user dan memperoleh Pasangan Kunci Aksesnya. Untuk informasi lebih lanjut, lihat Buat dan otorisasi RAM user.

Langkah 1: Buat bucket OSS

Masuk ke Konsol OSS dan klik Buckets > Create Bucket. Untuk region, pilih China (Shanghai). Catat nama bucket tersebut karena diperlukan dalam kode contoh dan akan menjadi lokasi output video yang telah diedit.

Untuk mode pembuatan, pilih Custom Creation.

Langkah 2: Jalankan kode produksi video batch

  1. Siapkan lingkungan Anda:

    • Sistem operasi: 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 sisi server pada kode contoh berikut hanya sebagai referensi. Untuk mendapatkan versi terbaru, lihat SDK sisi server.

    <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>
  4. Konfigurasikan AccessKey ID dan AccessKey Secret Anda. Untuk informasi lebih lanjut, lihat Kelola kredensial. Untuk metode autentikasi lainnya, lihat Kelola kredensial.

    Catatan

    Untuk cara lain mengelola kredensial Anda, lihat Kelola kredensial.

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

    Perluas untuk melihat kode contoh

    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 contoh video yang berhasil dihasilkan
    // http://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/ice_output/46b29eb5775f4f758846171ab79bfca7.mp4
    
    /**
     *  Dependensi Maven berikut diperlukan:
     *   <dependency>
     *      <groupId>com.aliyun</groupId>
     *      <artifactId>ice20201109</artifactId>
     *      <version>2.1.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";
        // Ganti dengan nama bucket yang Anda buat di Langkah 1.
        static final String bucket = "your-bucket-name";
        private Client iceClient;
        
        public static void main(String[] args) {
            try {
                BatchProduceAlignment batchProduce = new BatchProduceAlignment();
                batchProduce.initClient();
                batchProduce.run();
            } catch (Exception e) {
                System.out.println("Produce failed. Exception: " + e.toString());
            }
        }
    
        public void initClient() throws Exception {
    
            // Pasangan AccessKey dari Akun Alibaba Cloud memiliki izin atas semua API. Kami menyarankan Anda menggunakan RAM user untuk akses API atau O&M rutin.
            // Contoh ini menunjukkan cara menyimpan AccessKey ID dan AccessKey Secret dalam variabel lingkungan. Untuk instruksi konfigurasi, 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 kredensial secara langsung, gunakan kode berikut. Namun, kami sangat menyarankan agar Anda tidak menyimpan AccessKey ID dan AccessKey Secret dalam kode proyek Anda. Menyematkan kredensial dapat menimbulkan 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 {
            // Konten teks untuk teks-ke-ucapan
            String text = "People describe life with mixed flavors because they know that taste is a sentiment cherished in every heart. In this era, everyone experiences much pain and joy. People tend to hide the bitterness and turn happiness into food, presenting it on the dining table throughout the seasons.";
            // Klip 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"
            };
            // Klip 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 = "A Bite of Delicacy";
            // Jumlah video yang akan dihasilkan
            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 selesai
            System.out.println("waiting job finished...");
            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("jobfailed. jobInfo: " + JSONObject.toJSONString(mediaProducingJob));
                        throw new Exception("Produce failed. jobid: " + mediaProducingJob.getJobId());
                    }
                    if (!"Success".equalsIgnoreCase(status)) {
                        allFinished = false;
                        break;
                    }
                }
                if (allFinished) {
                    System.out.println("all job finished.");
                    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("start job. 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. Jalankan kode untuk menghasilkan video. Kode ini menjalankan alur kerja berikut:

    Hasilkan timeline > kirim pekerjaan produksi video > periksa status pekerjaan > cetak log ke konsol.

    public static void main(String[] args) throws Exception {
        BatchProduce batchProduce = new BatchProduce();
        batchProduce.initClient();
        batchProduce.run();
    }
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    start job. jobid: 150de5f285c942b0894f1150ad5e6d50, outputMediaUrl: http://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/ice_output/e0852f92dd2041e19e0739f4a7cee064.mp4
    waiting job finished...
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Init
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Init
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Init
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Init
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Init
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Init
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Processing
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Processing
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Processing
    jobId: 150de5f285c942b0894f1150ad5e6d50, status:Success
    all job finished.
    Process finished with exit code 0

  8. Saat status pekerjaan berubah menjadi Success, outputMediaUrl menyediakan URL video yang dihasilkan. Karena bucket bersifat privat, Anda tidak dapat membuka URL ini secara langsung. Sebagai gantinya, Anda harus menyalin URL yang ditandatangani dari Konsol OSS untuk melihat pratinjau video.

    Dari daftar Buckets, pilih bucket Anda. Pilih File Management > File List dan buka direktori ice_output/. Pilih file .mp4 yang dituju. Di panel detail, aktifkan HTTPS, atur waktu kedaluwarsa, lalu klik Copy Object URL untuk mendapatkan URL yang ditandatangani.

  9. Variabel produceCount menentukan jumlah video yang akan dihasilkan. Ubah nilai produceCount ini untuk menghasilkan jumlah video yang berbeda. Anda juga dapat mengganti teks dan klip video contoh dengan konten Anda sendiri. Untuk informasi lebih lanjut, lihat dokumentasi Konfigurasi timeline.

Referensi

Langkah selanjutnya