Todos os produtos
Search
Central de documentação

ApsaraVideo VOD:iOS Player FAQ

Última atualização: Sep 20, 2026

Encontre soluções para problemas comuns com o ApsaraVideo Player SDK for iOS, incluindo erros de build no Xcode, falhas de reprodução, comportamento de busca e cache.

Problemas relacionados à licença

Resolva problemas de licença inválida ou expirada em License FAQ.

Problemas comuns entre plataformas

Problemas de desenvolvimento

Ocorrem erros ao empacotar um aplicativo com o Xcode 14 e enviá-lo para revisão na App Store

Erros relacionados ao Bitcode

Sintoma: Um erro relacionado ao bitcode ocorre ao enviar uma build do Xcode 14 para a App Store:

 ITMS-90482: Invalid Executable - The executable 'xxx.app/Frameworks/alivcffmpeg.framework/alivcffmpeg' contains bitcode.

Solução: Execute o comando xcrun bitcode_strip para remover o bitcode do framework. ${framework_path} é o caminho do binário do framework.

xcrun bitcode_strip ${framework_path} -r -o ${framework_path}

Erros relacionados ao cURL

Sintoma: Um erro relacionado ao cURL ocorre ao enviar uma build do Xcode 14 para a App Store:

ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/AliyunPlayer.framework/AliyunPlayer: _curl_multi_poll, _curl_multi_wakeup. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For further information, visit the Technical Support Information at http://developer.apple.com/support/technical/

Solução:

  • Se o seu projeto integra apenas o ApsaraVideo Player SDK (AliPlayerSDK_iOS), atualize o SDK para uma versão posterior à 5.4.9.2.

  • Caso o projeto integre tanto o ApsaraVideo Player SDK (AliPlayerPartSDK_iOS) quanto o SDK de vídeo curto, atualize o ApsaraVideo Player SDK para uma versão posterior à 5.4.9.2, o alivcffmpeg (QuCore-ThirdParty) para a versão 4.3.6 e o SDK de vídeo curto para uma versão posterior à 3,26.

Erros sobre APIs não públicas

Sintoma: Um erro sobre APIs não públicas ocorre ao enviar uma build do Xcode 14 para a App Store. Ao distribuir um aplicativo com o Xcode, aparece a caixa de diálogo Distribution completed with warnings, indicando um App Store Connect Operation Error. O erro informa que o aplicativo referencia um seletor não público onCompletion: em AliyunMediaDownloader.framework/AliyunMediaDownloader.

Solução: Este é um aviso das builds do Xcode 14 e geralmente não afeta o lançamento se o projeto for compilado com sucesso. Se o aplicativo não puder ser lançado, utilize o Xcode 13.

Erros relacionados a plugins de pós-processamento como mpf_filter.framework e vfi_filter.framework para interpolação de quadros e nitidez

Sintoma: Um erro relacionado a plugins de pós-processamento (mpf_filter.framework, vfi_filter.framework) para interpolação de quadros e nitidez ocorre ao enviar uma build do Xcode 14 para a App Store. Ao distribuir um aplicativo com o Xcode, ocorre um erro Distribution failed with errors, indicando dois erros de validação de ativo (Asset validation failed): o CFBundleIdentifier com.alibaba.AliyunPlayer.mpf_filter de Payload/xxx.app/Frameworks/mpf_filter.framework e o CFBundleIdentifier com.alibaba.AliyunPlayer.vfi_filter de vfi_filter.framework contêm caracteres inválidos (underscores). Os CFBundleIdentifiers podem conter apenas caracteres alfanuméricos, pontos (.) e hifens (-).

Solução:

  • Se o seu projeto não utiliza o plugin mencionado na mensagem de erro, exclua-o. Isso não afeta os recursos do player e reduz o tamanho do pacote.

  • Caso seja obrigatório usar o plugin citado no erro, remova temporariamente o "_" da string de valor no par chave-valor "Bundle identifier" no arquivo Info.plist sob o caminho do framework e, em seguida, compile e construa o projeto.

  • Atualize para a versão 5.5.2.0 ou superior, onde a nomenclatura foi corrigida.

