All Products
Search
Document Center

ApsaraVideo Live:Main dan publikasikan audio eksternal (efek suara dan iringan)

Last Updated:Mar 26, 2026

Topik ini menjelaskan cara mencampurkan audio eksternal—seperti musik latar, efek suara, atau aliran audio PCM—ke dalam aliran audio ARTC SDK untuk pemutaran lokal dan berbagi jarak jauh selama sesi real-time.

Ikhtisar

ARTC SDK memungkinkan Anda memainkan dan mempublikasikan audio eksternal. SDK ini mendukung berbagai format file seperti MP4, WAV, dan AAC, serta aliran audio PCM. Anda dapat mengintegrasikan file yang telah direkam sebelumnya atau aliran data real-time, tergantung pada kasus penggunaan Anda.

Kasus penggunaan

  • Publikasi file audio: Sisipkan efek suara, musik latar, atau konten bersuara ke dalam siaran langsung. Misalnya, Anda dapat memicu notifikasi produk dalam siaran e-commerce atau menambahkan efek suara suasana dalam siaran game.

  • Publikasi aliran PCM: Ideal untuk layanan suara interaktif real-time, seperti mempublikasikan aliran audio PCM yang dihasilkan oleh teks-ke-ucapan (TTS) dalam sistem layanan pelanggan cerdas.

Kode contoh

Android: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/PlayAudioFiles/PlayAudioFilesActivity.java

iOS: iOS/ARTCExample/BasicUsage/PlayAudioFiles/PlayAudioFilesVC.swift

Harmony: Harmony/ARTCExample/entry/src/main/ets/pages/basicusage/PlayAudioFilesPage.ets.

Sebelum memulai

Sebelum mengimplementasikan fitur-fitur dalam topik ini, pastikan Anda memenuhi persyaratan berikut:

Main atau publikasikan file audio

Cara kerja

Fitur ini memungkinkan Anda memainkan atau mempublikasikan file audio selama sesi real-time. Fitur ini menyediakan dua set API untuk kasus penggunaan yang berbeda:

  • API iringan: Untuk memainkan file audio yang lebih panjang, seperti musik latar atau iringan musik. Anda hanya dapat memainkan satu file musik dalam satu waktu.

  • API efek suara: Dioptimalkan untuk memainkan klip audio pendek dan sementara, seperti tepuk tangan atau tawa. Anda dapat memainkan beberapa efek suara secara bersamaan.

Catatan

Sebelum memainkan atau mempublikasikan audio eksternal, Anda harus bergabung ke channel dan mempublikasikan aliran audio lokal Anda. Tunggu callback onAudioPublishStateChanged, yang mengonfirmasi bahwa aliran audio telah dipublikasikan.

API terkait adalah sebagai berikut:

Fitur

Accompaniment APIs

API efek suara

Kontrol pemutaran

  • startAudioAccompany

  • stopAudioAccompany

  • pauseAudioAccompany

  • resumeAudioAccompany

  • preloadAudioEffect

  • unloadAudioEffect

  • playAudioEffect

  • stopAudioEffect

  • stopAllAudioEffects

  • pauseAudioEffect

  • pauseAllAudioEffects

  • resumeAudioEffect

  • resumeAllAudioEffects

Kelola progres pemutaran

  • getAudioAccompanyDuration

  • getAudioAccompanyCurrentPosition

  • setAudioAccompanyPosition


Kelola volume pemutaran

  • setAudioAccompanyVolume

  • setAudioAccompanyPublishVolume

  • getAudioAccompanyPublishVolume

  • setAudioAccompanyPlayoutVolume

  • getAudioAccompanyPlayoutVolume

  • setAudioEffectPublishVolume

  • getAudioEffectPublishVolume

  • setAudioEffectPlayoutVolume

  • getAudioEffectPlayoutVolume

  • setAllAudioEffectsPublishVolume

  • setAllAudioEffectsPlayoutVolume

Callback status pemutaran

Lokal:

  • onAudioAccompanyStateChanged

Jarak jauh:

  • onRemoteAudioAccompanyStarted

  • onRemoteAudioAccompanyFinished

Lokal:

  • onAudioEffectFinished

Dapatkan informasi file audio

  • getAudioFileInfo

  • onAudioFileInfo

Main iringan

Saat menggunakan API iringan, Anda hanya dapat memainkan satu file audio dalam satu waktu.

  1. Bergabung ke channel dan publikasikan aliran audio. Ini diaktifkan secara default di SDK.

    Android

    // Untuk memainkan iringan atau efek suara, Anda harus mempublikasikan aliran audio. Ini diaktifkan secara default di SDK.
    mAliRtcEngine.publishLocalAudioStream(true);

    iOS

    // Untuk memainkan iringan atau efek suara, Anda harus mempublikasikan aliran audio. Ini diaktifkan secara default di SDK.
    engine.publishLocalAudioStream(true)

    Harmony

    // Publikasikan aliran audio lokal. Ini diaktifkan secara default.
    this.rtcEngine.publishLocalAudioStream(true);

    Mac

    // Untuk memainkan iringan atau efek suara, Anda harus mempublikasikan aliran audio. Ini diaktifkan secara default di SDK.
    [self.engine publishLocalAudioStream:TRUE];

    Windows

    mAliRtcEngine->publishLocalAudioStream(true)
  2. Kontrol pemutaran

