Como funcionam o streaming de bits adaptativo HTTP no iPhone?
-
21-08-2019 - |
Pergunta
A Apple incluiu o fluxo de bits Adaptive Adaptive HTTP no iPhone OS 3.0, em particular o Safari lida com isso automaticamente.
Eu gostaria de jogar com isso de maneira de baixo custo, mas espero que exija um servidor HTTP personalizado na pior das hipóteses e scripts interessantes de PHP/etc no melhor caso.
Mas primeiro eu preciso saber quais são as diferenças ou o padrão do protocolo. O HTTP é razoavelmente simples como um protocolo, mas uma taxa de bits adaptável significa que o tamanho do arquivo é diferente, os locais de pedaços são diferentes em diferentes taxas de bits, etc. Por exemplo, o cliente informa ao servidor qualquer coisa especial sobre o fluxo à medida que está baixando, ou é tudo tratado no lado do servidor?
A eliminação de pausas de buffer para o usuário final é muito atraente para fluxos de vídeo ao vivo e pré-gravados, e fazer tanto o HTTP é ainda melhor, considerando que muitas redes e governos estão limitando o tráfego sem porta 80.
- Quais são os detalhes técnicos do streaming de taxa de bits adaptável HTTP, especialmente a implementação da Apple?
Onde isso é melhor implementado - parte do próprio servidor HTTP, parte de um mod, em um script ...?
Que mudanças são necessárias para o lado do cliente, se alguém implementar isso em um aplicativo?
Solução
Atualizar
Parece que a Apple fez uma proposta de rascunho da IETF, e algumas pessoas já estão trabalhando em segmentadores:
HTTP Live Streaming-Draft-pantos-http-live-streaming-01
http://tools.ietf.org/id/draft-pantos-http-live- streaming-01.txt
iPhone HTTP Streaming com FFMPEG e um segmento de código aberto
http://www.ionscannon.net/programming/452/iphone-http-treaming-with-ffmpeg-and-an-open-source-seginteter/
Parece que o servidor HTTP atua simplesmente como um servidor HTTP idiota. Antigando o site de exemplo fornecido pela Akamai me fornece informações suficientes para começar com a transmissão de conteúdo estático.
O whitepaper ( http://www.akamai.com/dl/akamai/iphone_wp.pdf ) Fornece informações sobre a codificação do fluxo de transporte, para que os fluxos .TS sejam diretos.
O codificador (ou um processo de segmento separado) produzirá conteúdo H.264/AAC em uma sequência de pequenos segmentos de conteúdo, no formato MPEG-2 TS (.TS). Há também um arquivo de índice M3U8 que faz referência aos segmentos; No caso do conteúdo ao vivo, o M3U8 é atualizado continuamente para refletir o conteúdo mais recente.
A codificação H.264 deve ser um perfil de linha de base de passagem única, reordenar o quadro desativado. Os principais quadros são sugeridos a cada 5 segundos, idealmente um divisor uniforme do comprimento do segmento escolhido.
O site fornece um arquivo M3U8, que é simplesmente uma lista de reprodução M3U, mas no formato de codificação de caracteres UTF-8.
Esse arquivo vincula a um arquivo M3U8 para cada taxa de bits. Suponho que todos eles devem ter cortes nas mesmas posições (a cada 2 ou 10 segundos, por exemplo) para que a comutação possa ser perfeita. Parece ser completamente orientado ao cliente - o cliente decide como medir a largura de banda e qual versão vai obter.
O conteúdo do arquivo principal é:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=860000
hi/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000
med/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000
lo/prog_index.m3u8
Então cada um dos outros arquivos é:
Oi/prog_index.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
med/prog_index.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
lo/prog_index.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
Isso funciona com a tag de vídeo HTML 5:
<video width="640" height="480">
<source src="content1/content1.m3u8" />
</video>
Ainda existem muitas perguntas sem resposta, mas isso provavelmente é suficiente para começar.
Outras dicas
E um pequeno jogador em Python+Gstreamer http://code.google.com/p/hls-player/
Veja isso para um codificador e segmento de código aberto e algumas outras coisas legais :)