Todos os produtos
Search
Central de documentação

ApsaraVideo VOD:Basic features of ApsaraVideo Player SDK for iOS

Última atualização: Aug 20, 2026

Crie uma instância do player para iOS e configure recursos básicos de reprodução, como fontes de mídia, volume, velocidade, troca de resolução e alternância de faixas de áudio.

Importante

Para executar e testar o demo, baixe o ApsaraVideo Player SDK e siga as instruções para compilar e executar o projeto.

Configurar a fonte de vídeo

O ApsaraVideo Player SDK para iOS suporta reprodução de vídeo sob demanda (VOD) e streaming ao vivo.

  • Métodos de reprodução VOD: VidAuth (recomendado para usuários do ApsaraVideo VOD), VidSts, UrlSource e reprodução criptografada.

  • Métodos de reprodução de streaming ao vivo: UrlSource e reprodução criptografada.

Nota
  • UrlSource reproduz mídia a partir de uma URL. VidSts e VidAuth reproduzem mídia pelo ID da mídia (Vid).

  • Para obter informações sobre as regiões suportadas, consulte ApsaraVideo VOD region IDs.

Reprodução VOD

VidAuth (Recomendado)

Para reproduzir um vídeo VOD com VidAuth, defina a propriedade vid com o ID da mídia e a propriedade playAuth com a credencial de reprodução.

  • ID da mídia: Obtenha o ID da mídia após o upload do arquivo. No console do ApsaraVideo VOD, selecione Media Files > Audio/Video. Também é possível chamar a API SearchMedia.

  • Credencial de reprodução: Chame a operação GetVideoPlayAuth para obter a credencial. Recomendamos integrar o SDK de servidor do ApsaraVideo VOD para evitar a geração manual de assinaturas. Para exemplos, consulte o OpenAPI Explorer.

Para usuários do ApsaraVideo VOD, recomendamos VidAuth em vez de VidSts, pois oferece melhor usabilidade e segurança. Para mais detalhes, consulte Credential method vs. STS method.

Se você ativar a passagem de parâmetros de criptografia HLS no console do ApsaraVideo VOD, o nome padrão do parâmetro será MtsHlsUriToken. Para mais informações, consulte Parameter pass-through for HLS encryption.

AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
authSource.vid = @"Vid";                 // Required. The video ID (VideoId).
authSource.playAuth = @"<yourPlayAuth>"; // Required. The playback credential from GetVideoPlayAuth.
authSource.region = @"regionID";         // Deprecated for SDK V5.5.5.0 and later. The player automatically parses the region. For earlier versions, this parameter is required. Default: cn-shanghai.
// authSource.authTimeout = 3600;        // Optional. Set the validity period of the playback URL in seconds. This value overwrites the validity period configured in the ApsaraVideo VOD console. Default: 3600. Make sure that the value is greater than the video duration to prevent URL expiration during playback.

// If you enable HLS encryption parameter pass-through in the ApsaraVideo VOD console and the default parameter is MtsHlsUriToken, configure it as follows:
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
authSource.playConfig = [vp generatePlayerConfig];

[self.player setAuthSource:authSource];

VidSts

A reprodução via VidSts utiliza credenciais STS temporárias em vez de credenciais de reprodução VOD. Antes de reproduzir vídeos VOD com VidSts, obtenha um token STS e um par AccessKey (AccessKey ID e AccessKey secret). Para mais informações, consulte Obtain an STS token.

Caso a passagem de parâmetros de criptografia HLS esteja ativada no console do ApsaraVideo VOD, o nome padrão do parâmetro é MtsHlsUriToken. Consulte Parameter pass-through for HLS encryption para detalhes adicionais.

AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
source.vid = @"Vid";                                // Required. The video ID (VideoId).
source.region = @"regionID";                        //  Required. The ApsaraVideo VOD region. Default: cn-shanghai.
source.securityToken = @"<yourSecurityToken>";      // Required. The STS token from AssumeRole.
source.accessKeySecret = @"<yourAccessKeySecret>";  // Required. The temporary AccessKey secret from STS (AssumeRole).
source.accessKeyId = @"<yourAccessKeyId>";          // Required. The temporary AccessKey ID from STS (AssumeRole).
// source.authTimeout = 3600;                       // Optional. Set the validity period of the playback URL in seconds. This value overwrites the validity period configured in the ApsaraVideo VOD console. Default: 3600. Make sure that the value is greater than the video duration to prevent URL expiration during playback.
// If you enable HLS encryption parameter pass-through in the ApsaraVideo VOD console and the default parameter is MtsHlsUriToken, configure it as follows:
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
source.playConfig = [vp generatePlayerConfig];
// Set the playback source.
[self.player setStsSource:source]

UrlSource

Para reproduzir um vídeo VOD com UrlSource, passe diretamente a URL de reprodução.

  • Chame a operação GetPlayInfo para obter URLs de reprodução do ApsaraVideo VOD. Recomendamos a integração do SDK de servidor do ApsaraVideo VOD. Veja exemplos no OpenAPI Explorer.

  • Para arquivos locais, garanta que possui permissão de acesso. Utilize caminhos completos, como /sdcard/video/sample.mp4 ou content://media/video/123.

AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // Required. A VOD URL, third-party URL, or local file path.
[self.player setUrlSource:urlSource]; 

Reprodução criptografada

Vídeos VOD suportam criptografia HLS, criptografia de vídeo da Alibaba Cloud e criptografia DRM. Para detalhes sobre a reprodução, consulte Play an encrypted video.

Reprodução de streaming ao vivo

Para informações sobre reprodução de streaming ao vivo, consulte Standard live stream playback.

Controlar a reprodução

O ApsaraVideo Player SDK para iOS fornece métodos para iniciar, pausar, parar e buscar posições na reprodução.

Preparar a reprodução

Chame o método prepare para preparar o vídeo para reprodução.

[self.player prepare];

O callback onPlayerEvent com o evento AVPEventPrepareDone é invocado quando a preparação é concluída.

Iniciar a reprodução

Chame o método start para começar a reproduzir o vídeo:

[self.player start];

Pausar a reprodução

Chame o método pause para pausar o vídeo:

[self.player pause];

Retomar a reprodução

Chame o método start para retomar a reprodução após uma pausa:

[self.player start];

Buscar uma posição específica

Use seekToTime para saltar para uma posição específica. Este método é útil quando o usuário arrasta a barra de progresso ou retoma a reprodução de um ponto salvo.

// Seek to a specific position (in milliseconds)
// Accurate seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// Inaccurate seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];

Modos de busca:

  • Busca precisa (AVP_SEEKMODE_ACCURATE): Salta para a posição exata. É mais lenta, porém mais precisa.

  • Busca aproximada (AVP_SEEKMODE_INACCURATE): Salta para o keyframe mais próximo. É mais rápida, mas menos precisa.

Iniciar a reprodução a partir de uma posição específica

Para começar a reproduzir o vídeo já em uma posição específica (em vez de buscar durante a reprodução), chame setStartTime antes de chamar prepare:

// Set the start time for the next prepare call (in milliseconds).
// This setting is only valid for the immediately following prepare call. The start time is automatically cleared after prepare is called.
// seekMode: accurate seek (AVP_SEEKMODE_ACCURATE) or inaccurate seek (AVP_SEEKMODE_INACCURATE).
[self.player setStartTime:time seekMode:seekMode];

Parar a reprodução

Chame o método stop para interromper a reprodução:

[self.player stop];

Desvincular a visualização do player

Após parar a reprodução e antes de destruir a instância do player, desvincule a visualização do player para liberar recursos de renderização e evitar vazamentos de memória.

// Unbind the player view
self.player.playerView = nil;
Nota

Desvincule a visualização do player após chamar stop e antes de chamar destroy ou destroyAsync. A sequência completa para encerrar a reprodução é: stop → desvincular visualização → destroy / destroyAsync.

Destruir o player

Destrua o player de forma síncrona ou assíncrona para liberar recursos.

