<!-- review: finished -->

<a id="http-mp4"></a>

# 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:

```none
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](https://github.com/flowplayer/flowplayer/wiki/7.1.1-video-file-correction) 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:

```none
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](#mp4-start-key-frame) 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](https://pt.angie.software//angie/docs/installation/sourcebuild.md#sourcebuild),
este módulo não é compilado por padrão;
ele deve ser habilitado com a
`‑‑with‑http_mp4_module`
[opção de compilação](https://pt.angie.software//angie/docs/installation/sourcebuild.md#configure).
Em pacotes e imagens dos [nossos repositórios](https://pt.angie.software//angie/docs/installation/index.md#install-packages), o módulo está
incluído na compilação.

#### WARNING
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](https://pt.angie.software//angie/docs/configuration/modules/http/http_flv.md#http-flv).

<a id="configuration-example-31"></a>

## Exemplo de Configuração

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

<a id="directives-32"></a>

## Diretivas

<a id="index-0"></a>

<a id="id1"></a>

### mp4

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4`;   |
|-------------------------------------------------------------------------------------------|----------|
| Padrão                                                                                    | —        |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | location |

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

<a id="index-1"></a>

<a id="mp4-buffer-size"></a>

### mp4_buffer_size

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_buffer_size` size;   |
|-------------------------------------------------------------------------------------------|---------------------------|
| Padrão                                                                                    | `mp4_buffer_size 512K;`   |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location    |

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

<a id="index-2"></a>

<a id="mp4-max-buffer-size"></a>

### mp4_max_buffer_size

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_max_buffer_size` size;   |
|-------------------------------------------------------------------------------------------|-------------------------------|
| Padrão                                                                                    | `mp4_max_buffer_size 10M;`    |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | 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

<a id="index-3"></a>

<a id="mp4-limit-rate"></a>

### mp4_limit_rate

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_limit_rate` `on` | `off` | factor;   |
|-------------------------------------------------------------------------------------------|-------------------------------------------|
| Padrão                                                                                    | `mp4_limit_rate off;`                     |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | 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](#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](https://pt.angie.software//angie/docs/configuration/modules/http/http_api.md#limit-conn) e diretivas acompanhantes.

<a id="index-4"></a>

<a id="mp4-limit-rate-after"></a>

### mp4_limit_rate_after

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_limit_rate_after` time;   |
|-------------------------------------------------------------------------------------------|--------------------------------|
| Padrão                                                                                    | `mp4_limit_rate_after 60s;`    |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location         |

Define
(em termos de
[tempo de reprodução](https://pt.angie.software//angie/docs/configuration/configfile.md#syntax))
a quantidade de dados de mídia transferidos
que aciona
o limite de taxa definido por
[mp4_limit_rate](#mp4-limit-rate).

<a id="index-5"></a>

<a id="mp4-start-key-frame"></a>

### mp4_start_key_frame

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `mp4_start_key_frame` `on` | `off`;   |
|-------------------------------------------------------------------------------------------|---------------------------------------|
| Padrão                                                                                    | `mp4_start_key_frame off;`            |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | 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.
