MP4#

O módulo fornece suporte de pseudo-streaming do lado do servidor para arquivos MP4. Tais arquivos tipicamente têm as extensões de nome de arquivo .mp4, .m4v, ou .m4a.

O pseudo-streaming funciona em aliança com um reprodutor de mídia compatível. O reprodutor envia uma requisição HTTP para o servidor com o tempo de início especificado no argumento da string de consulta (chamado simplesmente start e especificado em segundos), e o servidor responde com o stream de tal forma que sua posição inicial corresponde ao tempo solicitado, por exemplo:

http://example.com/elephants_dream.mp4?start=238.88

Isso permite realizar uma busca aleatória a qualquer momento, ou iniciar a reprodução no meio da linha do tempo.

Para suportar busca, formatos baseados em H.264 armazenam metadados em um chamado "átomo moov". É uma parte do arquivo que contém as informações de índice para todo o arquivo.

Para iniciar a reprodução, o reprodutor primeiro precisa ler os metadados. Isso é feito enviando uma requisição especial com o argumento start=0. Muitos softwares de codificação inserem os metadados no final do arquivo. Isso é subótimo para pseudo-streaming, porque o reprodutor tem que baixar o arquivo inteiro antes de iniciar a reprodução. Se os metadados estão localizados no início do arquivo, é suficiente para o Angie simplesmente começar a enviar de volta o conteúdo do arquivo. Se os metadados estão localizados no final do arquivo, o Angie deve ler o arquivo inteiro e preparar um novo stream para que os metadados venham antes dos dados de mídia. Isso envolve alguma sobrecarga de CPU, memória e E/S de disco, então é uma boa ideia preparar um arquivo original para pseudo-streaming com antecedência, ao invés de ter o Angie fazendo isso a cada requisição desse tipo.

O módulo também suporta o argumento end de uma requisição HTTP que define o ponto final da reprodução. O argumento end pode ser especificado com o argumento start ou separadamente:

http://example.com/elephants_dream.mp4?start=238.88&end=555.55

Para uma requisição correspondente com um argumento start ou end não-zero, o Angie lerá os metadados do arquivo, preparará o stream com o intervalo de tempo solicitado, e o enviará para o cliente. Isso tem a mesma sobrecarga descrita acima.

Se o argumento start aponta para um quadro de vídeo não-chave, o início de tal vídeo será quebrado. Para corrigir esse problema, o vídeo pode ser precedido com o quadro-chave antes do ponto start e com todos os quadros intermediários entre eles. Esses quadros serão ocultados da reprodução usando uma lista de edição.

Se uma requisição correspondente não incluir os argumentos start e end, não há sobrecarga, e o arquivo é enviado simplesmente como um recurso estático. Alguns reprodutores também suportam requisições de intervalo de bytes, e assim não requerem este módulo.

Quando compilando a partir do código fonte, este módulo não é compilado por padrão; ele deve ser habilitado com a ‑‑with‑http_mp4_module opção de compilação. Em pacotes e imagens dos nossos repositórios, o módulo está incluído na compilação.

Aviso

Se um módulo mp4 de terceiros foi usado anteriormente, ele deve ser desabilitado.

Um suporte de pseudo-streaming similar para arquivos FLV é fornecido pelo módulo FLV.

Exemplo de Configuração#

location /video/ {
    mp4;
    mp4_buffer_size     1m;
    mp4_max_buffer_size 5m;
}

Diretivas#

mp4#

Sintaxe

mp4;

Padrão

Contexto

location

Ativa o processamento do módulo em uma localização circundante.

mp4_buffer_size#

Sintaxe

mp4_buffer_size size;

Padrão

mp4_buffer_size 512K;

Contexto

http, server, location

Define o tamanho inicial do buffer usado para processar arquivos MP4.

mp4_max_buffer_size#

Sintaxe

mp4_max_buffer_size size;

Padrão

mp4_max_buffer_size 10M;

Contexto

http, server, location

Durante o processamento de metadados, um buffer maior pode se tornar necessário. Seu tamanho não pode exceder o tamanho especificado, ou então o Angie retornará o erro de servidor 500 (Internal Server Error), e registrará a seguinte mensagem:

"/some/movie/file.mp4" mp4 moov atom is too large: 12583268, you may want to increase mp4_max_buffer_size

mp4_limit_rate#

Sintaxe

mp4_limit_rate on | off | factor;

Padrão

mp4_limit_rate off;

Contexto

http, server, location

Limita a taxa de transferência do arquivo MP4 solicitado para o cliente. Para calcular o limite, o factor é multiplicado pela taxa de bits média do arquivo.

  • O valor off desabilita a limitação de taxa.

  • O valor on define um factor de 1.1.

  • O limite é aplicado após atingir o valor definido por mp4_limit_rate_after.

As requisições são limitadas individualmente: se o cliente abrir duas conexões, a taxa resultante dobra. Neste aspecto, considere usar limit_conn e diretivas acompanhantes.

mp4_limit_rate_after#

Sintaxe

mp4_limit_rate_after time;

Padrão

mp4_limit_rate_after 60s;

Contexto

http, server, location

Define (em termos de tempo de reprodução) a quantidade de dados de mídia transferidos que aciona o limite de taxa definido por mp4_limit_rate.

mp4_start_key_frame#

Sintaxe

mp4_start_key_frame on | off;

Padrão

mp4_start_key_frame off;

Contexto

http, server, location

Força o vídeo de saída a sempre começar com um quadro-chave de vídeo. Se o argumento start não aponta para um quadro-chave, os quadros iniciais são ocultados usando uma lista de edição mp4. Listas de edição são suportadas por reprodutores e navegadores principais como Chrome, Safari, QuickTime e ffmpeg, parcialmente suportadas pelo Firefox.