Setelah bergabung ke channel dan mendorong aliran audio, panggil startAudioAccompany untuk memainkan iringan. Pemanggilan yang berhasil akan memicu callback onAudioAccompanyStateChanged secara lokal, dan callback onRemoteAudioAccompanyStarted secara jarak jauh.

Anda juga dapat menggunakan API berikut untuk mengontrol pemutaran:

  • stopAudioAccompany: Hentikan pemutaran.

  • pauseAudioAccompany: Jeda pemutaran.

  • resumeAudioAccompany: Lanjutkan pemutaran.

  • getAudioAccompanyDuration, getAudioAccompanyCurrentPosition, setAudioAccompanyPosition: Dapatkan durasi file dan kontrol progres pemutaran.

  • setAudioAccompanyVolume: Atur volume pemutaran lokal dan volume publikasi jarak jauh untuk iringan.

  • getAudioAccompanyPublishVolume, setAudioAccompanyPublishVolume: Dapatkan atau sesuaikan volume publikasi iringan untuk client jarak jauh.

  • getAudioAccompanyPlayoutVolume, setAudioAccompanyPlayoutVolume: Dapatkan atau sesuaikan volume pemutaran lokal iringan.

Android

// Path ke file iringan.
private String mMixingMusicFilepath = "/assets/music.wav";

// Konfigurasikan pemutaran iringan.
AliRtcEngine.AliRtcAudioAccompanyConfig config = new AliRtcEngine.AliRtcAudioAccompanyConfig();
config.loopCycles = -1; // Jumlah loop. -1 berarti looping tanpa batas.
config.publishVolume = publishVolume; // Volume publikasi. Rentang: [0, 100].
config.playoutVolume = playbackVolume; // Volume pemutaran lokal. Rentang: [0, 100].
config.startPosMs = 0; // Posisi awal pemutaran.
// Mulai pemutaran.
mAliRtcEngine.startAudioAccompany(mMixingMusicFilepath, config);

// Jeda/Lanjutkan iringan.
mAliRtcEngine.pauseAudioAccompany();
mAliRtcEngine.resumeAudioAccompany();

// Hentikan pemutaran.
mAliRtcEngine.stopAudioAccompany();

// Dapatkan durasi file iringan dalam ms. Panggil metode ini setelah startAudioAccompany, jika tidak akan mengembalikan -1.
int duration = mAliRtcEngine.getAudioAccompanyDuration();
// Untuk mendapatkan durasi file tertentu, panggil getAudioFileInfo. Anda dapat memanggil ini setelah membuat engine. Hasilnya dikembalikan dalam callback onAudioFileInfo.
mAliRtcEngine.getAudioFileInfo(filePath);
@Override
public void onAudioFileInfo(AliRtcEngine.AliRtcAudioFileInfo info, AliRtcEngine.AliRtcAudioAccompanyErrorCode errorCode) {

    handler.post(() -> {
        String msg = "onAudioFileInfo.file:" + info.filePath + "duration:" + info.durationMs + "audioPlayingErrorCode=" + errorCode;
        ToastHelper.showToast(PlayAudioFilesActivity.this, msg, Toast.LENGTH_SHORT);
    });
}

// Dapatkan/Atur volume.
mAliRtcEngine.setAudioAccompanyVolume(50); // Rentang: [0, 100].
int publishVolume = mAliRtcEngine.getAudioAccompanyPublishVolume();
mAliRtcEngine.setAudioAccompanyPublishVolume(50);
int playoutVolume = mAliRtcEngine.getAudioAccompanyPlayoutVolume();
mAliRtcEngine.setAudioAccompanyPlayoutVolume(50);

// Dapatkan/Atur progres pemutaran.
int currPosition = mAliRtcEngine.getAudioAccompanyCurrentPosition(); // Satuan: ms.
int targetPosition = 1000; // Contoh: mulai memutar dari tanda 1000 ms.
mAliRtcEngine.setAudioAccompanyPosition(targetPosition);

iOS

// Path ke file iringan.
let filePath = Bundle.main.path(forResource: "music", ofType: "wav")

// Konfigurasikan pemutaran iringan.
let config = AliRtcAudioAccompanyConfig()
config.loopCycles = loopCount
config.publishVolume = publishVolume
config.playoutVolume = playoutVolume
config.startPosMs = 0
// Mulai pemutaran.
let result = rtcEngine.startAudioAccompany(withFile: filePath, config: config)