O que fazer se o erro "Xcode Error: PhaseScriptExecution failed with a nonzero exit code" ocorrer ao compilar e executar a demo para iOS?

Siga estas etapas: 1. Acesse o diretório do projeto. 2. Execute pod deintegrate.

  1. Execute pod install.

Após integrar o ApsaraVideo Player SDK for iOS, posso depurar e executar meu aplicativo em um simulador do Xcode?

O ApsaraVideo Player SDK for iOS não oferece suporte a simuladores. Utilize um iPhone físico para depurar e executar seu aplicativo.

Como obter o progresso atual da reprodução

Por padrão, o ApsaraVideo Player SDK relata o progresso da reprodução a cada 500 ms. Reduza o intervalo para atualizações mais frequentes:

AVPConfig *config = [self.player getConfig];
config.positionTimerIntervalMs = 100; // Change the callback interval. Unit: ms.
[self.player setConfig:config];

/**
 @brief: The callback for the current playback position.
 @param player: The player pointer.
 @param position: The current playback position.
 */
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    // The current playback progress.
    long currentPosition = position;
}

Como obter a largura e a altura de um vídeo

Três métodos estão disponíveis:

  • Método 1: Após o player estar preparado (AVPEventPrepareDone), leia a largura e a altura da instância AliPlayer.

    -(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
        if (eventType == AVPEventPrepareDone) {
          NSLog(@"Video width: %d, height: %d", player.width, player.height);
        }
    }
  • Método 2: Escute o callback de alteração de tamanho do vídeo, que retorna a largura e a altura diretamente.

    - (void)onVideoSizeChanged:(AliPlayer*)player width:(int)width height:(int)height rotation:(int)rotation {
        NSLog(@"Video width: %d, height: %d", width, height);
    }
  • Método 3: Escute o callback de informações de faixa e leia videoWidth e videoHeight do AVPTrackInfo no array info.

    Nota

    Este método depende de uma solicitação de rede. Use o Método 1 ou Método 2 para maior confiabilidade.

    - (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
        for (int i=0; i<info.count; i++) {
          AVPTrackInfo *trackInfo = info[i];
          NSLog(@"Video width: %d, height: %d", trackInfo.videoWidth, trackInfo.videoHeight);
      }
    }

A barra de progresso volta após uma operação de busca

Causa: O player usa busca imprecisa por padrão. Após uma operação de busca, a reprodução recomeça a partir de um quadro-chave próximo ao ponto de busca.

Solução: Alterne para o modo de busca precisa.

Como alternar entre os modos de busca precisa e imprecisa

Exemplo:

// Switch to inaccurate seek.
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_INACCURATE];
// Switch to accurate seek.
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_ACCURATE];

A barra de progresso ainda volta após alternar para o modo de busca precisa

Causa: A busca precisa leva mais tempo que a busca imprecisa. Se a distância do ponto de busca até o quadro-chave mais próximo for muito grande e exceder o intervalo máximo para busca precisa, o ApsaraVideo Player SDK alterna automaticamente para a busca imprecisa. Isso faz com que a barra de progresso volte.

Solução: Aumente o intervalo máximo para busca precisa a fim de reduzir a regressão para a busca imprecisa. Um intervalo maior melhora a precisão, mas pode aumentar o tempo de busca quando os quadros-chave estão distantes:

// Unit: ms.
[self.player setMaxAccurateSeekDelta:10000];

Erro durante o cache de vídeo: encrypt check fail

O funcionamento do cache é idêntico ao do download. Com o download seguro ativado, o arquivo de verificação de criptografia deve corresponder às informações do aplicativo. Baixe o arquivo em Offline download e adicione-o ao SDK. Siga as etapas em Video download, caso contrário, o cache ou o download falhará.

Obter dados de origem de áudio e vídeo

O código a seguir fornece um exemplo de como obter dados de origem de áudio e vídeo:

// Set the rendering callback.
self.player.renderingDelegate = self;

// Listen for the rendering callback.
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo {
    if (frameInfo.frameType == Cicada_FrameType_Video) { // Underlying video data.

    } else if (frameInfo.frameType == Cicada_FrameType_Audio) { // Underlying audio data.

    }
    return NO;
}

