Penggabungan audio menggabungkan beberapa objek audio yang disimpan di OSS menjadi satu file output. Setiap klip sumber ditempatkan secara berurutan sesuai urutan yang Anda tentukan, lalu ditranskode ke format target dalam satu operasi asinkron.
Fitur ini memungkinkan Anda mengotomatiskan tugas pasca-produksi—seperti menyusun bab-bab narasi, menggabungkan rekaman multi-track, atau menyambungkan dialog dan suara latar—tanpa perlu menjalankan alat pemrosesan audio lokal.
Kasus penggunaan
Produksi musik: Gabungkan rekaman instrumen dan vokal individual menjadi satu track lengkap.
Produksi buku audio: Sambungkan bab-bab narasi menjadi satu file audio utuh yang mulus.
Pasca-produksi film dan TV: Susun dialog, voice-over, suara latar, dan musik menjadi satu campuran audio terpadu.
Konten media sosial: Tumpuk efek suara, voice-over, dan audio latar untuk memperkaya konten video.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Memiliki bucket OSS yang dikaitkan dengan proyek Intelligent Media Management (IMM). Lihat Quick start (Konsol OSS) atau AttachOSSBucket (API IMM) untuk petunjuk penyiapan.
Memiliki izin yang diperlukan untuk menggunakan penggabungan audio. Lihat Permissions.
Memiliki akses terautentikasi—permintaan anonim akan ditolak.
Cara kerja
Penggabungan audio menggunakan aksi audio/concat dengan header x-oss-async-process. Semua permintaan bersifat asinkron.
Urutan klip dikendalikan oleh penanda /pre dan /sur dalam string permintaan:
/pre— menempatkan klip sebelum semua klip yang telah disebutkan sebelumnya./sur— menempatkan klip setelah semua klip yang telah disebutkan sebelumnya.
Urutan entri /pre dan /sur dalam string permintaan menentukan urutan output akhir. Setiap klip juga dapat dipangkas menggunakan parameter ss (offset awal) dan t (durasi) sebelum digabungkan.
Setelah penggabungan, audio hasil digabung ditranskode ke format output yang Anda tentukan. Gunakan sys/saveas untuk menulis hasil ke objek OSS target, dan notify untuk menerima notifikasi penyelesaian.
Anda dapat menggabungkan hingga 11 objek audio per permintaan.
Jika Anda membiarkan laju pengambilan sampel (ar) atau jumlah saluran suara (ac) pada nilai default-nya, output akan mewarisi nilai-nilai ini dari audio sumber yang diidentifikasi olehalign. Ketidaksesuaian antara nilai default dan format kontainer target dapat menyebabkan penggabungan gagal—tentukanardanacsecara eksplisit untuk menghindari hal ini.
Gabungkan objek audio
Quick start
Contoh Python berikut menggabungkan dua file MP3 dan menyimpan hasilnya sebagai file AAC. Gunakan sebagai titik awal, lalu sesuaikan parameter sesuai kebutuhan Anda.
Diperlukan OSS SDK for Python V2.18.4 atau versi lebih baru. Atur variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET sebelum menjalankan kode ini.
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Muat kredensial akses dari variabel lingkungan.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Tentukan titik akhir wilayah tempat bucket berada.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Tentukan ID wilayah. Contoh: cn-hangzhou.
region = 'cn-hangzhou'
bucket_name = 'examplebucket'
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# Tentukan nama objek audio output.
target_audio = 'dest.aac'
# Tentukan objek audio sumber yang akan digabungkan.
audio1 = 'src1.mp3'
audio2 = 'src2.mp3'
# Encode nama objek audio sumber dalam Base64 yang aman untuk URL.
audio1_encoded = base64.urlsafe_b64encode(audio1.encode()).decode().rstrip('=')
audio2_encoded = base64.urlsafe_b64encode(audio2.encode()).decode().rstrip('=')
# Bangun string proses audio/concat.
style = f"audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_{audio1_encoded}/pre,o_{audio2_encoded},t_0"
# Tambahkan parameter sys/saveas dan notify.
bucket_encoded = base64.urlsafe_b64encode(bucket_name.encode()).decode().rstrip('=')
target_encoded = base64.urlsafe_b64encode(target_audio.encode()).decode().rstrip('=')
process = f"{style}|sys/saveas,b_{bucket_encoded},o_{target_encoded}/notify,topic_QXVkaW9Db252ZXJ0"
# Kirim tugas penggabungan asinkron.
try:
result = bucket.async_process_object(audio1, 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()Untuk contoh Java dan Go, lihat SDK examples.
Action
audio/concatParameter untuk penggabungan
Penanda /pre dan /sur masing-masing merepresentasikan satu klip audio. Setiap penanda diikuti oleh satu atau beberapa parameter yang menjelaskan klip tersebut.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
o | string | Ya | Nama objek audio di bucket OSS. Harus di-encode dalam Base64 yang aman untuk URL. |
ss | int | Tidak | Offset awal dalam milidetik. 0 = dari awal (default). Nilai lebih besar dari 0 = mulai dari titik tersebut dalam audio sumber. |
t | int | Tidak | Durasi dalam milidetik. 0 = hingga akhir audio sumber (default). Nilai lebih besar dari 0 = gunakan hanya selama milidetik tersebut. |
Parameter untuk transkoding
Parameter berikut berlaku untuk output gabungan secara keseluruhan.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
f | string | Ya | Format kontainer audio output. Nilai valid: mp3, aac, flac, oga, ac3, opus, amr. |
ss | int | Tidak | Offset awal untuk transkoding dalam milidetik. 0 = dari awal (default). |
t | int | Tidak | Durasi yang akan ditranskode dalam milidetik. 0 = hingga akhir audio gabungan (default). |
ar | int | Tidak | Laju pengambilan sampel audio output dalam Hz. Default mengikuti laju pengambilan sampel audio sumber yang diidentifikasi oleh align. Nilai valid: 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000. Lihat batasan spesifik format di bawah. |
ac | int | Tidak | Jumlah saluran suara. Default mengikuti jumlah saluran audio sumber yang diidentifikasi oleh align. Nilai valid: 1–8. Lihat batasan spesifik format di bawah. |
ab | int | Tidak | Bitrate audio target dalam bit/s. Nilai valid: 1000–10000000. Saling eksklusif dengan aq. Jika keduanya dihilangkan, bitrate default kodek akan digunakan. |
aq | int | Tidak | Kualitas kompresi audio. Nilai valid: 0–100. Saling eksklusif dengan ab. Jika keduanya dihilangkan, bitrate default kodek akan digunakan. |
abopt | string | Tidak | Penanganan bitrate ketika bitrate klip sumber lebih rendah daripada ab. Memerlukan ab. Nilai valid: 0 = selalu gunakan ab (default), 1 = gunakan bitrate yang lebih rendah, 2 = kembalikan kegagalan. |
align | int | Tidak | Indeks (berbasis 0) dari audio sumber yang digunakan sebagai acuan untuk parameter transkoding default. Default: 0 (klip pertama dalam daftar). |
adepth | int | Tidak | Kedalaman bit pengambilan sampel audio output. Nilai valid: 16, 24. Hanya berlaku saat f adalah flac. |
Batasan spesifik format
| Format | Laju pengambilan sampel maksimum | Jumlah saluran maksimum |
|---|---|---|
| MP3 | 48 kHz | 2 |
| Opus | 8, 12, 16, 24, atau 48 kHz | — |
| AC3 | 32, 44.1, atau 48 kHz | 6 (5.1) |
| AMR | 8 atau 16 kHz | 1 |
Parameter tambahan
Gunakan parameter berikut bersama audio/concat:
sys/saveas— menulis output ke objek OSS tertentu. Parameter:b_<bucket>dano_<object>(keduanya di-encode dalam Base64 yang aman untuk URL). Lihat sys/saveas.notify— mengirim notifikasi penyelesaian. Parameter:topic_<topic>(di-encode dalam Base64 yang aman untuk URL). Lihat Message notification.
Contoh
Gabungkan lima klip menjadi file AAC (REST API)
Contoh ini menggabungkan lima objek audio sumber dalam format berbeda menjadi satu output AAC dengan saluran mono, laju pengambilan sampel 44,1 kHz, dan bitrate 96 Kbit/s. Notifikasi Simple Message Queue (SMQ) dikirim saat tugas selesai.
Klip sumber dan urutan penggabungan
| Objek audio | Order | Segmen yang digunakan |
|---|---|---|
| pre1.mp3 | 1 | Durasi penuh |
| pre2.wav | 2 | 2 detik pertama |
| example.oga | 3 | Durasi penuh |
| sur1.aac | 4 | Detik 4–10 |
| sur2.wma | 5 | Dari detik 10 hingga akhir |
Output
Format: AAC
Laju pengambilan sampel: 44,1 kHz, mono
Bitrate: 96 Kbit/s
Tujuan:
oss://outbucket/outobj.aac
Semua nama objek di bawah ini di-encode dalam Base64 yang aman untuk URL. Parameter align_2 menetapkan properti transkoding default dari example.oga (indeks 2).
POST /example.oga?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=audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_cHJlMS5tcDMK/pre,o_cHJlMi53YXYK,t_2000/sur,o_c3VyMS5hYWMK,ss_4000,t_10000/sur,o_c3VyMi53bWEK,ss_10000|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqLnthdXRvZXh0fQo/notify,topic_QXVkaW9Db252ZXJ0Contoh SDK
OSS SDK hanya mendukung penggabungan audio untuk Java, Python, dan Go.
Java
Diperlukan OSS SDK for Java V3.17.4 atau versi 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.nio.charset.StandardCharsets;
import java.util.Base64;
public class Demo {
public static void main(String[] args) throws ClientException {
// Tentukan titik akhir wilayah tempat bucket berada.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Tentukan ID wilayah. Contoh: cn-hangzhou.
String region = "cn-hangzhou";
// Muat kredensial akses dari variabel lingkungan.
// Atur OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET sebelum menjalankan kode ini.
EnvironmentVariableCredentialsProvider credentialsProvider =
CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket.
String bucketName = "examplebucket";
// Tentukan nama objek audio output.
String targetAudio = "dest.aac";
// Tentukan objek audio sumber yang akan digabungkan.
String audio1 = "src1.mp3";
String audio2 = "src2.mp3";
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Encode nama objek audio sumber dalam Base64 yang aman untuk URL.
String audio1Encoded = Base64.getUrlEncoder()
.encodeToString(audio1.getBytes(StandardCharsets.UTF_8)).replace("=", "");
String audio2Encoded = Base64.getUrlEncoder()
.encodeToString(audio2.getBytes(StandardCharsets.UTF_8)).replace("=", "");
// Bangun string proses audio/concat.
String style = String.format(
"audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_%s/pre,o_%s,t_0",
audio1Encoded, audio2Encoded);
// Tambahkan parameter sys/saveas dan notify.
String bucketEncoded = Base64.getUrlEncoder()
.encodeToString(bucketName.getBytes(StandardCharsets.UTF_8)).replace("=", "");
String targetEncoded = Base64.getUrlEncoder()
.encodeToString(targetAudio.getBytes(StandardCharsets.UTF_8)).replace("=", "");
String process = String.format(
"%s|sys/saveas,b_%s,o_%s/notify,topic_QXVkaW9Db252ZXJ0",
style, bucketEncoded, targetEncoded);
// Kirim tugas penggabungan asinkron.
AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, audio1, process);
AsyncProcessObjectResult response = ossClient.asyncProcessObject(request);
System.out.println("EventId: " + response.getEventId());
System.out.println("RequestId: " + response.getRequestId());
System.out.println("TaskId: " + response.getTaskId());
} finally {
ossClient.shutdown();
}
}
}Python
Diperlukan OSS SDK for Python V2.18.4 atau versi lebih baru.
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Muat kredensial akses dari variabel lingkungan.
# Atur OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET sebelum menjalankan kode ini.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Tentukan titik akhir wilayah tempat bucket berada.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Tentukan ID wilayah. Contoh: cn-hangzhou.
region = 'cn-hangzhou'
bucket_name = 'examplebucket'
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# Tentukan nama objek audio output.
target_audio = 'dest.aac'
# Tentukan objek audio sumber yang akan digabungkan.
audio1 = 'src1.mp3'
audio2 = 'src2.mp3'
# Encode nama objek audio sumber dalam Base64 yang aman untuk URL.
audio1_encoded = base64.urlsafe_b64encode(audio1.encode()).decode().rstrip('=')
audio2_encoded = base64.urlsafe_b64encode(audio2.encode()).decode().rstrip('=')
# Bangun string proses audio/concat.
style = f"audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_{audio1_encoded}/pre,o_{audio2_encoded},t_0"
# Tambahkan parameter sys/saveas dan notify.
bucket_encoded = base64.urlsafe_b64encode(bucket_name.encode()).decode().rstrip('=')
target_encoded = base64.urlsafe_b64encode(target_audio.encode()).decode().rstrip('=')
process = f"{style}|sys/saveas,b_{bucket_encoded},o_{target_encoded}/notify,topic_QXVkaW9Db252ZXJ0"
# Kirim tugas penggabungan asinkron.
try:
result = bucket.async_process_object(audio1, 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
Diperlukan OSS SDK for Go V3.0.2 atau versi lebih baru.
package main
import (
"encoding/base64"
"fmt"
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Muat kredensial akses dari variabel lingkungan.
// Atur OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_SESSION_TOKEN sebelum menjalankan kode ini.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Buat klien OSS.
// Tentukan titik akhir wilayah tempat bucket berada.
client, err := oss.New(
"https://oss-cn-hangzhou.aliyuncs.com", "", "",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan nama bucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan objek audio sumber yang akan digabungkan dan nama objek output.
audio1 := "src1.mp3"
audio2 := "src2.mp3"
targetAudio := "dest.aac"
// Encode nama objek audio sumber dalam Base64 yang aman untuk URL.
audio1Encoded := base64.URLEncoding.EncodeToString([]byte(audio1))
audio2Encoded := base64.URLEncoding.EncodeToString([]byte(audio2))
// Bangun string proses audio/concat.
style := fmt.Sprintf(
"audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_%s/pre,o_%s,t_0",
audio1Encoded, audio2Encoded,
)
// Tambahkan parameter sys/saveas dan notify.
bucketEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
targetEncoded := base64.URLEncoding.EncodeToString([]byte(targetAudio))
process := fmt.Sprintf(
"%s|sys/saveas,b_%s,o_%s/notify,topic_QXVkaW9Db252ZXJ0",
style, bucketEncoded, targetEncoded,
)
// Kirim tugas penggabungan asinkron.
result, err := bucket.AsyncProcessObject(audio1, process)
if err != nil {
log.Fatalf("Gagal mengirim tugas proses asinkron: %s", err)
}
fmt.Printf("EventId: %s\n", result.EventId)
fmt.Printf("RequestId: %s\n", result.RequestId)
fmt.Printf("TaskId: %s\n", result.TaskId)
}Langkah selanjutnya
sys/saveas — simpan output ke path objek OSS tertentu.
Message notification — terima callback saat tugas asinkron selesai.
Permissions — konfigurasikan kontrol akses untuk operasi pemrosesan audio.