Fitur penggabungan video memungkinkan Anda menggabungkan beberapa video menjadi satu video tunggal dan mengonversinya ke format yang ditentukan.
Perkenalan fitur
Penggabungan video adalah kemampuan untuk menggabungkan beberapa klip video menjadi satu video lengkap dan mengonversinya ke format yang diperlukan.

Skenario
Film production: Dalam proses produksi film, serial TV, dan film pendek, penggabungan video merupakan salah satu langkah inti yang membantu editor mengintegrasikan berbagai potongan gambar dan adegan untuk membangun struktur narasi yang lengkap.
Content creation: Di platform media sosial video pendek, pembuat konten sering menggunakan teknologi penggabungan video untuk menghasilkan vlog, tutorial, atau video bertema, meningkatkan daya tarik dan visibilitas konten mereka.
Pendidikan dan pelatihan: Guru dan pelatih dapat membuat video instruksional dengan menggabungkan klip video yang berbeda untuk mengombinasikan teori dan praktik, sehingga mendorong pemahaman dan pembelajaran siswa.
Tayangan ulang acara olahraga: Dalam siaran olahraga, teknologi penggabungan video digunakan untuk menghasilkan cuplikan sorotan guna membantu penonton meninjau momen-momen menarik dalam acara tersebut.
Cara menggunakan
Prasyarat
Layanan Intelligent Media Management (IMM) telah diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan sebuah produk.
Sebuah proyek IMM telah disambungkan. Untuk menyambungkan proyek di Konsol Object Storage Service (OSS), lihat Langkah 1: Sambungkan 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 dari 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 gabungan.
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.
// Saat instance OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Enkode 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 yang sesuai untuk 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, seperti examplebucket.
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)
# Tentukan nama video gabungan.
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 dari bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, tentukan Endpoint sebenarnya.
// 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, seperti examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan nama file video gabungan.
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 dari tugas asinkron, gunakan Simple Message Queue (SMQ), sebelumnya dikenal sebagai MNS. Untuk informasi lebih lanjut, lihat Notifikasi pesan.
Deskripsi parameter
Aksi: video/concat
Tabel berikut menjelaskan parameter.
Parameter penggabungan
Operasi video/concat menggabungkan video dalam urutan kemunculan pre dan sur di dalam string permintaan. Detailnya adalah sebagai berikut:
/pre: File video untuk digabungkan di awal./sur: File video untuk digabungkan di akhir.
Parameter | Tipe | Diperlukan | 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 di bucket saat ini. Nama objek harus dienkripsi menggunakan Base64 URL-safe. |
Parameter transkoding
Parameter | Tipe | Diperlukan | Deskripsi |
ss | int | Tidak | Waktu mulai Transkoding untuk video yang sedang digabungkan, dalam milidetik. Nilai yang valid:
|
t | int | Tidak | Durasi transkoding untuk video yang digabungkan, dalam milidetik. Nilai yang valid:
|
f | string | Ya | Kontainer video. Nilai yang valid:
|
vn | int | Tidak | Menentukan apakah akan menonaktifkan aliran video. 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 yang ada pada 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 dengan fps. |
pixfmt | string | Tidak | Format pengambilan sampel piksel. Secara default, parameter ini sama dengan yang ditentukan oleh video sumber melalui align. Nilai yang valid:
|
s | string | Tidak | Resolusi.
|
sopt | int | Tidak | Opsi resolusi. Nilai yang valid:
Catatan Parameter ini harus dikonfigurasi 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 10.000 hingga 100.000.000. Catatan Parameter ini saling eksklusif dengan crf. Mereka mewakili algoritma kontrol bitrate yang berbeda. Jika tidak ada yang diatur, video dikodekan pada bitrate default untuk resolusi keluaran. |
vbopt | int | Tidak | Opsi bitrate video. Nilai yang valid:
Catatan Parameter ini harus dikonfigurasi dengan vb. |
crf | float | Tidak | Faktor laju konstan. Rentang nilai adalah 0 hingga 51. Nilai yang lebih besar menunjukkan kualitas citra yang lebih rendah. Kami merekomendasikan nilai dari 18 hingga 38. |
maxrate | int | Tidak | Bitrate maksimum, dalam bit per detik (bps). Nilai default adalah 0. Rentang nilai adalah 10.000 hingga 100.000.000. Catatan Parameter ini harus dikonfigurasi dengan crf. |
bufsize | int | Tidak | Ukuran buffer, dalam bit. Nilai defaultnya adalah 0. Rentang nilai adalah 10.000 hingga 200.000.000. Catatan Parameter ini harus dikonfigurasi dengan crf. |
sebuah | int | Tidak | Menentukan apakah akan menonaktifkan aliran audio. 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 yang ditentukan oleh video sumber pada align. Nilai yang valid:
Catatan Laju sampel yang didukung bervariasi menurut format. mp3 hanya mendukung 48 kHz dan lebih rendah. 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 yang ada di video sumber yang ditentukan oleh align. Rentang nilainya adalah 1 hingga 8. Catatan Jumlah saluran yang didukung bervariasi menurut 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 tidak ada yang diatur, audio dikodekan pada bitrate default dari penyandi. |
ab | int | Tidak | Bitrate audio, dalam bit per detik (bps). Rentang nilai adalah 1.000 hingga 10.000.000. |
abopt | string | Tidak | Opsi bitrate audio. Nilai yang valid:
Catatan Parameter ini harus dikonfigurasi dengan ab. |
align | int | Tidak | Nomor urut file video utama (yang menyediakan parameter transcoding default) dalam daftar penggabungan. Nilai default adalah 0, yang sesuai 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 valid ketika acodec diatur ke flac. |
Penyambungan video juga menggunakan parameter sys/saveas dan notify. Untuk informasi lebih lanjut, lihat Save as dan Message notifications.
Parameter sharding media
/segment: Parameter sharding
Parameter | Tipe | Diperlukan | Deskripsi |
f | string | Ya | Format sharding. Nilai yang valid:
|
t | int | Ya | Panjang shard, dalam milidetik. Rentang nilai adalah 0 hingga 3.600.000. |
Sharding media hanya mendukung kontainer mp4 dan ts.
Operasi API terkait
Menggabungkan video menjadi file MP4
Informasi penggabungan
Nama video sumber: pre.mov, example.mkv, sur.mov
Durasi dan urutan penggabungan:
Nama video
Urutan
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 transkoding: Pesan MNS dikirim.
Informasi video tergabung
Format video: h264
Laju frame video: 25 fps
Bitrate video: 1 Mbps
Format audio: aac
Konfigurasi audio: Laju sampel 48 kHz, saluran ganda
Bitrate audio: 96 Kbps
Path penyimpanan file:
File MP4: oss://outbucket/outobj.mp4
Contoh pemrosesan
// Menggabungkan 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_QXVkaW9Db252ZXJ0Izin
Sebuah Akun Alibaba Cloud memiliki semua izin secara default. Seorang 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 | Definisi |
GetObject |
| Mengunduh sebuah objek. |
| Saat mengunduh sebuah objek, jika Anda menentukan versi objek melalui versionId, izin ini diperlukan. | |
| Saat mengunduh sebuah objek, jika metadata objek berisi X-Oss-Server-Side-Encryption: KMS, izin ini diperlukan. |
API | Aksi | Definisi |
HeadObject |
| Memeriksa metadata dari sebuah objek. |
API | Aksi | Definisi |
PutObject |
| Mengunggah sebuah objek. |
| Saat mengunggah sebuah objek, jika Anda menentukan tag objek melalui | |
| Saat mengunggah sebuah objek, jika metadata objek berisi | |
|
API | Tindakan | Definisi |
CreateMediaConvertTask |
| Izin untuk menggunakan IMM untuk transkoding media. |
Penagihan
Selama penggabungan video, karena layanan IMM dipanggil, item yang dapat ditagih dihasilkan untuk OSS dan IMM. Detailnya adalah 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 yang dihasilkan ke bucket. Item yang dapat ditagih berikut ini dihasilkan. Untuk harga terperinci, 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 akan dikenakan biaya lalu lintas keluar melalui Internet berdasarkan ukuran data.
Pengambilan objek IA
Jika objek IA diambil, Anda akan dikenakan biaya pengambilan data IA berdasarkan ukuran data IA yang diambil.
Pengambilan objek Arsip dalam bucket dengan akses real-time diaktifkan
Jika Anda mengambil objek Arsip dalam bucket dengan akses real-time diaktifkan, Anda akan dikenakan biaya pengambilan data Arsip berdasarkan ukuran objek Arsip yang diambil.
Biaya akselerasi transfer
Jika Anda mengaktifkan akselerasi transfer dan menggunakan titik akhir percepatan untuk mengakses bucket Anda, Anda akan 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.
Sisi IMM: Item yang dapat ditagih berikut ini dihasilkan. Untuk harga terperinci, 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 sebenarnya (dalam detik) dari video yang digabungkan.
Catatan
Penggabungan video hanya mendukung pemrosesan asinkron (menggunakan metode x-oss-async-process).
Akses anonim akan ditolak.
Saat melakukan transkoding dengan laju sampel default atau jumlah saluran suara, penggabungan mungkin gagal karena masalah kompatibilitas dengan Kontainer video target.
Maksimum 11 video dapat digabungkan dalam satu waktu.