// Synchronous destroy. Blocks until player resources are released. Automatically calls stop.
[self.player destroy];
// Asynchronous destroy. Returns immediately. Automatically calls stop.
[self.player destroyAsync];

Recomendações:

  • Use destroyAsync se precisar de tempos de resposta rápidos na interface.

  • Não realize operações no objeto do player durante a destruição assíncrona.

  • Não é necessário chamar stop antes de destroyAsync, pois o processo de destruição inclui uma operação de parada assíncrona.

Escutar eventos do player

O ApsaraVideo Player SDK fornece callbacks de delegate para monitorar mudanças de estado, progresso da reprodução, erros e outros eventos.

Definir o delegate do player

Implemente o protocolo AVPDelegate no seu view controller para receber os callbacks do player.

Importante: Implemente os callbacks onError e onPlayerEvent para tratar erros e monitorar alterações no estado da reprodução.

@interface SimplePlayerViewController ()<AVPDelegate>
@end
- (void)viewDidLoad {
    self.player = [[AliPlayer alloc] init];
    self.player.playerView = self.avpPlayerView.playerView;
    self.player.delegate = self;
    //...
}
/**
 @brief Delegate callback for player errors.
 @param player The player instance.
 @param errorModel Contains the error details.
 */
- (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
    // Handle the error (e.g., show an alert) and stop playback.
}
/**
 @brief Delegate callback for player events.
 @param player The player instance.
 @param eventType The type of the event. See AVPEventType.
 */
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType{
    switch(eventType){
        case AVPEventPrepareDone:{
            // Triggered when the media has been prepared and is ready to play.
        }
            break;
        case AVPEventAutoPlayStart:
            // Triggered when autoplay begins.
            break;
        case AVPEventFirstRenderedStart:
            // Triggered when the first frame is rendered.
            break;
        case AVPEventCompletion:
            // Triggered when playback completes.
            break;
        case AVPEventLoadingStart:
            // Triggered when buffering starts.
            break;
        case AVPEventLoadingEnd:
            // Triggered when buffering finishes.
            break;
        case AVPEventSeekEnd:
            // Triggered when a seek operation completes.
            break;
        case AVPEventLoopingStart:
            // Triggered when a new loop begins.
            break;
        default:
            break;
    }
}
/**
 @brief Callback for the current playback position.
 @param player The player instance.
 @param position The current playback position in milliseconds.
 */
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    // Update the progress bar.
}
/**
 @brief Callback for the current buffered position.
 @param player The player instance.
 @param position The current buffered position in milliseconds.
 */
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    // Update the buffer progress indicator.
}
/**
 @brief Callback for when track information is ready.
 @param player The player instance.
 @param info An array of AVPTrackInfo objects for the available streams.
 */
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    // Retrieve information for available bitrates/tracks.
}
/**
 @brief Callback for when a subtitle should be displayed.
 @param player The player instance.
 @param index The index of the subtitle entry.
 @param subtitle The subtitle text to be displayed.
 */
- (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
    // Get and display the subtitle text.
}
/**
 @brief Callback for when a subtitle should be hidden.
 @param player The player instance.
 @param index The index of the subtitle entry that was shown.
 */
- (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
    // Hide the subtitle.
}
/**
 @brief Callback for a screen capture request.
 @param player The player instance.
 @param image The captured screenshot as a UIImage.
 */
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
    // Preview or save the captured image.
}
/**
 @brief Callback for when a track change is complete.
 @param player The player instance.
 @param info The AVPTrackInfo object for the new, active track.
 */
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
    // Notification that the bitrate/track has changed.
}

Monitorar mudanças de estado do player

O callback onPlayerStatusChanged é invocado sempre que o estado do player muda:

- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
    switch (newStatus) {
    case AVPStatusIdle:{
           // Player is idle
        }
 break;
        case AVPStatusInitialzed:{
           // Player is initialized
        }
 break;
        case AVPStatusPrepared:{
           // Player prepared
        }
 break;
        case AVPStatusStarted:{
           // Playback started
        }
 break;
case AVPStatusPaused:{
           // Playback paused
        }
 break;
case AVPStatusStopped:{
           // Playback stopped
        }
 break;
case AVPStatusCompletion:{
           // Playback completed
        }
 break;
case AVPStatusError:{
           // Player error occurred
        }
 break;
        default:
            break;
    }
}

Configurar a exibição do vídeo

Configure como o vídeo é dimensionado, rotacionado e espelhado durante a reprodução.

Modos de dimensionamento

O SDK suporta três modos de dimensionamento:

// Scale to fit the view while maintaining the aspect ratio (letterboxing).
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// Scale to fill the view while maintaining the aspect ratio (cropping).
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// Stretch to fill the view. The aspect ratio is not maintained. Image distortion may occur.
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
Nota

As configurações de modo de dimensionamento não se aplicam ao modo Picture-in-Picture (PiP).

Rotação

Rotacione o vídeo no sentido horário por um ângulo especificado:

// No rotation
self.player.rotateMode = AVP_ROTATE_0;
// Rotate 90 degrees clockwise
self.player.rotateMode = AVP_ROTATE_90;
// Rotate 180 degrees clockwise
self.player.rotateMode = AVP_ROTATE_180;
// Rotate 270 degrees clockwise
self.player.rotateMode = AVP_ROTATE_270;

Espelhamento

Chame setMirrorMode para espelhar o vídeo. O SDK suporta espelhamento horizontal e vertical:

// No mirroring
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// Horizontal mirroring
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// Vertical mirroring
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;

Obter informações de reprodução

Obtenha o progresso da reprodução, duração total e progresso de buffer durante a execução.

Progresso da reprodução

A posição atual da reprodução é retornada no callback onCurrentPositionUpdate:

- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// position is in milliseconds
NSString *position = [NSString stringWithFormat:@"%lld, position"];
}

Duração total

Recupere a duração total do vídeo após ele ser carregado (por exemplo, após o evento AVPEventPrepareDone):

-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
  switch (eventType) {
    case AVPEventPrepareDone: {
      if (self.player.duration >= 0) {
       NSString *duration  = self.player.duration;
      }
    }
      break;
    default:
      break;
  }
}

Duração real da reprodução

Recupere a duração real da reprodução em tempo real. Este valor exclui o tempo em que a reprodução está pausada ou em buffer.

 NSString *duration = [player getPlayedDuration];

Progresso do buffer

O progresso atual do buffer é retornado no callback onBufferedPositionUpdate:

- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    NSString *bufferPosition = position;
}

Métricas de renderização e bitrate em tempo real

Obtenha a taxa de quadros de renderização, bitrate de áudio e vídeo e bitrate de download da rede em tempo real.

// Video rendering frame rate. Returns a float value.
[self.player getOption:AVP_OPTION_RENDER_FPS]
// Video bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
// Audio bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
// Network downstream bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]

Gerenciar volume

Controle o volume da reprodução e silencie o áudio.

Ajustar o volume

Use volume para alterar o volume. Valores válidos: de 0 a 2, onde 1 representa o volume original. Valores maiores que 1 amplificam o áudio e podem introduzir ruído. Recomendamos manter o volume igual ou inferior a 1.

// Set the volume. Valid values: 0 to 2.
self.player.volume = 1.0f;
// Get the current volume.
self.player.volume

Silenciar o vídeo

Ative ou desative o som do áudio:

self.player.muted = YES;

Definir a velocidade de reprodução

Ajuste a velocidade de reprodução de 0,5× a 5× a velocidade normal sem alterar o tom do áudio:

// We recommend using multiples of 0.5 (e.g., 0.5, 1.0, 1.5, 2.0)
self.player.rate = 1.0f;

Alternar resoluções

Nota

Para exemplos detalhados de código, consulte o módulo MultiResolution no projeto API-Example.

Reprodução baseada em VidAuth ou VidSts

Ao usar VidAuth ou VidSts para reprodução VOD, o SDK recupera automaticamente as definições de vídeo do ApsaraVideo VOD. Nenhuma configuração adicional é necessária.