// Jeda/Lanjutkan pemutaran.
rtcEngine.pauseAudioAccompany()
rtcEngine.resumeAudioAccompany()

// Hentikan pemutaran.
rtcEngine.stopAudioAccompany()

// Dapatkan durasi file iringan dalam ms. Panggil metode ini setelah startAudioAccompany, jika tidak akan mengembalikan -1.
let duration = rtcEngine.getAudioAccompanyDuration()
// Untuk mendapatkan durasi file tertentu, panggil getAudioFileInfo. Anda dapat memanggil ini setelah membuat engine. Hasilnya dikembalikan dalam callback onAudioFileInfo.
rtcEngine.getAudioFileInfo(filePath)
func onAudioFileInfo(_ info: AliRtcAudioFileInfo, errorCode: AliRtcAudioAccompanyErrorCode) {
    "onAudioFileInfo, filePath: \(info.filePath), durationMs: \(info.durationMs), errorCode: \(errorCode)".printLog()
}

// Dapatkan/Atur volume.
rtcEngine.setAudioAccompanyVolume(50) // Atur volume publikasi dan pemutaran iringan. Rentang: [0-100].
let audioPublishVolume = rtcEngine.getAudioAccompanyPublishVolume() // Dapatkan volume publikasi iringan saat ini.
rtcEngine.setAudioAccompanyPublishVolume(50) // Atur volume publikasi iringan. Rentang: [0-100].
let audioPlayoutVolume = rtcEngine.getAudioAccompanyPlayoutVolume() // Dapatkan volume pemutaran lokal iringan saat ini.
rtcEngine.setAudioAccompanyPlayoutVolume(50) // Atur volume pemutaran lokal iringan. Rentang: [0-100].

// Dapatkan/Atur progres pemutaran.
let currentPosition = rtcEngine.getAudioAccompanyCurrentPosition() // Satuan: ms.
let targetPosition:Int32 = 1000; // Contoh: mulai memutar dari tanda 1000 ms.
rtcEngine.setAudioAccompanyPosition(targetPosition)

Harmony

// Path ke file iringan.
private accompanimentFile: string = 'music.wav';
// Mulai iringan.
private async startAudioAccompany(): Promise<void> {
  if (!this.rtcEngine) {
    prompt.showToast({ message: 'RTC engine belum diinisialisasi', duration: 2000 });
    return;
  }
  if (!this.hasJoined) {
    prompt.showToast({ message: 'Bergabung ke channel terlebih dahulu', duration: 2000 });
    return;
  }
  try {
    // Dapatkan jumlah loop.
    const loopCount = this.loopCount.trim() === '' ? -1 : parseInt(this.loopCount);
    const publishVolume = this.pushVolume;  // Volume publikasi.
    const playbackVolume = this.playVolume; // Volume pemutaran lokal.
    // Buat konfigurasi iringan.
    const config: AliRtcAudioAccompanyConfig = new AliRtcAudioAccompanyConfig();
    config.loopCycles = loopCount;      // Jumlah loop. -1 berarti looping tanpa batas.
    config.publishVolume = publishVolume; // Volume publikasi. Rentang: [0, 100].
    config.playoutVolume = playbackVolume; // Volume pemutaran lokal. Rentang: [0, 100].
    config.startPosMs = 0;              // Posisi awal pemutaran.
    // Gunakan path file sandbox.
    const audioPath = this.sandboxManager.getSandboxFilePath(this.accompanimentFile);
    // Mulai pemutaran.
    this.rtcEngine.startAudioAccompany(audioPath, config);
    // Dapatkan durasi audio dan perbarui progress bar.
    const audioDuration = this.rtcEngine.getAudioAccompanyDuration(); // Satuan: ms.
    if (audioDuration > 0) {
      this.audioDuration = audioDuration;
    }
    console.info('Mulai memutar iringan');
  } catch (error) {
    console.error('Error memutar iringan:', error);
    prompt.showToast({ message: 'Error memutar iringan', duration: 2000 });
  }
}
// Jeda iringan.
private pauseAudioAccompany(): void {
  if (!this.rtcEngine) {
    prompt.showToast({ message: 'RTC engine belum diinisialisasi', duration: 2000 });
    return;
  }
  this.rtcEngine.pauseAudioAccompany();
  console.info('Jeda pemutaran iringan');
}
// Lanjutkan iringan.
private resumeAudioAccompany(): void {
  if (!this.rtcEngine) {
    prompt.showToast({ message: 'RTC engine belum diinisialisasi', duration: 2000 });
    return;
  }
  this.rtcEngine.resumeAudioAccompany();
  console.info('Lanjutkan pemutaran iringan');
}
// Hentikan iringan.
private stopAudioAccompany(): void {
  if (!this.rtcEngine) {
    prompt.showToast({ message: 'RTC engine belum diinisialisasi', duration: 2000 });
    return;
  }
  this.rtcEngine.stopAudioAccompany();
  console.info('Hentikan pemutaran iringan');
}
// Atur volume iringan.
private setAudioAccompanyVolume(volume: number): void {
  if (this.rtcEngine && this.hasJoined) {
    this.rtcEngine.setAudioAccompanyVolume(volume); // Rentang: [0, 100].
  }
}
// Atur volume publikasi.
private setAudioAccompanyPublishVolume(volume: number): void {
  if (this.rtcEngine && this.hasJoined) {
    this.rtcEngine.setAudioAccompanyPublishVolume(volume); // Rentang: [0, 100].
  }
}
// Atur volume pemutaran.
private setAudioAccompanyPlayoutVolume(volume: number): void {
  if (this.rtcEngine && this.hasJoined) {
    this.rtcEngine.setAudioAccompanyPlayOutVolume(volume); // Rentang: [0, 100].
  }
}
// Dapatkan volume publikasi.
private getAudioAccompanyPublishVolume(): number {
  if (this.rtcEngine) {
    return this.rtcEngine.getAudioAccompanyPublishVolume();
  }
  return 0;
}
// Dapatkan volume pemutaran.
private getAudioAccompanyPlayoutVolume(): number {
  if (this.rtcEngine) {
    return this.rtcEngine.getAudioAccompanyPlayoutVolume();
  }
  return 0;
}
// Atur posisi pemutaran.
private setAudioAccompanyPosition(position: number): void {
  if (this.rtcEngine && this.hasJoined) {
    if (position >= 0 && position <= this.audioDuration) {
      this.rtcEngine.setAudioAccompanyPosition(position); // Satuan: ms.
    }
  }
}
// Dapatkan posisi pemutaran saat ini.
private getAudioAccompanyCurrentPosition(): number {
  if (this.rtcEngine && this.hasJoined) {
    return this.rtcEngine.getAudioAccompanyCurrentPosition(); // Satuan: ms.
  }
  return 0;
}
// Contoh timer untuk memperbarui progres pemutaran.
private updatePlayProgress(): void {
  if (this.rtcEngine && this.hasJoined) {
    const currentPosition = this.rtcEngine.getAudioAccompanyCurrentPosition();
    this.playProgress = currentPosition;
  }
}

