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.
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.
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.mp4oucontent://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;
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
destroyAsyncse 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
stopantes dedestroyAsync, 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;
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
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
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.
-
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]; -
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];NotaOs logs no nível de quadro geram um grande volume de logs e são usados principalmente para solucionar problemas de reprodução.
-
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
.logdo 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.
-
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); }]; -
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 |
|
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.