Consultar definições disponíveis

Após o carregamento do vídeo, recupere as definições disponíveis (trackBitrate) no callback onTrackReady:

- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    for (int i=0; i<info.count; i++) {
        AVPTrackInfo* track = [info objectAtIndex:i];
        switch (track.trackType) {
            case AVPTRACK_TYPE_VIDEO: {
                int trackBitrate = track.trackBitrate;
            }
                break;
        }
    }
}

Alternar a definição

Chame o método selectTrack passando o índice da faixa desejada:

[self.player selectTrack:index];

Escutar eventos de troca de definição

O callback onTrackChanged é invocado após a conclusão da troca de definição:

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
 // Definition switched.
}

Ativar troca rápida

Ative o modo de troca rápida para obter respostas mais ágeis ao alternar definições manualmente:

AVPConfig *config = [self.player getConfig];
config.selectTrackBufferMode = 1;
[self.player setConfig:config];

Streaming ao vivo baseado em UrlSource

Para mais detalhes, consulte Standard live stream playback.

Ativar reprodução em loop

Ative a reprodução em loop para reiniciar o vídeo automaticamente desde o início quando a reprodução for concluída:

self.player.loop = YES;

O evento AVPEventLoopingStart é disparado no início de cada loop:

- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventLoopingStart:
            break;
    }
}

Alternar faixas de áudio

Alterne entre faixas de áudio em diferentes idiomas durante a reprodução.

Tipos de stream suportados

Os seguintes tipos de stream suportam a troca de faixas de áudio. O comportamento da troca varia conforme o tipo de stream.

Tipo de stream

Extensão

Contagem de bitrates

Tipo de substream

Comportamento da troca

Stream sem lista (MP4)

.mp4

1

Uma faixa de vídeo, múltiplas faixas de áudio e legendas

Permite alternar entre faixas de áudio.

HLS misto de bitrate único

.m3u8

1

Uma faixa de vídeo, múltiplas faixas de áudio e legendas

Permite alternar entre faixas de áudio.

HLS de bitrate único

.m3u8

1

Substreams separados de vídeo, áudio e legendas

Permite alternar entre faixas de áudio.

HLS misto de múltiplos bitrates

.m3u8

n

Substreams com diferentes bitrates, cada um com um vídeo e múltiplas faixas de áudio

Permite alternar apenas entre substreams, não entre faixas de áudio dentro de um substream.

Obter faixas de áudio disponíveis

O callback onSubTrackReady é invocado quando as informações das faixas de áudio estão disponíveis:

  // onSubTrackReady. Typically triggered before the AVPEventPrepareDone event.
- (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    // Call getSubMediaInfo after this callback is triggered. Calling it before this callback returns an empty result.
    AVPMediaInfo* subMediaInfo = [player getSubMediaInfo];
    // Iterate through available audio tracks
    for (int i=0; i<subMediaInfo.tracks.count; i++) {
    	AVPTrackInfo* track = [mediaInfo.tracks objectAtIndex:i];
        // Find the target audio track from the track list.
    }
}

Alternar a faixa de áudio

Chame o método selectTrack para mudar para uma faixa de áudio diferente:

[self.player selectTrack:myTrack.trackIndex accurate:YES]

Usar thumbnails

Nota

Para exemplos detalhados de código, consulte o módulo Thumbnail no projeto API-Example.

Thumbnails de vídeo (sprite sheets) permitem que os usuários visualizem prévias do conteúdo ao navegar pela linha do tempo.

Antes de usar thumbnails, configure snapshots sprite para o seu vídeo. No console do ApsaraVideo VOD, crie um modelo de snapshot com Image Sprite como tipo de snapshot e, em seguida, crie um workflow para processar o vídeo. Para mais informações, consulte Video snapshots.