Mac

AliRtcAudioAccompanyConfig *config = [[AliRtcAudioAccompanyConfig alloc] init];
    
config.onlyLocalPlay = localPlay;
config.replaceMic = replaceMic;
config.loopCycles = self.loopLabel.intValue;
config.startPosMs = startPosMs;
config.publishVolume = publishVolume;
config.playoutVolume = playVolume;
NSString *string;

int ret = [self.engine startAudioAccompanyWithFile:self.playURLString config:config];
if (ret) {
    string = [NSString stringWithFormat:@"Pemutaran gagal. Periksa konfigurasi parameter: %d",ret];
} else {
        
    [self.isChangeMicBtn setEnabled:FALSE] ;
        
    if (startPos > 0 && startPosMs == 0) {
        string = @"Pemutaran dimulai berhasil (durasi musik tidak tersedia, parameter posisi awal diabaikan)";
    } else {
        string = @"Pemutaran dimulai berhasil";
    }
}

// Jeda/Lanjutkan pemutaran.
[self.engine pauseAudioAccompany];
[self.engine resumeAudioAccompany];

// Hentikan pemutaran.
[self.engine stopAudioAccompany];

// Dapatkan durasi file iringan dalam ms. Panggil metode ini setelah startAudioAccompany, jika tidak akan mengembalikan -1.
int duration = [self.engine getAudioAccompanyDuration];

// Untuk mendapatkan durasi file tertentu, panggil getAudioFileInfo. Anda dapat memanggil ini setelah membuat engine. Hasilnya dikembalikan dalam callback onAudioFileInfo.
 [self.engine getAudioFileInfo:filePath];

- (void)onAudioFileInfo:(AliRtcAudioFileInfo* _Nonnull)info errorCode:(AliRtcAudioAccompanyErrorCode)errorCode {
   /* Perbarui status UI */
    dispatch_async(dispatch_get_main_queue(), ^{
        if (self.accompanyVC) {
            [self.accompanyVC updateAudioFileInfo:info errorCode:errorCode];
        }
        if (self.effectVC) {
            [self.effectVC updateAudioFileInfo:info errorCode:errorCode];
        }
    });
    
}


// Dapatkan/Atur volume.
[self.engine setAudioAccompanyVolume:sender.integerValue];

// Atur volume publikasi dan pemutaran iringan. Rentang: [0, 100].
int volume = [self.engine getAudioAccompanyPublishVolume];
sender.title = [NSString stringWithFormat:@"Dapatkan volume publikasi: %d",volume];

