Todos os produtos
Search
Central de documentação

ApsaraVideo VOD:Basic features of ApsaraVideo Player SDK for iOS

Última atualização: Sep 22, 2026

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

Importante

Para executar e testar o demo, baixe o ApsaraVideo Player SDK e siga as instruções para compilá-lo e executá-lo.

Configure uma fonte de vídeo

O ApsaraVideo Player SDK para iOS oferece suporte à reprodução de vídeo sob demanda (VOD) e de transmissões 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 transmissão ao vivo: UrlSource e reprodução criptografada.

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

  • Para obter informações sobre as regiões compatíveis, consulte IDs de região do ApsaraVideo VOD.

Reprodução VOD

VidAuth (Recomendado)

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

  • ID da mídia: Obtenha o ID da mídia após o upload de um arquivo de mídia. No console do ApsaraVideo VOD, escolha 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 de reprodução. Recomendamos integrar o SDK do lado do servidor do ApsaraVideo VOD para evitar a geração manual de assinaturas. Para obter exemplos, consulte o OpenAPI Explorer.

Recomendamos o uso do VidAuth em vez do VidSts para usuários do ApsaraVideo VOD, pois o VidAuth oferece melhor usabilidade e segurança. Para obter mais informações, consulte Credential method vs. STS method.

Ao ativar o repasse de parâmetros de criptografia HLS no console do ApsaraVideo VOD, o nome padrão do parâmetro será MtsHlsUriToken. Para obter 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 com VidSts usa credenciais temporárias do STS em vez de credenciais de reprodução do VOD. Antes de reproduzir vídeos VOD usando o VidSts, obtenha um token STS e um par AccessKey (AccessKey ID e AccessKey secret). Para obter mais informações, consulte Obtain an STS token.

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

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 usando o UrlSource, passe a URL de reprodução diretamente.

  • Chame a operação GetPlayInfo para obter URLs de reprodução do ApsaraVideo VOD. Recomendamos integrar o SDK do lado do servidor do ApsaraVideo VOD. Para obter exemplos, consulte o OpenAPI Explorer.

  • Para arquivos locais, certifique-se de que você tem permissão para acessar o arquivo. Use 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

Os vídeos VOD são compatíveis com criptografia HLS, criptografia de vídeo da Alibaba Cloud e criptografia DRM. Para reprodução, consulte Play an encrypted video.

Reprodução de transmissão ao vivo

Para reproduzir transmissões ao vivo, consulte Standard live stream playback.

Controle a reprodução

O ApsaraVideo Player SDK para iOS fornece métodos para iniciar, pausar, parar e buscar trechos da reprodução.

Prepare a reprodução

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

[self.player prepare];

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

Inicie a reprodução

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

[self.player start];

Pause a reprodução

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

[self.player pause];

Retome a reprodução

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

[self.player start];

Busque uma posição específica

Chame seekToTime para saltar para uma posição específica. Esse método é útil quando o usuário arrasta a barra de progresso ou retoma a reprodução a partir de uma posição salva.

// 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): Busca a posição exata. É mais lenta, porém mais precisa.

  • Busca imprecisa (AVP_SEEKMODE_INACCURATE): Busca o keyframe mais próximo. É mais rápida, porém menos precisa.

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

Para iniciar a reprodução a partir de 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];

Pare a reprodução

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

[self.player stop];

Desvincule 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 de fim de reprodução é: stop → desvincular visualização → destroy / destroyAsync.

Destrua 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 respostas mais rápidas na interface do usuário.

  • Não execute nenhuma operação 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.

Monitore os eventos do player

O ApsaraVideo Player SDK fornece callbacks do delegate para monitorar alterações de estado do player, progresso da reprodução, erros e outros eventos.

Defina o delegate do player

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

Importante: Implemente os callbacks onError e onPlayerEvent para lidar com 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.
}

Monitore as alterações de estado do player

O callback onPlayerStatusChanged é acionado quando 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;
    }
}

Configure a exibição do vídeo

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

Modos de dimensionamento

O SDK oferece suporte a 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 do modo de dimensionamento não se aplicam ao modo Picture-in-Picture (PiP).

Rotação

Gire o vídeo no sentido horário em 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 oferece suporte a 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;