Como obtenho os pixels de cada quadro de vídeo no player?

ApsaraVideo Player SDK for iOS: Obtenha os pixels escutando o callback onRenderingFrame.

player.renderingDelegate = self;

#pragma mark CicadaRenderingDelegate
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo{
    if(frameInfo.frameType==Cicada_FrameType_Video){
        // Video
        NSLog(@"receive HW frame:%p pts:%ld foramt %d", frameInfo.video_pixelBuffer, frameInfo.pts, CVPixelBufferGetPixelFormatType(frameInfo.video_pixelBuffer));

    } else if (frameInfo.frameType==Cicada_FrameType_Audio){
        // Audio
    }
    return NO;
}

Lógica de troca adaptativa de taxa de bits

Após ativar a troca adaptativa de taxa de bits com a API [self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];, o SDK monitora a velocidade da rede. Se a velocidade atingir o próximo nível de taxa de bits dentro de 10 segundos, o player fará a troca; caso contrário, permanecerá na taxa de bits atual.

  • De alta para baixa: o player realiza a troca após o término da reprodução do conteúdo em cache de alta taxa de bits.

  • De baixa para alta: a troca pelo player é imediata.

Lógica de nova tentativa personalizada

Por padrão, o SDK tenta novamente operações de rede com falha duas vezes, com um tempo limite de 15 segundos. Se todas as tentativas falharem, o callback Error será acionado.

Para personalizar a lógica de nova tentativa, defina a contagem de tentativas como 0 e trate os eventos de repetição externamente:

AVPConfig *config = [self.player getConfig];
config.networkRetryCount = 0; // Set the number of retries. In this example, the value is set to 0.
[self.player setConfig:config];

/**
 @brief: The callback for player events.
 @param player: The player pointer.
 @param eventWithString: The player event type.
 @param description: The description of the player event.
 @see AVPEventType
 */
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
    if (eventWithString == EVENT_PLAYER_NETWORK_RETRY) { // Network error. A retry is required.
        // TODO: Add the processing logic.
    }
}

Um erro 403 é relatado e a reprodução de um fluxo HLS falha após a configuração do cache local

Sintoma: A reprodução de um fluxo HLS (M3U8) com VidAuth e cache local ativados falha com um erro 403.

Causa: Se você sair antes que o vídeo seja totalmente armazenado em cache, o player reutiliza credenciais VidAuth expiradas na próxima tentativa de reprodução, causando um erro 403.

Solução: No SDK V5.5.4.0 e posteriores, defina o campo AVPConfig.enableStrictAuthMode para controlar o modo de autenticação de fluxos HLS com parâmetros de autenticação. O padrão é false.

  • Autenticação não estrita (false): As informações de autenticação são armazenadas em cache junto com o conteúdo de mídia. Se apenas parte da mídia foi armazenada anteriormente, o player usa as informações de autenticação em cache para solicitar a parte não armazenada. Se a autenticação da URL tiver um curto período de validade ou se a reprodução for retomada após uma longa pausa, a autenticação poderá expirar. Para lidar com isso, implemente o recurso automatic source refresh.

  • Autenticação estrita (true): As informações de autenticação não são armazenadas em cache. A autenticação ocorre no início de cada sessão de reprodução. Isso pode causar falha na reprodução se não houver conexão de rede.

A preempção de áudio impede o ApsaraVideo Player SDK for iOS de reproduzir vídeos

Sintoma: Quando seu projeto usa tanto o ApsaraVideo Player SDK quanto outros controles de áudio, ocorrem problemas de reprodução, como falta de som ou travamento do vídeo.

Causa: O AVAudioSession no iOS é um singleton. Sem uma configuração unificada entre múltiplos controles de áudio, a preempção de áudio pode impedir a reprodução de vídeo.

Solução: Configure o AVAudioSession de maneira unificada em um local apropriado do seu projeto. Por exemplo, configure a sessão de áudio do aplicativo como categoria de reprodução e permita a mixagem com outros aplicativos. Também é possível configurar a sessão de áudio do aplicativo como a categoria PlayAndRecord para cenários de gravação e reprodução. Se ocorrer um erro durante a operação, a mensagem de erro será armazenada na variável err.

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err];

