Todos os produtos
Search
Central de documentação

ApsaraVideo VOD:Tipos de cena

Última atualização: Sep 11, 2026

O tipo de cena (SceneType) é uma abstração no AliPlayerKit para cenários de reprodução. Especifique uma cena para adaptar automaticamente o comportamento da UI, os controles por gestos e a visibilidade dos slots.

Nota

Não é necessário definir um SceneType para cenários padrão de vídeo sob demanda (VOD). O padrão é SceneTypeVOD, que oferece capacidades completas de reprodução. Especifique explicitamente um SceneType apenas para cenários fora do VOD, como transmissões ao vivo ou reprodução restrita.

Introdução

O que é SceneType?

SceneType é uma enumeração que define o cenário de negócio atual do player. Ao configurar o SceneType, o AliPlayerKit automaticamente:

  • Ajusta a visibilidade dos slots, como ocultar a miniatura em um cenário de transmissão ao vivo.

  • Filtra gestos, desativando a busca na barra de progresso e o ajuste de velocidade de reprodução em cenários ao vivo ou restritos, ou desabilitando gestos verticais em listas de vídeos.

  • Adapta-se a limitações de recursos, garantindo, por exemplo, que os usuários assistam ao conteúdo integralmente e em ordem em um cenário restrito.

Basta definir um valor de enumeração para que o framework gerencie essas adaptações automaticamente. Isso reduz significativamente o esforço necessário para personalizar o player para diferentes cenários de negócio.

Valor principal

Valor

Descrição

Adaptação sem configuração

Após definir uma cena, a UI e os comportamentos interativos se ajustam automaticamente. Não há necessidade de configurar cada slot e gesto individualmente.

Garantia de consistência

Todas as instâncias do player no mesmo cenário mantêm uma UI e um comportamento interativo consistentes.

Redução do custo de personalização

Substitua dezenas de linhas de código de visibilidade de slots e filtragem de gestos por uma única linha de código.

Escalabilidade

Faça ajustes finos adicionais usando SlotConfig e GestureControlSlotConfig.

Recursos

Visão geral dos cenários

O AliPlayerKit possui cinco tipos de cena integrados que cobrem a maioria dos requisitos de reprodução:

Cenário

Valor da enumeração

Descrição

Negócio aplicável

Diferenças em relação ao VOD

VOD

SceneTypeVOD

Cenário padrão. Suporta todas as capacidades de controle.

VOD padrão, cursos, Media Library

—

Live

SceneTypeLive

Stream em tempo real sem duração fixa. Operações na linha do tempo são desativadas automaticamente.

Transmissão ao vivo, eventos esportivos, E-commerce live streaming

Desativa a busca na barra de progresso e o ajuste de velocidade de reprodução. Oculta a miniatura.

Video List

SceneTypeVideoList

Desativa gestos verticais para evitar conflitos com a rolagem da lista.

Feeds, listas de vídeos curtos

Desativa gestos verticais de volume e brilho.

Restricted Playback

SceneTypeRestricted

Impede avanços para garantir que os usuários assistam a todo o vídeo.

Monitoramento de exames, cursos de treinamento

Desativa a busca na barra de progresso e o ajuste de velocidade de reprodução. Oculta a miniatura.

Minimal

SceneTypeMinimal

Interface limpa. Todos os controles devem ser implementados separadamente.

Reprodução em segundo plano, UI totalmente personalizada

Oculta todos os componentes de controle e gestos.

Definição da enumeração

// SceneType.h
typedef NS_ENUM(NSInteger, SceneType) {
    /** VOD scenario (default) */
    SceneTypeVOD = 0,

    /** Live streaming scenario */
    SceneTypeLive = 1,

    /** Video list or short video stream scenario */
    SceneTypeVideoList = 2,

    /** Restricted playback scenario */
    SceneTypeRestricted = 3,

    /** Minimal playback page scenario */
    SceneTypeMinimal = 4,
};

Matriz de capacidades dos cenários

Visibilidade dos slots

O sistema de slots controla automaticamente a visibilidade dos componentes com base no tipo de cena. A matriz a seguir mostra as regras padrão de DefaultSlotFactory.defaultConfigs:

Slot

VOD

Live

VideoList

Restricted

Minimal

PlayerSurface

✓

✓

✓

✓

✓

GestureControl

✓

✓

✓

✓

✗

LandscapeHint

