All Products
Search
Document Center

Object Storage Service:Apa itu penggabungan audio

Last Updated:Mar 20, 2026

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 oleh align. Ketidaksesuaian antara nilai default dan format kontainer target dapat menyebabkan penggabungan gagal—tentukan ar dan ac secara 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/concat

Parameter untuk penggabungan

Penanda /pre dan /sur masing-masing merepresentasikan satu klip audio. Setiap penanda diikuti oleh satu atau beberapa parameter yang menjelaskan klip tersebut.

ParameterTipeWajibDeskripsi
ostringYaNama objek audio di bucket OSS. Harus di-encode dalam Base64 yang aman untuk URL.
ssintTidakOffset awal dalam milidetik. 0 = dari awal (default). Nilai lebih besar dari 0 = mulai dari titik tersebut dalam audio sumber.
tintTidakDurasi 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.

ParameterTipeWajibDeskripsi
fstringYaFormat kontainer audio output. Nilai valid: mp3, aac, flac, oga, ac3, opus, amr.
ssintTidakOffset awal untuk transkoding dalam milidetik. 0 = dari awal (default).
tintTidakDurasi yang akan ditranskode dalam milidetik. 0 = hingga akhir audio gabungan (default).
arintTidakLaju 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.
acintTidakJumlah saluran suara. Default mengikuti jumlah saluran audio sumber yang diidentifikasi oleh align. Nilai valid: 18. Lihat batasan spesifik format di bawah.
abintTidakBitrate audio target dalam bit/s. Nilai valid: 100010000000. Saling eksklusif dengan aq. Jika keduanya dihilangkan, bitrate default kodek akan digunakan.
aqintTidakKualitas kompresi audio. Nilai valid: 0100. Saling eksklusif dengan ab. Jika keduanya dihilangkan, bitrate default kodek akan digunakan.
aboptstringTidakPenanganan 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.
alignintTidakIndeks (berbasis 0) dari audio sumber yang digunakan sebagai acuan untuk parameter transkoding default. Default: 0 (klip pertama dalam daftar).
adepthintTidakKedalaman bit pengambilan sampel audio output. Nilai valid: 16, 24. Hanya berlaku saat f adalah flac.

Batasan spesifik format

FormatLaju pengambilan sampel maksimumJumlah saluran maksimum
MP348 kHz2
Opus8, 12, 16, 24, atau 48 kHz
AC332, 44.1, atau 48 kHz6 (5.1)
AMR8 atau 16 kHz1

Parameter tambahan

Gunakan parameter berikut bersama audio/concat:

  • sys/saveas — menulis output ke objek OSS tertentu. Parameter: b_<bucket> dan o_<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 audioOrderSegmen yang digunakan
pre1.mp31Durasi penuh
pre2.wav22 detik pertama
example.oga3Durasi penuh
sur1.aac4Detik 4–10
sur2.wma5Dari 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_QXVkaW9Db252ZXJ0

Contoh 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