Alternativamente, defina um proxy personalizado de AVAudioSession no lado do SDK para ignorar sua lógica interna de AVAudioSession e evitar a preempção:

  1. Defina o proxy.

    [AliPlayer setAudioSessionDelegate:self];
  2. Configure o listener para o proxy.

    return TRUE indica que o SDK não configura mais o AVAudioSession internamente.

    #pragma mark CicadaAudioSessionDelegate
    - (BOOL)setActive:(BOOL)active error:(NSError **)outError
    {
        return YES;
    }
    
    - (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError
    {
          return YES;
    }
    
    - (BOOL)setCategory:(AVAudioSessionCategory)category mode:(AVAudioSessionMode)mode routeSharingPolicy:(AVAudioSessionRouteSharingPolicy)policy options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError
    {
        return YES;
    }

Uma falha de pilha apontando para o SDK ocorre durante a execução do ApsaraVideo Player SDK for iOS

Se uma falha de pilha apontando para o SDK ocorrer enquanto você usa o ApsaraVideo Player SDK for iOS, siga estas etapas:

  1. Atualize para a versão mais recente do ApsaraVideo Player SDK for iOS, que inclui melhorias contínuas de estabilidade. Baixe o SDK mais recente em SDK introduction.

  2. Se a falha persistir após a atualização, forneça informações completas sobre o crash ao suporte técnico da Alibaba Cloud. Get technical support.

O ApsaraVideo Player SDK for iOS suporta download durante a reprodução?

Não. O SDK suporta cache local, que baixa vídeos durante a reprodução para uso offline posterior. No entanto, ele não suporta a reprodução de arquivos em cache armazenados em um diretório de arquivos separado.

O ApsaraVideo Player SDK for iOS suporta a obtenção do progresso de buffer de um vídeo?

Sim. O ApsaraVideo Player SDK for iOS permite obter a velocidade de buffer, taxa de quadros de renderização em tempo real, taxas de bits de áudio e vídeo e taxa de bits de download de rede. Get playback information.

Ocorre uma falha enquanto o player está em execução

Para identificar a causa:

  1. Verifique se a falha ocorre no ApsaraVideo Player SDK.

    Confira se a pilha de falha contém o prefixo AliyunPlayer. Em caso afirmativo, o problema reside no ApsaraVideo Player SDK.

  2. Atualize para a versão mais recente do ApsaraVideo Player SDK e verifique se o problema foi resolvido.

  3. Caso o problema persista, prepare os arquivos de falha (todas as threads), logs de falha e cenários de falha conforme descrito em How to obtain logs.

Uma falha relacionada à inicialização do programa ou pré-carregamento ocorre durante a execução do ApsaraVideo Player SDK V5.4.6.0

Atualize o ApsaraVideo Player SDK para uma versão posterior à V5.4.7.1. Para manter a estabilidade da V5.4.6.0, utilize também a versão hotfix pod 5.4.6.0-25587639.

Como ativar a reprodução em tela cheia

O ApsaraVideo Player SDK for iOS não fornece uma API para reprodução em tela cheia. Implemente esse recurso com base no sistema. O ApsaraVideo Player SDK for iOS demo para versões 5.5.0.0 e posteriores está adaptado ao método de tela cheia do iOS 16.0 e superiores.

O código a seguir fornece um exemplo de como implementar este recurso:

Nota

Após executar o método de tela cheia do sistema, ajuste também o frame do playerView definido para a instância Aliplayer com base na tela.

UIInterfaceOrientation orientation = UIInterfaceOrientationLandscapeLeft; // Rotate to full screen
......

// For iOS 16.0 and later
if (@available(iOS 16.0, *)) {
    @try {
            NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
      UIWindowScene *ws = (UIWindowScene *)array[0];
        Class GeometryPreferences = NSClassFromString(@"UIWindowSceneGeometryPreferencesIOS");
      id geometryPreferences = [[GeometryPreferences alloc]init];
      UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskLandscapeRight;
      if (orientation == UIInterfaceOrientationPortrait) {
          orientationMask = UIInterfaceOrientationMaskPortrait;
      }
      [geometryPreferences setValue:@(orientationMask) forKey:@"interfaceOrientations"];
      SEL sel_method = NSSelectorFromString(@"requestGeometryUpdateWithPreferences:errorHandler:");
      void (^ErrorBlock)(NSError *err) = ^(NSError *err){
            NSLog(@"Screen rotation error:%@", [err debugDescription]);
      };
      if ([ws respondsToSelector:sel_method]) {
          (((void (*)(id, SEL,id,id))[ws methodForSelector:sel_method])(ws, sel_method,geometryPreferences,ErrorBlock));
      }
  } @catch (NSException *exception) {
      NSLog(@"Screen rotation error:%@", exception.reason);
  } @finally {
  }
} else { // For systems earlier than iOS 16.0
  if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
      SEL selector = NSSelectorFromString(@"setOrientation:");
      NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
      [invocation setSelector:selector];
      [invocation setTarget:[UIDevice currentDevice]];
      [invocation setArgument:&Orientation atIndex:2];
      [invocation invoke];
  }
  [[UIApplication sharedApplication]setStatusBarOrientation:orientation animated:YES];
}