✓

✓

✓

✓

✗

Cover

✓

✗

✓

✗

✗

CenterDisplay

✓

✓

✓

✓

✗

PlayState

✓

✓

✓

✓

✓

LogPanel

✓

✓

✓

✓

✗

TopBar

✓

✓

✓

✓

✗

BottomBar

✓

✓

✓

✓

✗

SettingMenu

✓

✓

✓

✓

✗

OptionPanel

✓

✓

✓

✓

✗

Descrições das regras de visibilidade:

  • PlayerSurface e PlayState: Visíveis em todos os cenários (sem configuração de excludedScenes).

  • Cover: Não visível nos cenários Live, Restricted ou Minimal.

  • Demais slots (GestureControl, LandscapeHint, CenterDisplay, LogPanel, TopBar, BottomBar, SettingMenu, OptionPanel): Não visíveis apenas no cenário Minimal.

Diferenças no comportamento dos gestos

O GestureControlSlot filtra internamente os gestos em cada método de tratamento com base no currentSceneType:

Gesto

VOD

Live

VideoList

Restricted

Minimal

Clique (Mostrar/Ocultar barra de controle)

✓

✓

✓

✓

✗

Clique duplo (Reproduzir/Pausar)

✓

✓

✓

✓

✗

Pressionar e segurar (Avanço rápido)

✓

✗

✓

✗

✗

Arrastar horizontalmente (Buscar progresso)

✓

✗

✓

✗

✗

Arrastar verticalmente à esquerda (Brilho)

✓

✓

✗

✓

✗

Arrastar verticalmente à direita (Volume)

✓

✓

✗

✓

✗

Descrições da lógica de filtro:

  • Minimal: Todos os métodos de tratamento de gestos (handleSingleTap:, handleDoubleTap:, handleLongPress: e handlePan:) executam return imediatamente no ponto de entrada.

  • Live / Restricted: Os gestos de pressionar e segurar e arrastar horizontalmente são desativados. Essa verificação ocorre em handleLongPress: e tryStartDragWithCurrentPoint:.

  • VideoList: O arrasto vertical é desativado. O método tryStartDragWithCurrentPoint: executa return imediatamente ao detectar SceneTypeVideoList.

Uso

Uso básico

Especifique o tipo de cena usando a propriedade AliPlayerModel.sceneType. O padrão é SceneTypeVOD, portanto não é necessário defini-lo explicitamente.

Cenário VOD (padrão, sem configuração necessária):

