全部产品
Search
文档中心

Intelligent Media Services:Persiapan

更新时间:Jul 06, 2025

Topik ini menjelaskan cara menggunakan SDK Intelligent Media Services (IMS) untuk memanggil operasi SubmitMediaProducingJob guna menggabungkan materi audio dan video.

Deskripsi fitur

Pengeditan massal

Pengeditan massal memungkinkan Anda menghasilkan klip video yang berbeda dari materi audio dan video yang diberikan.

Skenario

Di era 5G, semakin banyak penjual memasarkan produk dan layanan mereka melalui video pendek. Sebagai contoh, penjual dapat bekerja sama dengan pemimpin opini kunci (KOL) di platform video pendek untuk menjangkau lebih banyak pelanggan potensial. Untuk mencegah pencurian konten video, platform video pendek utama menerapkan mekanisme deduplikasi konten video yang memblokir video dengan konten dan struktur serupa agar tidak diposting ke akun yang berbeda pada platform yang sama. Pengeditan massal membantu menciptakan konten video yang berbeda dari informasi input serupa. Anda dapat mengubah pengaturan parameter Timeline dalam operasi SubmitMediaProducingJob sesuai dengan kebutuhan pengeditan massal Anda.

Harga

Saat Anda mengirimkan pekerjaan pengeditan dan komposit, beberapa item mungkin dikenakan biaya. Untuk informasi lebih lanjut, lihat Produksi Cerdas.

Catatan penggunaan

  • Anda dapat menghasilkan video dari satu atau lebih video, file audio, gambar, dan materi subtitle dengan mengonfigurasi parameter Timeline dan memanggil operasi SubmitMediaProducingJob.

  • Sebuah timeline dibuat saat Anda menambahkan materi dan mengonfigurasi efek untuk membuat video. Timeline terdiri dari trek, materi, dan efek.

  • Produksi cerdas mendukung pengeditan dan komposit, rendering efek, serta produksi berbasis template untuk siaran langsung, file VOD, dan materi dari Object Storage Service (OSS). Untuk informasi lebih lanjut, lihat Produksi Cerdas.

Prasyarat

Langkah 1: Buat bucket OSS

Masuk ke Konsol OSS. Di panel navigasi sebelah kiri, klik Buckets. Pada halaman Buckets, klik Buat Bucket. Di panel Buat Bucket, tentukan nama bucket, pilih Tiongkok (Shanghai) untuk Wilayah, dan klik Buat. Bucket ini akan digunakan untuk menyimpan video keluaran nantinya.

image