Barras pretas aparecem durante a reprodução de vídeo

Para identificar a causa:

  1. Verifique se a própria fonte de vídeo possui barras pretas.

  2. Chame a seguinte API para ajustar o modo de dimensionamento do player.

    /*
    AVP_SCALINGMODE_SCALEASPECTFILL: The video is scaled to fill the screen. The video may be cropped.
    AVP_SCALINGMODE_SCALEASPECTFIT: The video is scaled to fit the screen. Black bars may appear.
    AVP_SCALINGMODE_SCALETOFILL: The video is scaled to fill the screen without preserving the aspect ratio. The video may be distorted.
    */
    self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
  3. Se o modo de dimensionamento não atender aos seus requisitos, ajuste a largura e a altura da visualização personalizada para self.player.playerView modificando o frame de self.player.playerView.

O áudio toca, mas nenhum vídeo é exibido, e o log relata "log[AFVTBDecoder] :IOS8VT: throw frame"

Para identificar a causa:

  1. Use outro player para reproduzir o vídeo e verifique se é um arquivo apenas de áudio.

  2. Se o vídeo for reproduzido normalmente em outro player e as dimensões do vídeo mudarem, alterne para decodificação via software. O código a seguir mostra como fazer essa alteração:

    player.enableHardwareDecoder = NO

Qual é o impacto de alternar para decodificação via software em players iOS?

Após definir player.enableHardwareDecoder = NO para alternar para decodificação via software, os principais efeitos são:

  • A taxa de utilização da CPU aumentará, o que pode causar aquecimento do dispositivo e consumo mais rápido de bateria.

  • Evita eficazmente problemas de compatibilidade da decodificação de hardware. Especialmente em cenários de mudança dinâmica de resolução de vídeo ou alta carga do dispositivo, melhora a estabilidade da reprodução.

Nota

Neste artigo, a subseção "ao reproduzir vídeo, não há som nem imagem, o log relata log[AFVTBDecoder] :IOS8VT: throw frame" sugeriu resolver esse problema definindo player.enableHardwareDecoder = NO para alternar para decodificação via software. Aqui está uma explicação suplementar sobre o custo e o benefício dessa configuração para avaliação antes da ativação.

Travamentos e dessincronização de áudio e vídeo ocorrem durante o pull de fluxo RTS em um cliente iOS

Solução: Integre o componente de latência ultrabaixa mais recente do player. Implement RTS stream pulling on an iOS client.

Quando um aplicativo iOS está em segundo plano ou não foi iniciado, o áudio toca, mas nenhum vídeo é exibido se o usuário entrar no aplicativo por meio de uma notificação.

Solução: Remova UIApplicationStateActive == [[UIApplication sharedApplication] applicationState].

- (AliPlayer *)aliPlayer{
    if (!_aliPlayer && UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]) {
        _aliPlayer = [[AliPlayer alloc] init];
        _aliPlayer.scalingMode =  AVP_SCALINGMODE_SCALEASPECTFIT;
        _aliPlayer.rate = 1;
        _aliPlayer.delegate = self;
        _aliPlayer.playerView = self.playerView;
    }
    return _aliPlayer;
}