Obtenha informações de reprodução

Obtenha o progresso, a duração e o status do buffer durante a reproduçã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 o carregamento (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 carregando o 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 taxa de bits em tempo real

Obtenha a taxa de quadros de renderização, a taxa de bits de áudio e vídeo e a taxa de bits de recebimento 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]

Gerencie o volume

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

Ajuste o volume

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

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

Silencie o vídeo

Silencie ou reative o áudio:

self.player.muted = YES;

Defina a velocidade de reprodução

Ajuste a velocidade de reprodução de 0,5× a 5× em relação à velocidade normal sem alterar o tom:

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

Alterne a resolução

Nota

Para exemplos de código detalhados, 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 resoluções de vídeo do ApsaraVideo VOD. Nenhuma configuração adicional é necessária.

Consulte as resoluções disponíveis

Após o carregamento do vídeo, recupere as resoluçõ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;
        }
    }
}

Troque a resolução

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

[self.player selectTrack:index];

Monitore os eventos de troca de resolução

O callback onTrackChanged é acionado após a troca de resolução:

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

Ative a troca rápida

Ative o modo de troca rápida para receber respostas mais rápidas ao trocar resoluções manualmente:

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

Transmissão ao vivo baseada em UrlSource

Para obter detalhes, consulte Standard live stream playback.

Ative a reprodução em loop

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

self.player.loop = YES;

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

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

Alterne as faixas de áudio

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

Tipos de stream compatíveis

Os seguintes tipos de stream são compatíveis com a troca de faixas de áudio. O comportamento de troca varia de acordo com o tipo de stream.

Tipo de stream

Extensão

Contagem de taxa de bits

Tipo de substream

Comportamento de troca

Stream não-lista (MP4)

.mp4

1

Uma faixa de vídeo, várias faixas de áudio e legendas

É possível trocar entre faixas de áudio.

HLS misto de taxa de bits única

.m3u8

1

Uma faixa de vídeo, várias faixas de áudio e legendas

É possível trocar entre faixas de áudio.

HLS de taxa de bits única

.m3u8

1

Substreams separados de vídeo, áudio e legendas

É possível trocar entre faixas de áudio.

HLS misto de múltiplas taxas de bits

.m3u8

n

Substreams com diferentes taxas de bits, cada um com um vídeo e várias faixas de áudio

É possível trocar apenas entre substreams, e não entre faixas de áudio dentro de um substream.

Obtenha as faixas de áudio disponíveis

O callback onSubTrackReady é acionado quando as informações da faixa 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.
    }
}

Troque a faixa de áudio

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

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

Use miniaturas

Nota

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

As miniaturas de vídeo (sprite sheets) permitem que os usuários visualizem o conteúdo do vídeo ao navegar pela linha do tempo.

Antes de usar miniaturas, configure snapshots de sprite para o seu vídeo. No console do ApsaraVideo VOD, crie um modelo de snapshot com Image Sprite como o tipo de snapshot e, em seguida, crie um fluxo de trabalho para processar o vídeo. Para obter 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;
}

Obtenha logs do SDK

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

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

Este método é adequado para cenários em que é possível reproduzir o problema localmente.

  1. Ative os logs 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 os logs 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

    Os logs no nível de quadro geram um grande volume de logs e são usados principalmente para solucionar problemas de reprodução.

  3. Colete os logs:

    Opção A: Visualize os logs no console

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

    Opção B: Grave os logs em um arquivo

    Defina o caminho completo para o seu arquivo de log dentro da 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 na sandbox do aplicativo:

    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: Defina o 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 logs para o canal de logs do seu aplicativo.

  1. Ative os logs 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 logs do seu aplicativo.

Solução de problemas

Problemas comuns

Problema

Possível causa

Solução

O vídeo não reproduz

Fonte de reprodução inválida

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

Tela preta

View do player não definida

Certifique-se de que player.playerView esteja definido para uma view 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 compatível

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

Reprodução com travamentos

Conexão de rede instável

Ative o streaming de taxa de bits adaptável ou reduza a qualidade

Referências

  • Advanced features: Conheça recursos avançados como Picture-in-Picture (PiP), time shifting e streaming de taxa de bits adaptável.

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

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