[self.engine setAudioAccompanyPublishVolume:50]; // Atur volume publikasi iringan. Rentang: [0, 100].

int audioPlayoutVolume = [self.engine getAudioAccompanyPlayoutVolume]; // Dapatkan volume pemutaran lokal iringan saat ini.
[self.engine setAudioAccompanyPlayoutVolume:50]; // Atur volume pemutaran lokal iringan. Rentang: [0, 100].

// Dapatkan/Atur progres pemutaran.
int duration = [self.engine getAudioAccompanyDuration];
long position = duration * sender.integerValue/100;
[self.engine setAudioAccompanyPosition:(int)position];

Windows

AliEngineAudioAccompanyConfig config;
config.onlyLocalPlay = (0 == mbCheckPubAcc);
config.loopCycles = miEditCycleNum;
config.replaceMic = (0 != mbCheckAccReplaceMic);
config.startPosMs = startPosMs;
config.playoutVolume = mbCheckAccMixVol ? miStaticAccMixVol : miStaticAccPlayoutVol;
config.publishVolume = mbCheckAccMixVol ? miStaticAccMixVol : miStaticAccPubVol;

if (0 != mAliRtcEngine->StartAudioAccompany(strPath.c_str(), config))
{
    AfxMessageBox(_T("Gagal memulai iringan!"));
    return;
}

// Jeda/Lanjutkan iringan.
mAliRtcEngine->PauseAudioAccompany();
mAliRtcEngine->ResumeAudioAccompany();

// Hentikan pemutaran.
mAliRtcEngine->StopAudioAccompany();

// Dapatkan durasi file iringan dalam ms. Panggil metode ini setelah startAudioAccompany, jika tidak akan mengembalikan -1.
int duration = mAliRtcEngine->GetAudioAccompanyDuration();
// Untuk mendapatkan durasi file tertentu, panggil getAudioFileInfo. Anda dapat memanggil ini setelah membuat engine. Hasilnya dikembalikan dalam callback onAudioFileInfo.
mAliRtcEngine->GetAudioFileInfo(filePath);


void CTutorialDlg::OnAudioFileInfo(AliEngineAudioFileInfo info,
	AliEngineAudioAccompanyErrorCode errorCode) {

    /* Beri tahu UI untuk refresh. */
	CAudioAccompanyDlg::AudioFileInfo *audioInfo = new CAudioAccompanyDlg::AudioFileInfo();
	
    audioInfo->filePath = AliStringToCString(info.filePath);
	audioInfo->durationMs = info.durationMs;
	::PostMessage(cshell_dlg.GetAudioAccompanyHwnd(), MM_AUDIO_ACCOMPANY_AUDIO_FILE_INFO, (WPARAM)audioInfo, (LPARAM)errorCode);

	CAudioEffectDlg::AudioFileInfo *effectInfo = new CAudioEffectDlg::AudioFileInfo();
	effectInfo->filePath = AliStringToCString(info.filePath);
	effectInfo->durationMs = info.durationMs;
	::PostMessage(cshell_dlg.GetAudioEffectHwnd(), MM_AUDIO_EFFECT_AUDIO_FILE_INFO, (WPARAM)effectInfo, (LPARAM)errorCode);
}

/* Dapatkan/Atur volume. */
mAliRtcEngine->SetAudioAccompanyVolume(50); // Rentang: [0, 100].
int publishVolume = mAliRtcEngine->GetAudioAccompanyPublishVolume();
mAliRtcEngine->SetAudioAccompanyPublishVolume(50);
int playoutVolume = mAliRtcEngine->GetAudioAccompanyPlayoutVolume();
mAliRtcEngine->SetAudioAccompanyPlayoutVolume(50);

/* Dapatkan/Atur progres pemutaran. */
int currPosition = mAliRtcEngine->GetAudioAccompanyCurrentPosition(); // Satuan: ms.
int targetPosition = 1000; // Contoh: mulai memutar dari tanda 1000 ms.
mAliRtcEngine->SetAudioAccompanyPosition(targetPosition);

Main efek suara

Untuk memainkan beberapa efek suara secara bersamaan (misalnya, tepuk tangan dan tawa), gunakan API seperti preloadAudioEffect dan playAudioEffect.

Catatan

Anda harus memberikan ID unik untuk setiap efek suara. Aplikasi Anda bertanggung jawab untuk mengelola ID-ID tersebut.

  1. Bergabung ke channel dan publikasikan aliran audio. Ini diaktifkan secara default di SDK.

    Android

    // Untuk memainkan iringan atau efek suara, Anda harus mempublikasikan aliran audio. Ini diaktifkan secara default di SDK.
    mAliRtcEngine.publishLocalAudioStream(true);

    iOS

    // Untuk memainkan iringan atau efek suara, Anda harus mempublikasikan aliran audio. Ini diaktifkan secara default di SDK.
    engine.publishLocalAudioStream(true)

    Harmony

    // Publikasikan aliran audio lokal. Ini diaktifkan secara default.
    this.rtcEngine.publishLocalAudioStream(true);

    Mac

    // Untuk memainkan iringan atau efek suara, Anda harus mempublikasikan aliran audio. Ini diaktifkan secara default di SDK.
    [self.engine publishLocalAudioStream:TRUE];

    Windows

    mAliRtcEngine->PublishLocalAudioStream(true);
  2. (Opsional) Pra-muat sumber daya