Ao reproduzir uma transmissão ao vivo, o log relata um erro padrão: "-5, IO error (Input/Output (I/O))"

Ao reproduzir uma transmissão ao vivo, use os valores padrão para as configurações de cache e controle de latência (startBufferDuration, highBufferDuration e maxBufferDuration no AVPConfig). Não personalize essas configurações. Verifique sua configuração em relação a Configure cache and latency control.

Após pausar a reprodução, navegar para outra página e retornar para retomar, um erro relacionado a áudio é relatado no log: "Deactivating an audio session that has running I/O." ou "All I/O should be stopped or paused prior to deactivating the audio session."

Sintoma: Na página de reprodução de vídeo, você pausa a reprodução e navega para outra página que possui áudio. Ao retornar, não é possível retomar a reprodução, e um erro relacionado a áudio, como "Deactivating an audio session that has running I/O." ou "All I/O should be stopped or paused prior to deactivating the audio session.", é relatado no log.

Solução: Verifique se há conflitos nas configurações de áudio (propriedades AudioSession). Por exemplo, ao sair de outra página com áudio, os recursos de áudio podem não ser liberados a tempo (a gravação ou reprodução de áudio relacionada não é interrompida prontamente).

Ocorre um erro ao usar o AliListPlayer para reproduzir um vídeo HLS (m3u8)

Versões do ApsaraVideo Player SDK anteriores à V5.4.5.0 não suportam o uso do list player AliListPlayer para reproduzir vídeos HLS (m3u8). As versões V5.4.5.0 e posteriores suportam a reprodução de vídeos HLS (m3u8), mas é necessário ativar o cache local. Local caching.

Impossível reproduzir um vídeo em segundo plano

Sintoma: O ApsaraVideo Player SDK for iOS não suporta reprodução em segundo plano por padrão. A demo também não reproduz vídeos em segundo plano.

Solução:

  1. Ative o recurso de coleta de dados em segundo plano no Xcode. No Xcode, selecione o target, abra a aba Capabilities, defina o interruptor Background Modes como ON e, na lista expandida de Modes, selecione Audio, AirPlay, and Picture in Picture.

  2. Se você implementou métodos de monitoramento de primeiro plano/segundo plano do aplicativo, comente os métodos relacionados de pausa e retomada.

    // Add an observer to detect when the app enters the background
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnterBackground) name: UIApplicationWillResignActiveNotification object:nil];
    // This method is called when the app enters the foreground from the background
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name: UIApplicationDidBecomeActiveNotification object:nil];
    
    // The pause method that needs to be commented out
    - (void)applicationEnterBackground {
       // [self.player pause];
    }
    // The restart method that needs to be commented out
    - (void)applicationDidBecomeActive {
       // [self.player start];
    }

O erro "Redirect to a url" ocorre ocasionalmente durante a reprodução de vídeo

Esse erro pode ocorrer porque a fonte de vídeo foi sequestrada. Ative o HTTPDNS no player para resolver isso. Configure HTTPDNS for an iOS client.

Ocorre um erro unsupported protocol ao reproduzir um fluxo ARTC

Causa 1: A camada de ponte entre o player e o componente RTS (AlivcArtc) e o componente RTS (RtsSDK) não estão integrados, embora o ApsaraVideo Player SDK esteja integrado.

Solução: Para obter informações sobre como integrar os componentes, consulte Implement RTS stream pulling on an iOS client.

Causa 2: A versão da camada de ponte entre o player e o componente RTS (AlivcArtc) é inconsistente com a versão do player.

Solução: A camada de ponte (AlivcArtc) e o player devem ter o mesmo número de versão. Implement RTS stream pulling on an iOS client.

Se um vídeo for transcodificado em múltiplas definições, qual definição o ApsaraVideo Player SDK reproduz por padrão?

O SDK reproduz a primeira definição disponível nesta ordem: FD, LD, SD, HD, 2K, 4K, OD. Definition.

Como especificar a definição padrão para reprodução de vídeo

Exemplo:

// The following code provides an example of playback using VidSts.
AVPVidStsSource *stsSource = [[AVPVidStsSource alloc] init];
stsSource.vid = @"<vid>";
stsSource.accessKeyId = @"<accessKeyId>";
stsSource.securityToken = @"<securityToken>";
stsSource.accessKeySecret = @"<accessKeySecret>";
stsSource.quality = @""; // The expected definition for playback. Valid values: FD, LD, SD, HD, 2K, 4K, and OD.
stsSource.forceQuality = NO; // Specifies whether to forcibly play the video in the expected definition. NO: The video is not forcibly played in the expected definition. The player searches for definitions in the default order and plays the video in the first definition that it finds. YES: The video is forcibly played in the expected definition. If the expected definition is not found, the video is not played.

Se uma definição tiver múltiplos fluxos, qual fluxo o ApsaraVideo Player SDK reproduz?

Se uma definição possuir múltiplos fluxos, o ApsaraVideo Player SDK reproduzirá o fluxo mais recente.

Como configurar um vídeo para ser reproduzido sem marca d'água, mas baixado com marca d'água?

Transcodifique o vídeo em múltiplas definições. Reproduza a definição sem marca d'água e baixe a definição com marca d'água.

O modo paisagem não entra em vigor

O ApsaraVideo Player SDK for iOS não fornece um método para implementar o modo paisagem. Implemente esse recurso com base na API do sistema iOS. Ao implementar o modo paisagem, certifique-se de definir corretamente o frame de aliplayer.playerView.

Como obter logs

Envie logs ao solicitar suporte técnico da Alibaba Cloud para acelerar a resolução de problemas.

  1. Obtenha os logs.

    Defina o nível de log como LOG_LEVEL_TRACE antes de obter os logs. Obtain SDK logs.

  2. Forneça os logs gerados ao suporte técnico da Alibaba Cloud.

    Get technical support.

Após a ativação do cache local, o vídeo multi-taxa (HLS) perde o cache.

Fenômeno do problema: O cache local foi ativado e pré-carregado conforme a documentação, mas o progresso de busca volta para pontos onde o cache foi perdido durante a reprodução, ou a reprodução não continua após a desconexão da rede, ou a verificação do arquivo de cache retorna que ele não existe, ou o diretório de cache está vazio após desativar o pré-carregamento.

Causa do problema: No cenário de múltiplas taxas de bits (HLS), se um determinado fluxo não for explicitamente selecionado durante a reprodução, o player reproduzirá no modo ABR (taxa de bits adaptativa), e os dados no modo ABR não são gravados no disco, portanto, nenhum cache local é gerado. Somente após chamar explicitamente selectTrack para selecionar um determinado fluxo de código, os dados selecionados serão armazenados em cache localmente. Se selectTrack não for chamado (ou se for passado SELECT_AVPTRACK_TYPE_VIDEO_AUTO), o processamento seguirá o modo ABR.

Solução: Garanta que o pré-carregamento e a reprodução usem a mesma definição e o mesmo endereço de reprodução, e selecione explicitamente o fluxo de código durante a reprodução.

  1. Na etapa de pré-carregamento, o cache local é ativado para iniciar o pré-carregamento no fluxo de código da definição especificada.

  2. A fase de reprodução chama selectTrack após onPlayerEvent receber o evento de conclusão de preparação (AVPEventPrepareDone), e seleciona a mesma definição do pré-carregamento; setUrlSource(AVPUrlSource) usa o mesmo endereço de reprodução do pré-carregamento e, em seguida, executa prepare e start.

  3. Se a taxa de bits inicial for inconsistente com a taxa de bits padrão, o buffer será acionado. Recomenda-se definir a taxa de bits inicial para reduzir travamentos durante a troca.

A reprodução de um arquivo HLS (m3u8) baixado localmente resulta no erro “No such file or directory.”

Fenômeno do problema: Após o download offline do HLS, ao reproduzir o endereço local, é relatado No such file or directory (arquivo não encontrado). Esse problema pode não ser constante e é mais fácil de reproduzir em cenários como troca rápida de múltiplas páginas (deslizamento rápido).

