Fitur penggabungan video memungkinkan Anda menggabungkan beberapa video menjadi satu file dan mengonversinya ke format tertentu.
Ikhtisar
Penggabungan video memungkinkan Anda menggabungkan beberapa klip video menjadi satu file output dan mengonversinya ke format yang diinginkan.

Kasus penggunaan
-
Produksi film dan televisi: Penggabungan video merupakan bagian inti dalam produksi film, serial TV, dan film pendek. Fitur ini memungkinkan editor menyusun berbagai cuplikan dan adegan untuk membangun narasi yang utuh.
-
Pembuatan konten: Di platform media sosial, kreator menggunakan penggabungan video untuk membuat vlog, tutorial, atau kompilasi bertema agar kontennya lebih menarik dan mudah ditonton.
-
Pendidikan dan pelatihan: Instruktur dapat menggabungkan berbagai klip video untuk menyusun materi ajar yang komprehensif dengan mengintegrasikan teori dan contoh praktis, sehingga meningkatkan pemahaman siswa.
-
Penyiaran olahraga: Dalam bidang olahraga, penggabungan video digunakan untuk membuat sorotan pertandingan yang memungkinkan penonton mengulang momen-momen paling seru.
Cara menggunakan
Prasyarat
-
Layanan Intelligent Media Management (IMM) telah diaktifkan. Untuk informasi selengkapnya, lihat Aktifkan produk.
-
Proyek IMM telah disambungkan. Untuk menyambungkan proyek melalui Konsol Object Storage Service (OSS), lihat Langkah 1: Menyambungkan proyek IMM. Untuk menyambungkan proyek dengan memanggil operasi API, lihat AttachOSSBucket - Menyambungkan bucket OSS.
Menggabungkan video
Anda hanya dapat menggunakan SDK Java, Python, atau Go untuk menggabungkan video melalui pemrosesan asinkron.
Java
Gunakan Java SDK versi 3.17.4 atau yang lebih baru.
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.AsyncProcessObjectRequest;
import com.aliyun.oss.model.AsyncProcessObjectResult;
import com.aliyuncs.exceptions.ClientException;
import java.util.Base64;
public class Demo {
public static void main(String[] args) throws ClientException {
// Ganti yourEndpoint dengan Endpoint wilayah tempat bucket berada.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Tentukan ID wilayah Alibaba Cloud umum, seperti cn-hangzhou.
String region = "cn-hangzhou";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket.
String bucketName = "examplebucket";
// Tentukan nama file video hasil penggabungan.
String targetObject = "dest.mp4";
// Tentukan nama file video sumber.
String sourceVideo = "src.mp4";
// Tentukan nama file video yang akan digabungkan.
String video1 = "concat1.mp4";
String video2 = "concat2.mp4";
// Buat instance OSSClient.
// Setelah instance OSSClient tidak digunakan lagi, panggil metode shutdown untuk melepas resource.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Encode nama file video.
String video1Encoded = Base64.getUrlEncoder().withoutPadding().encodeToString(video1.getBytes());
String video2Encoded = Base64.getUrlEncoder().withoutPadding().encodeToString(video2.getBytes());
// Bangun string gaya pemrosesan video dan parameter penggabungan video.
String style = String.format("video/concat,ss_0,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_%s/sur,o_%s,t_0", video1Encoded, video2Encoded);
// Bangun instruksi pemrosesan asinkron.
String bucketEncoded = Base64.getUrlEncoder().withoutPadding().encodeToString(bucketName.getBytes());
String targetEncoded = Base64.getUrlEncoder().withoutPadding().encodeToString(targetObject.getBytes());
String process = String.format("%s|sys/saveas,b_%s,o_%s/notify,topic_QXVkaW9Db252ZXJ0", style, bucketEncoded, targetEncoded);
// Buat objek AsyncProcessObjectRequest.
AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, sourceVideo, process);
// Jalankan tugas pemrosesan asinkron.
AsyncProcessObjectResult response = ossClient.asyncProcessObject(request);
System.out.println("EventId: " + response.getEventId());
System.out.println("RequestId: " + response.getRequestId());
System.out.println("TaskId: " + response.getTaskId());
} finally {
// Matikan OSSClient.
ossClient.shutdown();
}
}
}
Python
Gunakan Python SDK versi 2.18.4 atau yang lebih baru.
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Dapatkan kredensial akses sementara dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Ganti Endpoint dengan Endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Tentukan ID wilayah Alibaba Cloud umum, seperti cn-hangzhou.
region = 'cn-hangzhou'
# Tentukan nama bucket, misalnya examplebucket.
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)
# Tentukan nama video hasil penggabungan.
target_object = 'out.mp4'
# Tentukan nama file video sumber.
source_video = 'emrfinal.mp4'
# Tentukan nama file video yang akan digabungkan.
video1 = 'osshdfs.mp4'
video2 = 'product.mp4'
# Bangun string gaya pemrosesan video dan parameter penggabungan video.
video1_encoded = base64.urlsafe_b64encode(video1.encode()).decode().rstrip('=')
video2_encoded = base64.urlsafe_b64encode(video2.encode()).decode().rstrip('=')
style = f"video/concat,ss_0,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_{video1_encoded}/sur,o_{video2_encoded},t_0"
# Bangun instruksi pemrosesan asinkron.
bucket_encoded = base64.urlsafe_b64encode('examplebucket'.encode()).decode().rstrip('=')
target_encoded = base64.urlsafe_b64encode(target_object.encode()).decode().rstrip('=')
process = f"{style}|sys/saveas,b_{bucket_encoded},o_{target_encoded}/notify,topic_QXVkaW9Db252ZXJ0"
print(process)
# Jalankan tugas pemrosesan asinkron.
try:
result = bucket.async_process_object(source_video, process)
print(f"EventId: {result.event_id}")
print(f"RequestId: {result.request_id}")
print(f"TaskId: {result.task_id}")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
main()
Go
Gunakan Go SDK versi 3.0.2 atau yang lebih baru.
package main
import (
"encoding/base64"
"fmt"
"os"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Dapatkan kredensial akses sementara dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Buat instance OSSClient.
// Ganti yourEndpoint dengan Endpoint bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, tentukan Endpoint yang sesuai.
// Ganti yourRegion dengan ID wilayah Alibaba Cloud umum, seperti cn-hangzhou.
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("yourRegion"))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan nama bucket, misalnya examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan nama file video hasil penggabungan.
targetObject := "dest.mp4"
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan nama file video sumber.
sourcevideo := "src.mp4"
// Tentukan nama file video yang akan digabungkan.
video1 := "concat1.mp4"
video2 := "concat2.mp4"
// Bangun string gaya pemrosesan video dan parameter penggabungan video.
style := fmt.Sprintf("video/concat,ss_0,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_%s/sur,o_%s,t_0", strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(video1)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(video2)), "="))
// Bangun instruksi pemrosesan asinkron.
process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify,topic_QXVkaW9Db252ZXJ0", style, strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(bucketName)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetObject)), "="))
fmt.Printf("%#v\n", process)
rs, err := bucket.AsyncProcessObject(sourcevideo, process)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("EventId:%s\n", rs.EventId)
fmt.Printf("RequestId:%s\n", rs.RequestId)
fmt.Printf("TaskId:%s\n", rs.TaskId)
}
Permintaan pemrosesan asinkron tidak mengembalikan hasil pemrosesan. Untuk mendapatkan hasil tugas asinkron, gunakan Simple Message Queue (SMQ), sebelumnya dikenal sebagai MNS. Untuk informasi selengkapnya, lihat Notifikasi pesan.
Deskripsi parameter
Aksi: video/concat
Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter penggabungan
Operasi video/concat menggabungkan video sesuai urutan kemunculan pre dan sur dalam string permintaan. Detailnya sebagai berikut:
-
/pre: File video yang digabungkan di awal. -
/sur: File video yang digabungkan di akhir.
|
Parameter |
Tipe |
Wajib |
Deskripsi |
|
ss |
int |
Tidak |
Waktu mulai untuk menggabungkan video awalan atau akhiran, dalam milidetik. Nilai yang valid:
|
|
t |
int |
Tidak |
Durasi untuk menggabungkan video awalan atau akhiran, dalam milidetik. Nilai yang valid:
|
|
o |
string |
Ya |
Objek OSS dalam bucket saat ini. Nama objek harus di-encode dengan Base64 URL-safe. |
Parameter transcoding
|
Parameter |
Tipe |
Wajib |
Deskripsi |
|
ss |
int |
Tidak |
Waktu mulai transcoding untuk video yang sedang digabungkan, dalam milidetik. Nilai yang valid:
|
|
t |
int |
Tidak |
Durasi transcoding untuk video yang sedang digabungkan, dalam milidetik. Nilai yang valid:
|
|
f |
string |
Ya |
Kontainer video. Nilai yang valid:
|
|
vn |
int |
Tidak |
Menentukan apakah aliran video dinonaktifkan. Nilai yang valid:
|
|
vcodec |
string |
Ya |
Kodek video (format encoding). Nilai yang valid:
Catatan
Format mxf dan flv tidak mendukung H.265. |
|
fps |
float |
Tidak |
Laju bingkai video. Secara default, parameter ini sama dengan laju bingkai video sumber yang ditentukan oleh align. Rentang nilai adalah 0 hingga 240. |
|
fpsopt |
int |
Tidak |
Opsi laju bingkai video. Nilai yang valid:
Catatan
Parameter ini harus dikonfigurasi bersama dengan fps. |
|
pixfmt |
string |
Tidak |
Format pengambilan sampel piksel. Secara default, parameter ini sama dengan format video sumber yang ditentukan oleh align. Nilai yang valid:
|
|
s |
string |
Tidak |
Resolusi.
|
|
sopt |
int |
Tidak |
Opsi resolusi. Nilai yang valid:
Catatan
Parameter ini harus dikonfigurasi bersama dengan s. |
|
scaletype |
string |
Tidak |
Metode penskalaan. Nilai yang valid:
|
|
arotate |
int |
Tidak |
Rotasi otomatis arah resolusi. Nilai yang valid:
|
|
g |
int |
Tidak |
Ukuran Group of Pictures (GOP). Nilai default adalah 150. Rentang nilai adalah 1 hingga 100000. |
|
vb |
int |
Tidak |
Bitrate video, dalam bit per detik (bps). Rentang nilai adalah 10000 hingga 100000000. Catatan
Parameter ini saling eksklusif dengan crf. Keduanya merepresentasikan algoritma kontrol bitrate yang berbeda. Jika keduanya tidak diatur, video di-encode dengan bitrate default untuk resolusi output. |
|
vbopt |
int |
Tidak |
Opsi bitrate video. Nilai yang valid:
Catatan
Parameter ini harus dikonfigurasi bersama dengan vb. |
|
crf |
float |
Tidak |
Faktor laju konstan (constant rate factor). Rentang nilai adalah 0 hingga 51. Nilai yang lebih besar menunjukkan kualitas gambar yang lebih rendah. Kami merekomendasikan nilai antara 18 hingga 38. |
|
maxrate |
int |
Tidak |
Bitrate maksimum, dalam bit per detik (bps). Nilai default adalah 0. Rentang nilai adalah 10000 hingga 100000000. Catatan
Parameter ini harus dikonfigurasi bersama dengan crf. |
|
bufsize |
int |
Tidak |
Ukuran buffer, dalam bit. Nilai default adalah 0. Rentang nilai adalah 10000 hingga 200000000. Catatan
Parameter ini harus dikonfigurasi bersama dengan crf. |
|
an |
int |
Tidak |
Menentukan apakah aliran audio dinonaktifkan. Nilai yang valid:
|
|
acodec |
string |
Ya |
Kodek audio (format encoding). Nilai yang valid:
Catatan
mp4 tidak mendukung pcm. mov tidak mendukung flac atau opus. asf tidak mendukung opus. avi tidak mendukung opus. mxf hanya mendukung pcm. ts tidak mendukung flac, vorbis, amr, atau pcm. flv tidak mendukung flac, vorbis, amr, opus, atau pcm. |
|
ar |
int |
Tidak |
Laju pengambilan sampel audio. Secara default, parameter ini sama dengan laju pengambilan sampel video sumber yang ditentukan oleh align. Nilai yang valid:
Catatan
Laju sampel yang didukung bervariasi tergantung format. mp3 hanya mendukung hingga 48 kHz. opus mendukung 8 kHz, 12 kHz, 16 kHz, 24 kHz, dan 48 kHz. ac3 mendukung 32 kHz, 44.1 kHz, dan 48 kHz. amr hanya mendukung 8 kHz dan 16 kHz. |
|
ac |
int |
Tidak |
Jumlah saluran suara. Secara default, parameter ini sama dengan jumlah saluran video sumber yang ditentukan oleh align. Rentang nilai adalah 1 hingga 8. Catatan
Jumlah saluran yang didukung bervariasi tergantung format. mp3 hanya mendukung mono dan stereo. ac3 mendukung hingga 6 saluran (5.1). amr hanya mendukung mono. |
|
aq |
int |
Tidak |
Kualitas kompresi audio. Rentang nilai adalah 0 hingga 100. Catatan
Parameter ini saling eksklusif dengan ab. Jika keduanya tidak diatur, audio di-encode dengan bitrate default dari penyandi. |
|
ab |
int |
Tidak |
Bitrate audio, dalam bit per detik (bps). Rentang nilai adalah 1000 hingga 10000000. |
|
abopt |
string |
Tidak |
Opsi bitrate audio. Nilai yang valid:
Catatan
Parameter ini harus dikonfigurasi bersama dengan ab. |
|
align |
int |
Tidak |
Nomor urut file video utama (yang menyediakan parameter transcoding default) dalam daftar penggabungan. Nilai default adalah 0, yang sejajar dengan file video pertama dalam daftar penggabungan. |
|
adepth |
int |
Tidak |
Kedalaman bit pengambilan sampel audio. Nilai yang valid: 16 atau 24. Catatan
Parameter ini hanya berlaku ketika acodec diatur ke flac. |
Penggabungan video juga menggunakan parameter sys/saveas dan notify. Untuk informasi selengkapnya, lihat Simpan sebagai dan Notifikasi pesan.
Parameter sharding media
/segment: Parameter sharding
|
Parameter |
Type |
Wajib |
Deskripsi |
|
f |
string |
Ya |
Format sharding. Nilai yang valid:
|
|
t |
int |
Ya |
Panjang shard, dalam milidetik. Rentang nilai adalah 0 hingga 3600000. |
Sharding media hanya mendukung kontainer mp4 dan ts.
Operasi API terkait
Gabungkan video menjadi file MP4
Informasi penggabungan
-
Nama video sumber: pre.mov, example.mkv, sur.mov
-
Durasi dan urutan penggabungan:
Nama video
Pesanan
Durasi
pre.mov
1
Seluruh video
example.mkv
2
Dari detik ke-10 hingga akhir
sur.mov
3
Dari awal hingga detik ke-10
-
Notifikasi penyelesaian transcoding: Pesan MNS dikirim.
-
Informasi video hasil penggabungan
-
Format video: h264
-
Laju bingkai video: 25 fps
-
Bitrate video: 1 Mbps
-
Format audio: aac
-
Konfigurasi audio: laju sampel 48 kHz, dual channel
-
Bitrate audio: 96 Kbps
-
-
Jalur penyimpanan file
-
File MP4: oss://outbucket/outobj.mp4
-
Contoh pemrosesan
// Gabungkan file video example.mkv.
POST /example.mkv?x-oss-async-process HTTP/1.1
Host: video-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e
x-oss-async-process=video/concat,ss_10000,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_cHJlLm1vdgo/sur,o_c3VyMS5hYWMK,t_10000|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqLnthdXRvZXh0fQo/notify,topic_QXVkaW9Db252ZXJ0
Izin
Akun Alibaba Cloud memiliki semua izin secara default. Pengguna Resource Access Management (RAM) atau Peran RAM tidak memiliki izin apa pun secara default. Anda harus memberikan izin kepada pengguna RAM atau Peran RAM menggunakan kebijakan RAM atau kebijakan bucket.
|
API |
Aksi |
Deskripsi |
|
GetObject |
|
Mengunduh objek. |
|
|
Saat mengunduh objek, jika Anda menentukan versi objek melalui versionId, izin ini diperlukan. |
|
|
|
Saat mengunduh objek, jika metadata objek berisi X-Oss-Server-Side-Encryption: KMS, izin ini diperlukan. |
|
API |
Aksi |
Deskripsi |
|
HeadObject |
|
Meminta metadata objek. |
|
API |
Aksi |
Deskripsi |
|
PutObject |
|
Mengunggah objek. |
|
|
Diperlukan jika Anda menentukan tag objek menggunakan header |
|
|
|
Diperlukan jika header |
|
|
|
|
API |
Tindakan |
Deskripsi |
|
CreateMediaConvertTask |
|
Izin untuk menggunakan IMM dalam transcoding media. |
Penagihan
Selama proses penggabungan video, karena layanan IMM dipanggil, item yang dapat ditagih dihasilkan baik untuk OSS maupun IMM. Detailnya sebagai berikut:
-
Sisi OSS: Anda perlu memanggil operasi GetObject dan menambahkan parameter x-oss-async-process untuk menggabungkan video. Anda juga perlu memanggil operasi HeadObject untuk mengambil metadata objek. Setelah penggabungan, operasi PutObject dipanggil untuk mengunggah video hasil ke bucket. Item yang dapat ditagih berikut dihasilkan. Untuk detail harga, lihat Harga OSS:
API
Item yang dapat ditagih
Deskripsi
GetObject
Permintaan GET
Anda dikenakan biaya permintaan berdasarkan jumlah permintaan yang berhasil.
Lalu lintas keluar melalui Internet
Jika Anda memanggil operasi GetObject menggunakan titik akhir publik, seperti oss-cn-hangzhou.aliyuncs.com, atau titik akhir percepatan, seperti oss-accelerate.aliyuncs.com, Anda dikenakan biaya lalu lintas keluar melalui Internet berdasarkan ukuran data.
Pengambilan data objek IA
Jika objek IA diambil, Anda dikenakan biaya pengambilan data IA berdasarkan ukuran data IA yang diambil.
Pengambilan objek Archive dalam bucket yang diaktifkan akses real-time
Jika Anda mengambil objek Archive dalam bucket yang diaktifkan akses real-time, Anda dikenakan biaya pengambilan data Archive berdasarkan ukuran objek Archive yang diambil.
Biaya akselerasi transfer
Jika Anda mengaktifkan akselerasi transfer dan menggunakan titik akhir percepatan untuk mengakses bucket Anda, Anda dikenakan biaya akselerasi transfer berdasarkan ukuran data.
API
Item yang dapat ditagih
Deskripsi
PutObject
Permintaan PUT
Anda dikenakan biaya permintaan berdasarkan jumlah permintaan yang berhasil.
Biaya penyimpanan
Anda dikenakan biaya penyimpanan berdasarkan kelas penyimpanan, ukuran, dan durasi penyimpanan objek.
API
Item yang dapat ditagih
Deskripsi
HeadObject
Permintaan GET
Anda dikenakan biaya permintaan berdasarkan jumlah permintaan yang berhasil.
-
Sisi IMM: Item yang dapat ditagih berikut dihasilkan. Untuk detail harga, lihat Item yang dapat ditagih IMM:
API
Item yang dapat ditagih
Deskripsi
CreateMediaConvertTask
Biaya Pemrosesan Media ApsaraVideo
Biaya Pemrosesan Media ApsaraVideo dihitung berdasarkan definisi dan durasi aktual (dalam detik) video hasil penggabungan.
Catatan
-
Penggabungan video hanya mendukung pemrosesan asinkron (menggunakan metode x-oss-async-process).
-
Akses anonim akan ditolak.
-
Saat transcoding dengan laju sampel default atau jumlah saluran suara, penggabungan mungkin gagal karena masalah kompatibilitas dengan kontainer video target.
-
Maksimal 11 video dapat digabungkan sekaligus.