ARTC vous permet de contourner son module de lecture audio intégré et de gérer le rendu audio avec votre propre lecteur, ce qui vous donne un contrôle total sur le traitement et la diffusion des données audio reçues.
Présentation
Par défaut, ARTC inclut un module de lecture audio éprouvé qui répond à la plupart des besoins. Toutefois, si vous disposez déjà d'un module de lecture audio personnalisé ou si vous devez post-traiter les données audio avant leur diffusion, utilisez la fonctionnalité de lecture audio personnalisée pour désactiver la logique de lecture interne et gérer vous-même le rendu audio.
Vous pouvez ensuite transmettre les données audio à votre dispositif de lecture pour leur traitement et leur diffusion.
Exemple de code
Android: Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/CustomAudioCaptureAndRender/CustomAudioRenderActivity.java.
iOS: iOS/ARTCExample/AdvancedUsage/CustomAudioRender/CustomAudioRenderVC.swift.
Prérequis
Avant d'utiliser la lecture audio personnalisée, assurez-vous de remplir les conditions suivantes :
Vous êtes capable de développer un module de lecture audio complet ou vous disposez déjà d'un lecteur audio tiers ou interne.
Vous maîtrisez les concepts de base du traitement audio, tels que le format de données PCM, la fréquence d'échantillonnage et le nombre de canaux.
Vous avez intégré le SDK ARTC et mis en œuvre les fonctionnalités de base des appels audio et vidéo.
Votre cas d'utilisation nécessite de contourner le module de lecture interne d'ARTC. Dans le cas contraire, utilisez la solution de lecture par défaut pour garantir la stabilité et la compatibilité.
Mise en œuvre
Mise en œuvre
1. Désactiver la lecture interne
Pour utiliser la lecture audio personnalisée, désactivez la lecture interne du SDK. Nous vous recommandons de le faire lors de la création de l'instance du moteur en appelant getInstance et en transmettant le paramètre extras. Le paramètre pertinent est le suivant :
user_specified_use_external_audio_player : indique s'il faut utiliser un lecteur externe.
"TRUE": utilise un lecteur externe et désactive la lecture interne."FALSE": utilise la lecture interne par défaut.
Android
String extras = "{\"user_specified_use_external_audio_player\":\"TRUE\"}";
mAliRtcEngine = AliRtcEngine.getInstance(this, extras);
iOS
// Create and initialize the engine.
var customAudioPlayConfig: [String: String] = [:]
// Use an external player, which disables the SDK's internal playback.
customAudioPlayConfig["user_specified_use_external_audio_player"] = "TRUE"
// Serialize to JSON.
guard let jsonData = try? JSONSerialization.data(withJSONObject: customAudioPlayConfig, options: []),
let extras = String(data: jsonData, encoding: .utf8) else {
print("JSON serialization failed")
return
}
let engine = AliRtcEngine.sharedInstance(self, extras:extras)
Mac
NSString * extras = @"{\"user_specified_use_external_audio_player\":\"TRUE\"}";
self.engine = [AliRtcEngine sharedInstance:self extras:extras];
Windows
std::string extras = "{\"user_specified_use_external_audio_player\":\"TRUE\"}";
mAliRtcEngine = AliRtcEngine.getInstance(this, extras.c_str());
2. Enregistrer le rappel de trame audio
Appelez enableAudioFrameObserver pour enregistrer le rappel de trame audio avec les paramètres suivants :
enable: valeur booléenne qui active ou désactive le rappel de données.audioSource: type de source de données pour le rappel. Pour la lecture audio personnalisée, définissez cette valeur surAliRtcAudioSourcePlaybackafin de recevoir les données de l'étape de lecture via le rappelonPlaybackAudioFrame.config: paramètres audio souhaités pour le rappel, y compris la fréquence d'échantillonnage et le nombre de canaux.
Android
// Set the callback configuration.
AliRtcEngine.AliRtcAudioFrameObserverConfig config = new AliRtcEngine.AliRtcAudioFrameObserverConfig();
config.sampleRate = AliRtcAudioSampleRate_48000;
config.channels = 1;
// Register to enable the playback data callback.
mAliRtcEngine.enableAudioFrameObserver(true, AliRtcAudioSourcePlayback, config);
iOS
// Set the callback configuration.
var observerConfig: AliRtcAudioFrameObserverConfig = AliRtcAudioFrameObserverConfig()
observerConfig.sampleRate = ._Unknown
observerConfig.channels = .monoAudio
// Register to enable the playback data callback.
let audioSource: AliRtcAudioSource = .playback
engine.enableAudioFrameObserver(true, audioSource: audioSource, config: observerConfig)
Mac
AliRtcAudioFrameObserverConfig* config = [[AliRtcAudioFrameObserverConfig alloc] init];
config.channels = audioNumChannel;
config.sampleRate = AliRtcAudioSampleRate_48000;
config.mode = AliRtcAudioFrameObserverOperationModeReadOnly;
[self.engine enableAudioFrameObserver:TRUE audioSource:AliRtcAudioSourcePlayback config:config];
Windows
// Set the callback configuration.
AliEngineAudioFrameObserverConfig config ;
config.sampleRate = AliRtcAudioSampleRate_48000;
config.channels = AliEngineMonoAudio;
// Register to enable the playback data callback.
mAliRtcEngine->EnableAudioFrameObserver(true, AliEngineAudioSourcePlayback, config);
3. Traiter les données PCM dans le rappel
Dans le rappel, traitez les données PCM reçues et transmettez-les à votre dispositif de lecture.
Android
@Override
public boolean onPlaybackAudioFrame(AliRtcEngine.AliRtcAudioFrame frame) {
// Implement your custom logic to play the audio data received in the callback.
return true;
}
iOS
func onPlaybackAudioFrame(_ frame: AliRtcAudioFrame) -> Bool {
// Implement your custom logic to play the audio data received in the callback.
return true
}
Mac
- (BOOL)onPlaybackAudioFrame:(AliRtcAudioFrame* _Nonnull)frame {
// Implement your custom logic to play the audio data received in the callback.
return true;
}
Windows
bool CTutorialDlg::OnPlaybackAudioFrame(AliEngineAudioRawData audioRawData) {
// Implement your custom logic to play the audio data received in the callback.
return true;
}
4. Désactiver l'observateur
Android
mAliRtcEngine.enableAudioFrameObserver(false, AliRtcAudioSourcePlayback, config)
iOS
engine.enableAudioFrameObserver(false, audioSource: audioSource, config: observerConfig)
Mac
[self.engine enableAudioFrameObserver:false audioSource:AliRtcAudioSourcePlayback config:config];
Windows
mAliRtcEngine->EnableAudioFrameObserver(false, AliEngineAudioSourcePlayback, config);
5. (Facultatif) Activer ou désactiver dynamiquement la lecture interne
Pour activer ou désactiver dynamiquement la lecture interne du SDK pendant un appel, appelez la méthode setParameter.
Android
/* Dynamically disable internal playback. */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}";
mAliRtcEngine.setParameter(parameter);
/* Dynamically enable internal playback. */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}";
mAliRtcEngine.setParameter(parameter);
iOS
// Dynamically disable internal playback.
engine.setParameter("{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}")
// Dynamically enable internal playback.
engine.setParameter("{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}")
Mac
// Dynamically disable internal playback.
[self.engine setParameter:"{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}"];
// Dynamically enable internal playback.
[self.engine setParameter:"{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}"];
Windows
/* Dynamically disable internal playback. */
std::string parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}";
mAliRtcEngine->SetParameter(parameter.c_str());
/* Dynamically enable internal playback. */
std::string parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}";
mAliRtcEngine->SetParameter(parameter.c_str());