Causa do problema: O download offline de HLS geralmente baixa apenas fatias ts e m3u8 de uma das definições (ex: 540p) para economizar espaço, mas o master m3u8 salvo localmente ainda mantém os registros de todas as definições (ex: 1080p/720p/540p/360p) como estavam. Durante a reprodução, se a definição baixada não for especificada antes de prepare, o player tentará solicitar outras partes de definição que não existem localmente, seguindo a lógica padrão/adaptativa, relatando assim que o arquivo não foi encontrado. Uma causa comum é a omissão de uma chamada com definição de clareza especificada, ou o momento da chamada ser posterior a prepare.

Solução:

  1. Chame setDefaultResolution antes de prepare, especificando a mesma definição do download offline.

  2. Garanta que todos os portais de reprodução estejam configurados com a definição padrão, incluindo deslizamento rápido, multiplexação de múltiplas instâncias, troca de pré-carregamento e outras ramificações para evitar esquecer algum caminho.

  3. Use getCurrentTrack para verificar se a definição inicial real é a definição baixada.

Ocorre desalinhamento de áudio e vídeo após a troca de vídeo, ou o mesmo vídeo é reproduzido repetidamente e perde o cache.

Fenômeno do problema: Após ativar o cache local, ao trocar vídeos (como mudar o número de episódios), ocorre um desalinhamento de som e imagem (a tela mostra um novo vídeo, mas o som ainda é do vídeo anterior), ou o mesmo vídeo é reproduzido repetidamente sem atingir o cache; após limpar o cache, tudo volta ao normal.

Causa do problema: Com o cache local ativado, o player usa o Hash retornado pelo callback setCacheUrlHashCallback como identificador único de cache para cada endereço de reprodução (o iOS implementa esse callback através de ponteiro de função C). Se o callback não garantir que "o mesmo endereço de reprodução sempre retorne o mesmo hash, e conteúdos diferentes retornem hashes diferentes", ocorrerá incompatibilidade de chave de cache: conteúdos diferentes atingem o mesmo cache (manifestado como desalinhamento de áudio e imagem), ou o mesmo endereço gera um hash diferente a cada vez, impossibilitando o acerto do cache.

Solução:

  1. O callback deve retornar de forma estável o mesmo hash para o mesmo endereço de reprodução, e mídias diferentes devem retornar hashes diferentes.

  2. Por exemplo, para remover o parâmetro de autenticação e melhorar a taxa de acerto, calcule o hash apenas após remover o parâmetro de autenticação do endereço de reprodução (m3u8/mp4); O keyURL do m3u8 criptografado não precisa ser autenticado, caso contrário, as chaves de vídeos diferentes atingirão o mesmo cache e causarão falha na reprodução — isso pode ser tratado diferentemente por nome de domínio no callback.

  3. Se o mesmo arquivo tiver endereços HTTP e HTTPS, unifique o protocolo ou calcule o hash após remover o cabeçalho do protocolo.

Para mais detalhes, consulte Advanced features.

Falha na autenticação ao reproduzir vídeo com criptografia privada da Alibaba Cloud

Fenômeno do problema: Ao reproduzir um vídeo criptografado pela Alibaba Cloud (criptografia privada), a autenticação falha ou a reprodução não ocorre.

Causa do problema: A criptografia de vídeo da Alibaba Cloud (criptografia privada) é descriptografada através da interação entre o player e o servidor, e a reprodução deve ser iniciada via reprodução por vid. Se você usar o AVPUrlSource sob demanda para passar diretamente o endereço de reprodução (criptografia privada comum), a autenticação e descriptografia não podem ser concluídas, resultando em falha.

Solução:

  1. Vídeos com criptografia privada são reproduzidos no iOS através de AVPVidAuthSource (VidAuth) ou AVPVidStsSource (VidSts) sob demanda. Se o fluxo de saída estiver misturado com fluxos não criptografados privadamente, defina o tipo de criptografia como AliyunVoDEncryption para filtrar fluxos com criptografia privada.

  2. Nota: Apenas a "Criptografia privada de licença" suporta reprodução sob demanda via AVPUrlSource (MP4 deve ter etavirp_nuyila=1 concatenado ao final da URL, HLS pode usar diretamente a URL original na versão suportada correspondente), a criptografia privada comum não se aplica.

Para mais detalhes, consulte Play an encrypted video.