AVPlayer é um framework de player de mídia da Apple, parte do AVFoundation, que fornece reprodução de áudio e vídeo no iOS, macOS, tvOS e visionOS. O AVPlayer suporta uma ampla gama de formatos — desde arquivos MP4 locais até fluxos HLS adaptativos — através de uma API unificada com aceleração de decodificação por hardware em chips Apple Silicon. De acordo com a Apple WWDC (2024), o AVPlayer é usado em 90% dos aplicativos iOS que trabalham com mídia, incluindo Apple TV, Music e Photos.
Principais conclusões
AVPlayer é o componente central do framework AVFoundation, responsável pela reprodução multimídia em todas as plataformas Apple. Apresentado no iOS 4.0 (2010) como substituto do obsoleto MPMoviePlayerController, o AVPlayer fornece controle de baixo nível sobre a reprodução com ajuste fino de parâmetros de decodificação, sincronização de áudio e vídeo e integração com serviços do sistema como AirPlay e Picture in Picture.
Ao contrário de players de terceiros, o AVPlayer se beneficia da aceleração de hardware em chips Apple Silicon. A decodificação de vídeo é realizada através do VideoToolbox usando os mecanismos de mídia dedicados da série M (Media Engine), permitindo reprodução 8K HDR com consumo mínimo de energia. Para HEVC (H.265) e ProRes, a decodificação ocorre em blocos especializados do chip sem sobrecarregar a CPU.
O AVPlayer está intimamente integrado ao ecossistema Apple: suporte a Handoff para transferir reprodução entre dispositivos, AirPlay 2 para streaming para Apple TV, áudio espacial com rastreamento dinâmico de cabeça e sincronização com elementos de controle do sistema via MPNowPlayingInfoCenter. Essas integrações tornam o AVPlayer o padrão de facto para todos os aplicativos que trabalham com mídia em plataformas Apple.
O framework AVFoundation fornece uma hierarquia de três níveis para reprodução: AVAsset (metadados e informações de conteúdo), AVPlayerItem (estado e gerenciamento de uma instância específica de conteúdo) e AVPlayer (controle de reprodução). Esta arquitetura separa o carregamento de metadados, a preparação da reprodução e o próprio processo de reprodução — o que é especialmente importante para fluxos HLS com múltiplas alternativas de taxa de bits.
AVAsset representa um modelo de conteúdo de mídia — um arquivo ou fluxo. O AVAsset não é reproduzível por si só; ele contém faixas (AVAssetTrack), metadados (commonMetadata), informações de duração e outras características. Um AVPlayerItem é criado a partir do AVAsset, que pode então ser passado para o AVPlayer para reprodução.
AVPlayer fornece um conjunto de capacidades que cobrem a maioria dos cenários de reprodução — desde a reprodução simples de arquivos até transmissões ao vivo complexas com DRM. Vamos explorar os principais recursos com exemplos de uso.
| Recurso | Descrição | Plataformas |
|---|---|---|
| Arquivos locais | MP4, MOV, M4V, AVI, MKV (via extensões) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming com ABR adaptativo | Todas as plataformas Apple |
| FairPlay DRM | Conteúdo HLS protegido com licença de streaming | iOS, tvOS, macOS |
| Picture in Picture | Janela de vídeo flutuante sobre outros aplicativos | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Streaming sem fio para Apple TV e alto-falantes | Todas as plataformas |
| Áudio espacial | Dolby Atmos e rastreamento dinâmico de cabeça | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG com suporte a display | iOS 11+, macOS 10.13+ |
AVPlayer tem suporte nativo a HLS sem necessidade de bibliotecas adicionais. Ao reproduzir um fluxo HLS, o AVPlayer gerencia automaticamente a comutação adaptativa de taxa de bits usando um algoritmo ABR integrado otimizado para plataformas Apple. O algoritmo considera não apenas a largura de banda da rede, mas também o estado térmico do dispositivo — quando superaquecendo, o AVPlayer pode reduzir a taxa de bits para diminuir a carga da CPU.
Para fluxos HLS com FairPlay Streaming, o AVPlayer lida automaticamente com a obtenção e renovação de licenças através do delegado AVContentKeySession. O desenvolvedor precisa implementar o protocolo AVContentKeySessionDelegate, que é chamado pelo player quando uma chave de descriptografia precisa ser obtida ou renovada. Esta é a única maneira de proteger conteúdo HLS em plataformas Apple, já que o Widevine não é suportado no iOS.
PiP é um modo que permite aos usuários continuar assistindo vídeo em uma janela flutuante ao alternar entre aplicativos. No iPad e iPhone (iOS 14+), o AVPlayer se integra ao AVPictureInPictureController para ativar este modo. No macOS 15+, o PiP também está disponível, mas é ativado através do menu do sistema ou de um botão na janela do player.
A integração do AVPlayer em um aplicativo iOS pode ser feita de duas maneiras: através do AVPlayerViewController de alto nível (para cenários padrão) ou diretamente via AVPlayer + AVPlayerLayer (para personalização completa da interface). Vamos explorar ambas as abordagens em Swift.
AVPlayerViewController é um componente de interface pronto para uso que fornece controles integrados: play/pause, busca, volume, AirPlay, PiP e modo tela cheia. A integração mínima requer apenas algumas linhas de código: criar uma instância do AVPlayer, passá-la para o AVPlayerViewController e exibir o controlador na tela.
import AVKit
let url = URL(string: "https://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
let controller = AVPlayerViewController()
controller.player = player
controller.allowsPictureInPicturePlayback = true
present(controller, animated: true) {
player.play()
}
Para aplicativos com interface personalizada, use AVPlayerLayer — uma camada Core Animation que renderiza vídeo dentro de qualquer UIView. Esta abordagem oferece controle total sobre a interface: você pode adicionar controles personalizados, animações e sobrepor camadas adicionais sobre o vídeo.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Uso:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
O gerenciamento adequado do ciclo de vida do player é crítico para a estabilidade do aplicativo. O AVPlayer deve ser criado quando a tela aparecer e liberado quando for fechada. Quando o aplicativo entra em segundo plano, é recomendável pausar a reprodução para conservar recursos e evitar penalidades do App Review por reprodução em segundo plano desnecessária.
AVPlayerLayer é uma camada Core Animation que herda de CALayer e renderiza vídeo na tela. Ao contrário do UIView, o AVPlayerLayer trabalha diretamente com a GPU via Metal ou OpenGL, garantindo latência mínima de saída de quadros. Compreender o AVPlayerLayer é essencial para implementar interfaces de reprodução personalizadas.
A propriedade videoGravity determina como o vídeo se ajusta dentro dos limites da camada. AVLayerVideoGravity.resizeAspect (manter a proporção com barras pretas) é o padrão para AVPlayerViewController. resizeAspectFill (preencher toda a tela com corte) é usado para o modo tela cheia. resize (distorcer proporções para caber no tamanho da camada) raramente é usado, principalmente para aplicações analíticas.
AVPlayerLayer renderiza vídeo em tempo real, mas todas as operações do player (iniciar, pausar, buscar) devem ser executadas na thread principal. Os valores-chave para observação — timeControlStatus, rate, status e error — são rastreados via KVO (Key-Value Observing) ou pela moderna API async/await introduzida no iOS 16 através de métodos AVPlayer com suporte a Swift Concurrency.
let player = AVPlayer(url: url)
let statusObservation = player.observe(
\.status,
options: [.new, .initial]
) { player, _ in
switch player.status {
case .readyToPlay:
player.play()
case .failed:
handleError(player.error)
default:
break
}
}
AVPlayer suporta legendas incorporadas nos formatos VTT, CEA-608 e ITT (iTunes Timed Text). A seleção de faixa de áudio e legendas é feita através de AVMediaSelectionGroup e AVMediaSelectionOption. As configurações de legenda do usuário (fonte, tamanho, cor) são lidas das configurações de Acessibilidade do sistema e aplicadas automaticamente ao AVPlayerLayer, a menos que especificado explicitamente no código.
Para aplicações de produção, a integração básica do AVPlayer geralmente requer configuração adicional: cache de segmentos HLS, integração com FairPlay DRM, integração com o sistema Now Playing e algoritmos personalizados de seleção de taxa de bits.
AVAssetResourceLoader é a única maneira de interceptar o carregamento de segmentos HLS e implementar cache. O delegado AVAssetResourceLoaderDelegate recebe solicitações de carregamento de chaves e segmentos, permitindo armazená-los localmente e retorná-los do cache em solicitações subsequentes. Isso é especialmente útil para aplicações que operam em condições de rede instáveis.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) é o padrão da Apple para proteger conteúdo HLS. Para integrar o FPS, você precisa implementar o protocolo AVContentKeySessionDelegate, que lida com solicitações de chaves de descriptografia. O processo inclui: obter SPC (Server Playback Context) do player, enviá-lo a um servidor de licenças, receber CKC (Content Key Context) e passá-lo de volta ao AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. Obter SPC do keyRequest
// 2. Enviar SPC para o servidor de licenças
// 3. Obter CKC e passar para keyRequest.processContentKeyResponse
}
}
Para exibir informações de reprodução atuais na Tela de Bloqueio, Central de Controle e Apple Watch, use MPNowPlayingInfoCenter do MediaPlayer.framework. O AVPlayer não atualiza automaticamente o Now Playing — o desenvolvedor deve definir manualmente os metadados (título, artista, capa, progresso) quando o estado da reprodução muda. Um temporizador regular ou observe(\.timeControlStatus) é usado para atualizações de progresso.
Remote Command Center é outro serviço do sistema que permite controlar a reprodução a partir da tela bloqueada, AirPods e CarPlay. O MPRemoteCommandCenter registra manipuladores para os comandos play, pause, nextTrack, previousTrack, changePlaybackPosition e skipForward/skipBackward. O AVPlayer não lida com esses comandos automaticamente — o desenvolvedor deve conectá-los às chamadas player.play(), player.pause() e player.seek().
Perguntas frequentes
AVPlayer é um player universal de áudio e vídeo com suporte a streaming, HLS, DRM e sincronização com controles do sistema. O AVAudioPlayer é um player de áudio simplificado para reprodução de arquivos de áudio locais sem suporte a streaming ou aceleração de vídeo por hardware. Para vídeo e HLS, use AVPlayer; para áudio simples, use AVAudioPlayer.
Não, o AVPlayer não suporta carregamento direto de conteúdo do YouTube, pois o YouTube usa seu próprio player baseado em DASH e formatos proprietários. Para integrar o YouTube em um aplicativo iOS, use a API YouTube IFrame Player via WKWebView ou a biblioteca oficial youtube-ios-player-helper.
Para áudio em segundo plano, adicione Audio, AirPlay and Picture in Picture aos Modos de Fundo do seu projeto Xcode. Configure o AVAudioSession com a categoria .playback: try AVAudioSession.sharedInstance().setCategory(.playback). O AVPlayer continuará reproduzindo em segundo plano, e a Tela de Bloqueio e a Central de Controle exibirão controles através do MPNowPlayingInfoCenter.
Esses serviços usam proteção DRM e suas próprias soluções de player. O AVPlayer só pode reproduzir conteúdo através de uma URL direta de arquivo de mídia ou playlist HLS. Vídeos do YouTube e plataformas similares são encapsulados em players iframe ou JavaScript que são incompatíveis com o AVPlayer. Use seus SDKs oficiais ou WebView para exibição.
Para HLS de baixa latência, configure AVPlayerItem com preferredForwardBufferDuration = 2.0 (segundos) e gerencie automaticamente a pausa ao ficar atrás da borda ao vivo: use player.currentItem?.configuredTimeOffsetFromLive e player.currentItem?.canPlayReverse. A Apple recomenda LL-HLS com latência de 2 a 4 segundos quando configurado corretamente tanto no servidor quanto no cliente.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também