Untuk meningkatkan performa saat memainkan efek suara berulang kali, kami menyarankan untuk memuat file audio ke memori dengan memanggil preloadAudioEffect.

  • preloadAudioEffect: Memuat file efek suara yang ditentukan. Mendukung file lokal maupun URL file jaringan. Kami menyarankan menggunakan file lokal.

  • Saat efek suara tidak lagi diperlukan, panggil unloadAudioEffect untuk melepasnya dan membebaskan sumber daya.

Android

// Muat file efek suara dengan ID dan filePath yang ditentukan. Anda harus mendefinisikan ID.
mAliRtcEngine.preloadAudioEffect(mCurrSoundID, filePath);
// Lepaskan file efek suara dengan ID yang ditentukan.
mAliRtcEngine.unloadAudioEffect(mCurrSoundID);

iOS

// Muat file efek suara dengan ID dan filePath yang ditentukan. Anda harus mendefinisikan ID.
rtcEngine.preloadAudioEffect(withSoundId: self.soundId, filePath: filePath)
// Lepaskan file efek suara dengan ID yang ditentukan.
rtcEngine.unloadAudioEffect(withSoundId: self.currentEffectIndex)

Harmony

// Muat file efek suara dengan ID dan filePath yang ditentukan. Anda harus mendefinisikan ID.
this.rtcEngine.preloadAudioEffect(1, audioPath);
// Lepaskan file efek suara dengan ID yang ditentukan.
this.rtcEngine.unloadAudioEffect(this.currSoundID);

Mac

// Muat file efek suara dengan ID dan filePath yang ditentukan. Anda harus mendefinisikan ID.
[self.engine preloadAudioEffectWithSoundId:weakSelf.currentIndex filePath:chooseFileString];

// Lepaskan file efek suara dengan ID yang ditentukan.
[self.engine unloadAudioEffectWithSoundId:info.effectId];

Windows

// Muat file efek suara dengan ID dan filePath yang ditentukan. Anda harus mendefinisikan ID.
mAliRtcEngine->PreloadAudioEffect(mCurrSoundID, filePath);
// Lepaskan file efek suara dengan ID yang ditentukan.
mAliRtcEngine->UnloadAudioEffect(mCurrSoundID);
  1. Kontrol pemutaran

Setelah bergabung ke channel dan mempublikasikan aliran audio, panggil playAudioEffect untuk memainkan efek suara. Saat pemutaran selesai, callback onAudioEffectFinished dipicu pada client lokal.

Anda juga dapat menggunakan API berikut untuk mengontrol pemutaran:

  • stopAudioEffect/stopAllAudioEffects: Hentikan pemutaran efek suara tertentu atau semua efek suara.

  • pauseAudioEffect/pauseAllAudioEffects: Jeda pemutaran efek suara tertentu atau semua efek suara.

  • resumeAudioEffect/resumeAllAudioEffects: Lanjutkan pemutaran efek suara tertentu atau semua efek suara.

  • getAudioEffectPublishVolume, setAudioEffectPublishVolume, setAllAudioEffectsPublishVolume: Dapatkan atau sesuaikan volume publikasi efek suara untuk client jarak jauh.

  • getAudioEffectPlayoutVolume, setAudioEffectPlayoutVolume, setAllAudioEffectsPlayoutVolume: Dapatkan atau sesuaikan volume pemutaran lokal efek suara.

Android

// Mainkan efek suara.
AliRtcEngine.AliRtcAudioEffectConfig config = new AliRtcEngine.AliRtcAudioEffectConfig();
config.loopCycles = -1;			// Jumlah loop. -1 berarti looping tanpa batas.
config.startPosMs = 0;			// Posisi awal pemutaran.
config.publishVolume = 50;		// Volume publikasi. Rentang: [0, 100].
config.playoutVolume = 50;		// Volume pemutaran lokal. Rentang: [0, 100].
mAliRtcEngine.playAudioEffect(mCurrSoundID, filePath, config);

// Hentikan pemutaran.
mAliRtcEngine.stopAudioEffect(soundId);
mAliRtcEngine.stopAllAudioEffects();

// Jeda pemutaran.
mAliRtcEngine.pauseAudioEffect(soundId);
mAliRtcEngine.pauseAllAudioEffects();

// Lanjutkan pemutaran.
mAliRtcEngine.resumeAudioEffect(soundId);
mAliRtcEngine.resumeAllAudioEffects();