Langkah 2: Jalankan kode pengeditan massal

  1. Siapkan lingkungan pengembangan Anda:

    • Gunakan Windows 8.1 atau yang lebih baru, macOS, atau Linux.

    • Unduh dan instal IntelliJ IDEA 2020.1 atau yang lebih baru.

    • Gunakan Java Development Kit (JDK) 1.8 atau yang lebih baru.

  2. Buat proyek Maven dan jalankan kode tersebut.

  3. Impor dependensi pihak ketiga.

    Catatan

    Nomor versi server SDK yang diperkenalkan dalam kode sampel berikut hanya untuk referensi. Untuk mendapatkan versi terbaru, kunjungi Halaman 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. Sertakan ID AccessKey dan Rahasia AccessKey dalam file konfigurasi. Untuk informasi lebih lanjut, lihat Kelola Kredensial Akses.Kelola Kredensial Akses

    Catatan

    Untuk informasi tentang cara mengelola kredensial akses, lihat Kelola Kredensial Akses.

  5. Buat kelas Java dan salin tempel kode sampel berikut.

    Perluas

    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.*;
    
    // Video keluaran di-hosting di URL berikut:
    // http://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/ice_output/46b29eb5775f4f758846171ab79bfca7.mp4
    
    /**
     *  Tambahkan dependensi berikut:
     *   <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";
        static final String bucket = "Bucket yang dibuat di Langkah 3";
        private Client iceClient;
        
        public static void main(String[] args) {
            try {
                BatchProduceAlignment batchProduce = new BatchProduceAlignment();
                batchProduce.initClient();
                batchProduce.run();
            } catch (Exception e) {
                System.out.println("Produksi gagal. Pengecualian: " + e.toString());
            }
        }
    
        public void initClient() throws Exception {
    
            // Pasangan AccessKey dari akun Alibaba Cloud memiliki izin akses pada semua operasi API. Kami merekomendasikan Anda menggunakan pasangan AccessKey dari pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. 
            // Dalam contoh ini, ID AccessKey dan Rahasia AccessKey diperoleh dari variabel lingkungan. Untuk informasi tentang cara mengonfigurasi variabel lingkungan untuk menyimpan ID AccessKey dan Rahasia AccessKey, kunjungi 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);
    
            // Untuk hard-code ID AccessKey dan Rahasia AccessKey Anda, gunakan baris berikut. Namun, kami merekomendasikan Anda tidak hard-code ID AccessKey dan Rahasia AccessKey Anda karena alasan keamanan. 
            // config.accessKeyId = <ID AccessKey>;
            // config.accessKeySecret = <Rahasia AccessKey>;
            config.endpoint = "ice." + regionId + ".aliyuncs.com";
            config.regionId = regionId;
            iceClient = new Client(config);
        }
    
        public void run() throws Exception {
            // Materi teks
            String text = "Orang mungkin menggambarkan hidup sebagai campuran lima rasa, karena rasa dikaitkan dengan perasaan dan cita rasa kehidupan yang mendalam di hati mereka. Era ini melihat banyak kepahitan dan kemanisan dalam setiap individu. Banyak orang meninggalkan perasaan pahit diam-diam di dalam diri mereka dan membiarkan makanan lezat di atas meja berbicara untuk perasaan manis mereka sepanjang musim yang berlalu.";
            // 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"
            };
            // 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 = "Gigitan Lezat";
            // Tentukan jumlah video yang akan diproduksi.
            int produceCount = 3;
    
            // Kirim tugas.
            List<String> jobIds = new ArrayList<String>();
            for (int i = 0; i < produceCount; i++) {
                String jobId = produceSingleVideo(title, text, videoArray, bgMusicArray);
                jobIds.add(jobId);
            }
            // Iterasi tugas hingga semua tugas selesai.
            System.out.println("menunggu tugas 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("tugas gagal. info tugas: " + JSONObject.toJSONString(mediaProducingJob));
                        throw new Exception("Produksi gagal. jobid: " + mediaProducingJob.getJobId());
                    }
                    if (!"Success".equalsIgnoreCase(status)) {
                        allFinished = false;
                        break;
                    }
                }
                if (allFinished) {
                    System.out.println("semua tugas 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("mulai tugas. jobid: " + response.getBody().getJobId() + ", outputMediaUrl: " + outputMediaUrl);
            return response.getBody().getJobId();
        }
    
    }
    
  6. Atur bucket dalam kode ke nama bucket yang Anda buat sebelumnya.

  7. Jalankan kode sampel untuk menghasilkan video. Kode sampel mengimplementasikan proses berikut:

    Pembuatan Timeline > Pengiriman tugas komposit video > Pencarian status tugas > Pencetakan logimage.pngimage.png

  8. Ketika status tugas adalah Success, buka file di outputMediaUrl yang dikembalikan untuk melihat pratinjau video. Jika daftar kontrol akses (ACL) bucket bersifat pribadi, URL keluaran video yang dikembalikan tidak dapat dibuka. Anda perlu menghasilkan URL bertanda tangan untuk video di Konsol OSS dan kemudian gunakan URL bertanda tangan tersebut untuk mengakses objek.

  9. Untuk mengubah jumlah video keluaran, ubah nilai parameter produceCount. Anda dapat mengganti materi input yang disediakan dalam kode sampel dengan informasi aktual Anda. Untuk informasi lebih lanjut, lihat Konfigurasi Timeline.

Referensi

Apa yang harus dilakukan selanjutnya

  • Anda dapat menggunakan parameter Timeline untuk mencampur video dan gambar. Untuk informasi lebih lanjut, lihat Edit Gambar dan Video.

  • Anda dapat menggunakan parameter Timeline untuk memproses data audio. Untuk informasi lebih lanjut, lihat Pengolahan Audio.

  • Anda dapat menggunakan parameter Timeline untuk memproses subtitle dan template subtitle. Untuk informasi lebih lanjut, lihat Subtitle dan Template Subtitle.

  • Anda dapat menggunakan parameter Timeline untuk mengonfigurasi transisi, efek visual, dan filter. Untuk informasi lebih lanjut, lihat Transisi, Efek Visual, dan Filter.

  • Anda dapat menggunakan parameter Timeline untuk memproses data dan menggunakan data yang telah diproses untuk komposit video. Untuk informasi lebih lanjut, lihat Hasilkan Video Setelah Pemrosesan Data Cerdas.

  • Anda dapat menggunakan parameter Timeline untuk mengonfigurasi pengaturan lainnya. Untuk informasi lebih lanjut, lihat Pengaturan Lainnya.