/**
 A flag indicating whether the current track has thumbnails. If false, thumbnail previews will not be displayed during seeking.
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 The custom UIImageView used to display the thumbnail preview image.
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
  onPrepare
 */
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
  if(newStatus == AVPStatusPrepared){
       [self.player setThumbnailUrl:[URL];// When the player is prepared, set the thumbnail URL.
       self.trackHasThumbnai = YES;
  }
}
/**
 Callback triggered when the progress slider's value changes.
 @param playerView The player view instance.
 @param value The new progress value.
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief: Callback triggered upon successful retrieval of a thumbnail.
 @param positionMs: The requested time position for the thumbnail, in milliseconds.
 @param fromPos: The start time of the segment this thumbnail represents, in milliseconds.
 @param toPos: The end time of the segment this thumbnail represents, in milliseconds.
 @param image: The retrieved thumbnail image (`UIImage` on iOS, `NSImage` on macOS).
 */
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
    self.thumbnaiView.hidden = NO;
    [self.thumbnaiView setImage:(UIImage *)image];
}

/**
 @brief: Callback triggered when thumbnail retrieval fails.
 @param positionMs: The time position for which the thumbnail request failed, in milliseconds.
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

Obter logs do SDK

Os logs do SDK registram status de requisições, resultados de invocações e solicitações de permissão para depuração durante o desenvolvimento. O SDK fornece dois métodos para obter logs.

Método 1: Visualizar logs no console da ferramenta de desenvolvimento

Este método é adequado para cenários onde você consegue reproduzir o problema localmente.

  1. Ative o log e defina o nível de log:

    // Enable SDK logging
    [AliPlayer setEnableLog:YES];
    // Set the log level (default: LOG_LEVEL_INFO). Use LOG_LEVEL_TRACE for detailed troubleshooting.
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil];
  2. Ative o log no nível de quadro (opcional):

    // Enable frame-level logging for detailed troubleshooting
    // 0 = disabled, 1 = enabled
    [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];
    Nota

    O log no nível de quadro gera um grande volume de dados e é usado principalmente para solucionar problemas de reprodução.

  3. Colete os logs:

    Opção A: Visualizar logs no console

    Após reproduzir o problema, recupere os logs do console da sua ferramenta de desenvolvimento, como o XCode.

    Opção B: Gravar logs em um arquivo

    Defina o caminho completo para o seu arquivo de log dentro do sandbox do aplicativo.

    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    // Define your custom log file path. For example, create a file named 'xxxx.log'.
    NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];

    Redirecione os logs para um arquivo personalizado no sandbox do app:

    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);

    Após reproduzir o problema, recupere o arquivo .log do diretório personalizado.

Método 2: Definir LogCallback para receber logs programaticamente

Use este método quando não for possível reproduzir o problema de forma confiável no seu dispositivo. O callback exporta os logs para o canal de log da sua aplicação.

  1. Ative o log e defina o nível de log.

    // Enable SDK logging
    [AliPlayer setEnableLog:YES];
    // Set the log level. Default value: LOG_LEVEL_INFO. For troubleshooting, set it to LOG_LEVEL_TRACE.
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) {
     NSLog(@"strLog:%@", strLog);
    }];
  2. Colete os logs:

    Após reproduzir o problema, os logs são encaminhados automaticamente para o sistema de log do seu app.

Solução de problemas

Problemas comuns

Problema

Causa possível

Solução

O vídeo não reproduz

Fonte de reprodução inválida

Verifique se o ID do vídeo ou a URL está correto

Tela preta

Visualização do player não definida

Garanta que player.playerView esteja definido para uma visualização válida

Credencial de reprodução expirada

Token expirado

Regenere a credencial de reprodução e tente novamente

Áudio sem vídeo

Codec não suportado

Verifique a compatibilidade do formato de vídeo e do codec

Reprodução travando

Rede instável

Ative o streaming de bitrate adaptativo ou reduza a qualidade

Referências

  • Advanced features: Conheça recursos avançados como Picture-in-Picture (PiP), time shifting e streaming de bitrate adaptativo.

  • API: Explore a referência completa da API do ApsaraVideo Player SDK para iOS.

  • Mobile error codes: Consulte este tópico para solução de problemas.