// Dapatkan atau atur volume.
// Volume publikasi
mAliRtcEngine.getAudioEffectPublishVolume(soundId);
mAliRtcEngine.setAudioEffectPublishVolume(soundId, 50);
mAliRtcEngine.setAllAudioEffectsPublishVolume(50);
// Volume pemutaran
mAliRtcEngine.getAudioEffectPlayoutVolume(soundId);
mAliRtcEngine.setAudioEffectPlayoutVolume(soundId, 50);
mAliRtcEngine.setAllAudioEffectsPlayoutVolume(50);

iOS

// Mainkan
let config = AliRtcAudioEffectConfig()
config.loopCycles = -1
config.startPosMs = 0
config.publishVolume = 50
config.playoutVolume = 50
let result = rtcEngine.playAudioEffect(withSoundId: self.soundId, filePath: filePath, config: config)
if result != 0 {
    UIAlertController.showAlertWithMainThread(msg: "Gagal memainkan efek suara. Kode error: \(result)", vc: self)
}

// Hentikan pemutaran.
rtcEngine.stopAudioEffect(withSoundId: soundId)
rtcEngine.stopAllAudioEffects()

// Jeda pemutaran.
rtcEngine.pauseAudioEffect(withSoundId: soundId)
rtcEngine.pauseAllAudioEffects()

// Lanjutkan pemutaran.
rtcEngine.resumeAudioEffect(withSoundId: soundId)
rtcEngine.resumeAllAudioEffects()

// Dapatkan atau atur volume.
rtcEngine.getAudioEffectPublishVolume(withSoundId: soundId)
rtcEngine.setAudioEffectPublishVolumeWithSoundId(soundId, volume: 50)
rtcEngine.setAllAudioEffectsPublishVolume(50)
rtcEngine.resumeAudioEffect(withSoundId: soundId)    
rtcEngine.getAudioEffectPlayoutVolume(withSoundId: soundId)
rtcEngine.setAudioEffectPlayoutVolumeWithSoundId(soundId, volume: 50)

Harmony

// Mainkan
const config: AliRtcAudioEffectConfig = new AliRtcAudioEffectConfig();
config.loopCycles = loopCount;
config.startPosMs = 0;
config.publishVolume = this.soundEffectVolume;
config.playoutVolume = this.soundEffectVolume;
const audioPath = this.sandboxManager.getSandboxFilePath(filePath);
this.rtcEngine.playAudioEffect(this.currSoundID, audioPath, config);

// Hentikan pemutaran.
this.rtcEngine.stopAudioEffect(soundId);
this.rtcEngine.stopAllAudioEffects();

// Jeda pemutaran.
this.rtcEngine.pauseAudioEffect(soundId);
this.rtcEngine.pauseAllAudioEffects();

// Lanjutkan pemutaran.
this.rtcEngine.resumeAudioEffect(soundId);
this.rtcEngine.resumeAllAudioEffects();

Mac

// Mainkan
AliRtcAudioEffectConfig *config = [AliRtcAudioEffectConfig new];
config.loopCycles = self.circleCountLabel.intValue;
config.needPublish = publish;
config.playoutVolume = info.playoutVolume;
config.publishVolume = info.publishVolume;
config.startPosMs = startPosMs;
    
int ret = [self.engine playAudioEffectWithSoundId:info.effectId filePath:self.playURLString config:config];


// Hentikan pemutaran.
[self.engine stopAudioEffectWithSoundId:effectId];

[self.engine stopAllAudioEffects];

// Jeda pemutaran.
[self.engine pauseAudioEffectWithSoundId:effectId];
[self.engine pauseAllAudioEffects];

// Lanjutkan pemutaran.
[self.engine resumeAudioEffectwithSoundId:soundId];
[self.engine resumeAllAudioEffects];

// Dapatkan atau atur volume.
int volume = [self.engine getAudioEffectPublishVolumeWithSoundId:soundId];
[self.engine setAudioEffectPublishVolumeWithSoundId:soundId volume: 50];

[self.engine setAllAudioEffectsPublishVolume:50];
[self.engine resumeAudioEffectwithSoundId: soundId];    
[self.engine getAudioEffectPlayoutVolumewithSoundId: soundId];
[self.engine setAudioEffectPlayoutVolumeWithSoundId:soundId volume: 50];

Windows

// Mainkan efek suara.
AliEngineAudioEffectConfig config ;
config.loopCycles = -1;			// Jumlah loop. -1 berarti looping tanpa batas.
config.startPosMs = 0;			// Posisi awal pemutaran.
config.publishVolume = 50;		// Volume publikasi. Rentang: [0, 100].
config.playoutVolume = 50;		// Volume pemutaran lokal. Rentang: [0, 100].

mAliRtcEngine->PlayAudioEffect(mCurrSoundID, filePath, config);