VideoSource *source = [VideoSource urlSourceWithUrl:@"https://example.com/video.mp4"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
// model.sceneType defaults to SceneTypeVOD, no setup required

[controller configure:model];

Cenário de transmissão ao vivo:

VideoSource *source = [VideoSource urlSourceWithUrl:@"https://live.example.com/stream.m3u8"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeLive;
model.videoTitle = @"Live Channel";

[controller configure:model];

Cenário de lista de vídeos:

VideoSource *source = [VideoSource urlSourceWithUrl:@"https://live.example.com/stream.m3u8"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeLive;
model.videoTitle = @"live channel";

[controller configure:model];

Descrição detalhada de cada cenário

VOD - Cenário VOD (padrão)

Cenários: Reprodução de vídeo padrão, cursos online, navegação na Media Library, entre outros.

Capacidades:

  • Suporta todos os 11 slots padrão

  • Suporta todos os 6 gestos

  • Permite busca na barra de progresso, ajuste de velocidade de reprodução e troca de resolução

  • Permite alternância para tela cheia

// No need to explicitly specify SceneType, the default is VOD
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.coverUrl = @"https://example.com/cover.jpg";
model.videoTitle = @"Great Video";
model.autoPlay = YES;

[controller configure:model];

Live - Cenário de transmissão ao vivo

Cenários: Transmissões ao vivo em tempo real, eventos esportivos, E-commerce live streaming, entre outros.

Principais diferenças em relação ao VOD:

  • Desativado: Busca na barra de progresso (gesto horizontal) e ajuste de velocidade de reprodução (gesto de pressionar e segurar), pois streams ao vivo não têm duração fixa.

  • Oculto: Slot de miniatura, já que streams ao vivo não precisam de miniatura.

  • Mantido: Gestos de clique/clique duplo e ajuste de volume/brilho.

AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:liveSource];
model.sceneType = SceneTypeLive;
model.videoTitle = @"Popular Live Stream";
model.autoPlay = YES;

[controller configure:model];

VideoList - Cenário de lista de vídeos

Cenários: Vídeos incorporados em feeds, listas de vídeos curtos, coleções de vídeos com rolagem, entre outros.

Principais diferenças em relação ao VOD:

  • Desativado: Gestos de arrasto vertical para evitar conflitos com a rolagem da UIScrollView da lista.

  • Mantido: Todos os demais recursos, como busca na barra de progresso, ajuste de velocidade de reprodução e gestos de clique/clique duplo/pressionar e segurar.

AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeVideoList;
model.autoPlay = YES;

[controller configure:model];

Restricted - Cenário de reprodução restrita

Cenários: Vídeos de monitoramento de exames online, cursos de treinamento e certificação, cenários de proteção de direitos autorais, entre outros.

Principais diferenças em relação ao VOD:

  • Desativado: Busca na barra de progresso (gesto horizontal) e ajuste de velocidade de reprodução (gesto de pressionar e segurar) para garantir que os usuários assistam ao conteúdo integralmente e em ordem.

  • Oculto: Slot de miniatura.

  • Mantido: Gestos de clique/clique duplo e ajuste de volume/brilho.

AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeRestricted;
model.videoTitle = @"Security Training Course";
model.autoPlay = YES;
// Usually used with screenshot prevention
model.disableScreenshot = YES;

[controller configure:model];

Minimal - Modo mínimo

Cenários: Reprodução em segundo plano, UI totalmente personalizada, reprodução de miniaturas de pré-visualização, entre outros.

Principais diferenças em relação ao VOD:

  • Oculto: Quase todos os slots de controle da UI. Apenas PlayerSurface e PlayState são mantidos.

  • Desativado: Todos os gestos. O slot GestureControl não fica visível no cenário Minimal, e seus métodos internos de tratamento de gestos executam return imediatamente.

  • Casos de uso: Cenários que exigem uma UI de controle de reprodução totalmente personalizada.

AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;

[controller configure:model];
// All controls must be implemented using the controller's API
// For example: [controller play]; [controller pause]; [controller seekTo:position];

Desenvolvimento personalizado

Ajuste fino da visibilidade dos slots

Se a visibilidade predefinida dos slots para um cenário não atender aos seus requisitos, faça ajustes finos usando SlotConfig:

// Example: Hide the TopBar in the Live scenario
SlotConfig *topBarConfig = [SlotConfig configWithSlotType:SlotTypeTopBar
                                           excludedScenes:[NSSet setWithObjects:
                                               @(SceneTypeMinimal),
                                               @(SceneTypeLive), nil]];

// Register with SlotManager (overwrites the default SlotConfig for this slot type)
[playerView.slotManager registerSlotConfig:topBarConfig];

Também é possível ocultar um slot inteiro diretamente usando hideSlot:. Este método não depende do cenário:

// Unconditionally hide the TopBar (requires calling rebuildSlots to take effect)
[playerView.slotManager hideSlot:SlotTypeTopBar];
Nota

registerSlotConfig: fornece controle de visibilidade no nível da cena, enquanto hideSlot: fornece controle de visibilidade no nível do slot. Eles funcionam de forma independente. Um slot só é criado se passar por ambas as verificações.

Ajuste fino do comportamento dos gestos

O controle de gestos suporta dois métodos para ajustes finos:

Método 1: Desative gestos específicos usando a API de máscara de bits de elementos do SlotManager. Este é o método recomendado. Configure-o antes da chamada attach.

// Disable long press for fast-forward in the VOD scenario
[playerView.slotManager hideElements:GestureElementLongPress
                             forSlot:SlotTypeGestureControl];

Método 2: Controle os gestos diretamente usando GestureControlSlotConfig. Recupere a instância do slot após a chamada attach:

// Get the gesture control slot instance
GestureControlSlot *gestureSlot = (GestureControlSlot *)[playerView.slotManager slotViewForType:SlotTypeGestureControl];

// Modify the configuration (takes effect immediately)
GestureControlSlotConfig *config = [GestureControlSlotConfig defaultConfig];
config.longPressEnabled = NO;
config.horizontalDragEnabled = NO;
gestureSlot.config = config;
Nota

Os dois métodos funcionam de forma independente. A máscara de bits de elementos é aplicada quando o slot é criado (durante a fase setupContentView). O GestureControlSlotConfig entra em vigor dinamicamente em tempo de execução.

Registro de slots personalizados no cenário Minimal

No cenário Minimal, a configuração da cena exclui a maioria dos slots padrão. Para restaurar um slot, substitua seu SlotConfig:

AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;

// Override the scene configuration for BottomBar to remove the Minimal exclusion rule
[playerView.slotManager registerSlotConfig:
    [SlotConfig configWithSlotType:SlotTypeBottomBar]]; // No excludedScenes = visible in all scenarios

[controller configure:model];

Condições dinâmicas de visibilidade

Use o callback SlotConfig visibilityCondition para implementar controle dinâmico em tempo de execução:

SlotConfig *coverConfig = [SlotConfig configWithSlotType:SlotTypeCover
                                          excludedScenes:nil
                                     visibilityCondition:^BOOL{
    // Show the cover slot only if a cover URL exists
    return model.coverUrl != nil;
}];

[playerView.slotManager registerSlotConfig:coverConfig];
Nota

O método isVisibleInScene: verifica primeiro excludedScenes. Se houver correspondência, o slot não ficará visível. Em seguida, o método verifica visibilityCondition. Se este callback retornar NO, o slot não ficará visível. Um slot só é visível se passar por ambas as verificações.

Guia de seleção de cena

Fluxo de decisão

Do you need a player control UI?
├── No → SceneTypeMinimal
└── Yes → Is it a live stream?
         ├── Yes → SceneTypeLive
         └── No → Is the player embedded in a scrollable list?
                   ├── Yes → SceneTypeVideoList
                   └── No → Do you need to prevent users from skipping?
                             ├── Yes → SceneTypeRestricted
                             └── No → SceneTypeVOD (default)

Tabela resumida de seleção de cena

Requisito de negócio

Cenário recomendado

Principais motivos

Reprodução de vídeo padrão

SceneTypeVOD

Cenário padrão, suporte completo a recursos

Transmissão ao vivo / Evento esportivo em tempo real

SceneTypeLive

Desativa automaticamente operações de progresso não aplicáveis

Vídeo incorporado em UIScrollView

SceneTypeVideoList

Evita automaticamente conflitos de gestos verticais

Treinamento / Exame / Proteção de direitos autorais

SceneTypeRestricted

Desativa automaticamente avanços e ajuste de velocidade de reprodução

UI totalmente personalizada

SceneTypeMinimal

Tela limpa sem interferência de UI integrada

Reprodução em segundo plano / Picture-in-Picture (PiP)

SceneTypeMinimal

Nenhum componente de controle de UI necessário

Referência rápida da API

Enumeração SceneType

Valor da enumeração

Valor inteiro

Descrição

SceneTypeVOD

0

Cenário VOD (padrão)

SceneTypeLive

1

Cenário de transmissão ao vivo

SceneTypeVideoList

2

Cenário de lista de vídeos/stream de vídeos curtos

SceneTypeRestricted

3

Cenário de reprodução restrita

SceneTypeMinimal

4

Cenário de página de reprodução mínima

SlotConfig

Método / Propriedade

Descrição

configWithSlotType:

Cria uma configuração sem cenas excluídas (visível em todos os cenários)

configWithSlotType:excludedScenes:

Cria uma configuração com cenas excluídas especificadas

configWithSlotType:excludedScenes:visibilityCondition:

Cria uma configuração com cenas excluídas e uma condição dinâmica

slotType

Tipo de slot (readonly)

excludedScenes

Conjunto de cenas excluídas, NSSet<NSNumber *> (readonly, nullable)

visibilityCondition

Bloco de condição de visibilidade dinâmica (readonly, nullable)

isVisibleInScene:

Verifica se o slot está visível em um cenário especificado

GestureControlSlotConfig

Propriedade

Tipo

Valor padrão

Descrição

singleTapEnabled

BOOL

YES

Ativa ou desativa o gesto de clique

doubleTapEnabled

BOOL

YES

Ativa ou desativa o gesto de clique duplo

longPressEnabled

BOOL

YES

Ativa ou desativa o gesto de pressionar e segurar

horizontalDragEnabled

BOOL

YES

Ativa ou desativa o gesto de arrastar horizontalmente

leftVerticalDragEnabled

BOOL

YES

Ativa ou desativa o gesto de arrastar verticalmente à esquerda

rightVerticalDragEnabled

BOOL

YES

Ativa ou desativa o gesto de arrastar verticalmente à direita

+defaultConfig

Método de classe

—

Cria uma configuração padrão com todos os gestos ativados

APIs relacionadas a cenários do SlotManager

Método

Descrição

registerSlotConfig:

Registra uma configuração de visibilidade de cena para um tipo de slot (substitui a configuração padrão)

unregisterSlotConfigForType:

Remove a configuração de cena para um tipo de slot especificado (torna-se visível por padrão após a remoção)

slotConfigForType:

Obtém a configuração de visibilidade de cena para um tipo de slot especificado

hideSlot:

Oculta um slot especificado (nível de slot, independente da configuração de cena)

showSlot:

Mostra um slot previamente oculto

hideElements:forSlot:

Oculta elementos dentro de um slot ou desativa gestos usando uma máscara de bits

showElements:forSlot:

Mostra elementos dentro de um slot ou ativa gestos usando uma máscara de bits

slotViewForType:

Obtém a instância de visualização de um slot montado

rebuildSlots

Reconstrói todos os slots (deve ser chamado após uma alteração na configuração de cena)

Arquivos relacionados

Arquivo

Descrição

PlayerKit/Source/Data/SceneType.h

Definição da enumeração SceneType

PlayerKit/Source/AliPlayerModel.h

Ponto de entrada para definir o tipo de cena (propriedade sceneType)

PlayerKit/Source/Slot/SlotConfig.h

Configuração de visibilidade de slots

PlayerKit/Source/Slot/DefaultSlotFactory.h

Provedor padrão de slots e regras de visibilidade de cena

PlayerKit/Source/Slot/SlotManager.h

Ponto de entrada unificado para gerenciamento do sistema de slots

PlayerKit/Source/Slot/SlotElements.h

Definições de máscara de bits de elementos de gestos

PlayerKit/Source/UI/Slots/GestureControlSlot.h

Slot de controle de gestos e definição de GestureControlSlotConfig

PlayerKit/Source/Slot/BaseSlot.h

Classe base de slots (método currentSceneType)

Para mais informações, consulte API Reference.

Melhores práticas

Observações

Item

Descrição

Definir na criação

Especifique o SceneType ao criar o AliPlayerModel. Não o alterne dinamicamente durante a reprodução.

Priorizar o cenário de lista

Sempre use SceneTypeVideoList ao incorporar o player em uma UIScrollView ou UICollectionView.

Minimal exige controle manual

Após selecionar Minimal, o desenvolvedor deve implementar todos os controles de reprodução usando a API do AliPlayerController.

Ajuste fino combinável

Caso o comportamento predefinido não atenda totalmente às suas necessidades, faça ajustes adicionais usando SlotConfig e SlotManager.

Live e Restricted têm comportamento semelhante

Suas regras de filtragem de gestos são idênticas (desativam busca na barra de progresso e ajuste de velocidade de reprodução). As diferenças residem apenas na visibilidade da miniatura (oculta em ambos) e na semântica de negócio.

FAQ

Qual é a diferença entre VOD e VideoList?

A principal diferença reside nos gestos verticais. O SceneTypeVideoList desativa gestos verticais de volume e brilho para evitar conflitos com o gesto de rolagem do contêiner da lista. Os demais recursos são iguais aos do VOD.

Como implementar controles personalizados no cenário Minimal?

Controle o comportamento de reprodução diretamente pela API do AliPlayerController. Também é possível registrar slots personalizados para substituir a UI:

AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;
[controller configure:model];

// Control directly through the controller API
[controller play];
[controller pause];
[controller seekTo:30000]; // Seek to 30 seconds

Como restaurar a busca na barra de progresso em um cenário Live?

Se o seu cenário de transmissão ao vivo suportar timeshifting, restaure o gesto desativado usando a API de controle de elementos do SlotManager:

// Restore the horizontal drag gesture (progress seeking)
[playerView.slotManager showElements:GestureElementHorizontalDrag
                             forSlot:SlotTypeGestureControl];
Nota

Este método restaura apenas a visibilidade no nível do elemento. A lógica de filtragem de cena dentro do GestureControlSlot é codificada rigidamente e não pode ser ignorada usando showElements:. Para personalizar totalmente o comportamento dos gestos, use GestureControlSlotConfig ou substitua o GestureControlSlot.