// Hentikan pemutaran.
mAliRtcEngine->StopAudioEffect(soundId);
mAliRtcEngine->StopAllAudioEffects();

// Jeda pemutaran.
mAliRtcEngine->PauseAudioEffect(soundId);
mAliRtcEngine->PauseAllAudioEffects();

// Lanjutkan pemutaran.
mAliRtcEngine->ResumeAudioEffect(soundId);
mAliRtcEngine->ResumeAllAudioEffects();

// Dapatkan atau atur volume.
// Volume publikasi
mAliRtcEngine->GetAudioEffectPublishVolume(soundId);
mAliRtcEngine->SetAudioEffectPublishVolume(soundId, 50);
mAliRtcEngine->SetAllAudioEffectsPublishVolume(50);
// Volume pemutaran
mAliRtcEngine->GetAudioEffectPlayoutVolume(soundId);
mAliRtcEngine->SetAudioEffectPlayoutVolume(soundId, 50);
mAliRtcEngine->SetAllAudioEffectsPlayoutVolume(50);

Main atau publikasikan data audio PCM

Untuk memainkan atau mempublikasikan data audio PCM, lihat Penangkapan audio kustom.

Cara kerja

image

Kode contoh

Tambahkan aliran input eksternal

Android

/* Atur parameter berdasarkan kebutuhan bisnis Anda. */
AliRtcEngine.AliRtcExternalAudioStreamConfig config = new AliRtcEngine.AliRtcExternalAudioStreamConfig();
/* Atur volume pemutaran ke 0 untuk menonaktifkan pemutaran lokal. */
config.playoutVolume = currentAudioPlayoutVolume;
/* Atur volume publikasi ke 0 untuk menonaktifkan publikasi. */
config.publishVolume = currentAudioPublishVolume;
config.channels = 1;
config.sampleRate = 48000;
// Metode ini mengembalikan ID aliran input eksternal. Gunakan ID ini untuk mendorong data ke SDK.
audioStreamID = mAliRtcEngine.addExternalAudioStream(config);

iOS

/* Atur parameter berdasarkan kebutuhan bisnis Anda. */
AliRtcExternalAudioStreamConfig *config = [AliRtcExternalAudioStreamConfig new];
config.channels = _pcmChannels;
config.sampleRate = _pcmSampleRate;
/* Atur volume pemutaran ke 0 untuk menonaktifkan pemutaran lokal. */
config.playoutVolume = 0;
/* Atur volume publikasi ke 100. Contoh ini menggunakan 100, tetapi Anda dapat mengaturnya ke 0 untuk menonaktifkan publikasi. */
config.publishVolume = 100;
// Metode ini mengembalikan ID aliran input eksternal. Gunakan ID ini untuk mendorong data ke SDK.
_externalPlayoutStreamId = [self.engine addExternalAudioStream:config];

Dorong data PCM ke aliran

Android

AliRtcEngine.AliRtcAudioFrame rawData = new AliRtcEngine.AliRtcAudioFrame();
rawData.data = frameInfo.audio_data[0];
rawData.numSamples = (int) (frameInfo.audio_data[0].length / (2 * frameInfo.audio_channels));
rawData.bytesPerSample = 2;
rawData.numChannels = frameInfo.audio_channels;
rawData.samplesPerSec = frameInfo.audio_sample_rate;

int ret = mAliRtcEngine.pushExternalAudioStreamRawData(audioStreamID, rawData);
if(ret == 0x01070101) {
    // Buffer penuh.
    sleep(20);
} else if(ret < 0) {
    /* Terjadi pengecualian. Periksa parameter dan status publikasi. */
}

iOS

AliRtcAudioFrame *sample = [AliRtcAudioFrame new];
sample.dataPtr = _pcmLocalData;
sample.samplesPerSec = _pcmLocalSampleRate;
sample.bytesPerSample = sizeof(int16_t);
sample.numOfChannels = _pcmLocalChannels;
sample.numOfSamples = numOfSamples;
int rc = [self.engine pushExternalAudioStream:_externalPlayoutStreamId rawData:sample];

if(rc == 0x01070101) {
    // Buffer penuh.
    sleep(20);
} else if(ret < 0) {
    /* Terjadi pengecualian. Periksa parameter dan status publikasi. */
}

Hapus aliran audio eksternal

Android

mAliRtcEngine.removeExternalAudioStream(audioStreamID);

iOS

[self.engine removeExternalAudioStream:_externalPublishStreamId];

FAQ

  1. Saat memainkan iringan dengan startAudioAccompany, bagaimana cara membuat hanya pengguna jarak jauh yang mendengar iringan, bukan suara dari mikrofon lokal?

    Anda dapat memanggil metode muteLocalMic sebelum atau selama pemutaran iringan untuk membisukan mikrofon. Dalam hal ini, pengguna jarak jauh hanya dapat mendengar iringan.