⚠️ Este é um site de tradução não oficial, sem relação com o projeto FFmpeg. Para informações oficiais, consulte a página original (https://ffmpeg.org/ffmpeg.html).

Documentação do ffmpeg

1 Sinopse

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

2 Descrição

ffmpeg é um conversor de mídia universal. Ele consegue ler uma ampla variedade de entradas (incluindo dispositivos de captura/gravação ao vivo), filtrá-las e transcodificá-las para uma infinidade de formatos de saída.

ffmpeg lê a partir de um número arbitrário de entradas (que podem ser arquivos comuns, pipes, fluxos de rede, dispositivos de captura etc.), especificadas pela opção -i, e grava em um número arbitrário de saídas, especificadas por uma simples url de saída. Qualquer elemento encontrado na linha de comando que não possa ser interpretado como opção é considerado uma url de saída.

Cada entrada ou saída pode, em princípio, conter qualquer número de fluxos elementares de tipos diferentes (vídeo/áudio/legenda/anexo/dados), embora a quantidade e/ou os tipos de fluxos permitidos possam ser limitados pelo formato do container. Quais fluxos de quais entradas irão para qual saída é decidido automaticamente ou por meio da opção -map (veja o capítulo Seleção de fluxos).

Para se referir a entradas/saídas nas opções, é preciso usar seus índices (a partir de 0). Por exemplo, a primeira entrada é 0, a segunda é 1 e assim por diante. Da mesma forma, os fluxos dentro de uma entrada/saída são referenciados pelo índice. Por exemplo, 2:3 se refere ao quarto fluxo da terceira entrada ou saída. Veja também o capítulo Especificadores de fluxo.

Como regra geral, as opções se aplicam ao próximo arquivo especificado. Por isso a ordem importa, e a mesma opção pode aparecer várias vezes na linha de comando: cada ocorrência se aplica ao próximo arquivo de entrada ou de saída. A exceção são as opções globais (por exemplo, o nível de verbosidade), que devem ser especificadas primeiro.

Não misture arquivos de entrada e de saída: especifique primeiro todos os arquivos de entrada e depois todos os de saída. Também não misture opções pertencentes a arquivos diferentes. Todas as opções se aplicam APENAS ao próximo arquivo de entrada ou saída e são reiniciadas entre arquivos.

A seguir, alguns exemplos simples.

  • Converter um arquivo de mídia de entrada para um formato diferente, recodificando os fluxos de mídia:

    ffmpeg -i input.avi output.mp4
    
  • Definir a taxa de bits de vídeo do arquivo de saída em 64 kbit/s:

    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4
    
  • Forçar a taxa de quadros do arquivo de saída para 24 fps:

    ffmpeg -i input.avi -r 24 output.mp4
    
  • Forçar a taxa de quadros do arquivo de entrada (válido somente para formatos brutos (raw)) para 1 fps e a taxa de quadros do arquivo de saída para 24 fps:

    ffmpeg -r 1 -i input.m2v -r 24 output.mp4
    

A opção de formato pode ser necessária para arquivos de entrada brutos (raw).

3 Descrição detalhada

ffmpeg monta um pipeline de transcodificação a partir dos componentes listados a seguir. O funcionamento do programa consiste, então, em blocos de dados de entrada fluindo das fontes através dos pipes em direção aos sinks, sendo transformados pelos componentes que encontram pelo caminho.

Os seguintes tipos de componentes estão disponíveis:

  • Os demuxers (abreviação de "desmultiplexadores") leem uma fonte de entrada para extrair
    • propriedades globais, como metadados ou capítulos;
    • a lista de fluxos elementares de entrada e suas propriedades

Uma instância de demuxer é criada para cada opção -i, e ela envia pacotes codificados para decoders ou muxers.

Em outras referências, os demuxers às vezes são chamados de splitters (divisores), porque sua função principal é dividir um arquivo em fluxos elementares (embora alguns arquivos contenham apenas um fluxo elementar).

Uma representação esquemática de um demuxer tem esta aparência:

┌──────────┬───────────────────────┐
│ demuxer  │                       │ packets for stream 0
╞══════════╡ elementary stream 0   ├──────────────────────►
│          │                       │
│  global  ├───────────────────────┤
│properties│                       │ packets for stream 1
│   and    │ elementary stream 1   ├──────────────────────►
│ metadata │                       │
│          ├───────────────────────┤
│          │                       │
│          │     ...........       │
│          │                       │
│          ├───────────────────────┤
│          │                       │ packets for stream N
│          │ elementary stream N   ├──────────────────────►
│          │                       │
└──────────┴───────────────────────┘
     ▲
     │
     │ read from file, network stream,
     │     grabbing device, etc.
     │
  • Os decoders recebem pacotes codificados (comprimidos) de um fluxo elementar de áudio, vídeo ou legenda, e os decodificam em quadros brutos (matrizes de pixels para vídeo, PCM para áudio). Um decoder normalmente está associado a um fluxo elementar de um demuxer (e recebe dele sua entrada), mas às vezes também pode existir de forma independente (veja Decoders de loopback).

Uma representação esquemática de um decoder tem esta aparência:

    ┌─────────┐
     packets  │         │ raw frames
    ─────────►│ decoder ├────────────►
              │         │
              └─────────┘
  • Os filtergraphs processam e transformam quadros brutos de áudio ou vídeo. Um filtergraph consiste em um ou mais filtros individuais interligados formando um grafo. Os filtergraphs existem em duas variantes — simples e complexa —, configuradas respectivamente com as opções -filter e -filter_complex.

Um filtergraph simples está associado a um fluxo elementar de saída; ele recebe de um decoder a entrada a ser filtrada e envia a saída filtrada ao encoder desse fluxo de saída.

Um filtergraph de vídeo simples que realiza desentrelaçamento (usando o desentrelaçador yadif) seguido de redimensionamento (usando o filtro scale) pode ter esta aparência:

    ┌────────────────────────┐
                 │  simple filtergraph    │
     frames from ╞════════════════════════╡ frames for
     a decoder   │  ┌───────┐  ┌───────┐  │ an encoder
    ────────────►├─►│ yadif ├─►│ scale ├─►│────────────►
                 │  └───────┘  └───────┘  │
                 └────────────────────────┘

Um filtergraph complexo é independente e não está associado a nenhum fluxo específico. Ele pode ter várias entradas (ou nenhuma), potencialmente de tipos diferentes (áudio ou vídeo), cada uma recebendo dados de um decoder ou da saída de outro filtergraph complexo. Também tem uma ou mais saídas que alimentam um encoder ou a entrada de outro filtergraph complexo.

O diagrama de exemplo a seguir representa um filtergraph complexo com 3 entradas e 2 saídas (todas de vídeo):

    ┌─────────────────────────────────────────────────┐
              │               complex filtergraph               │
              ╞═════════════════════════════════════════════════╡
     frames   ├───────┐  ┌─────────┐      ┌─────────┐  ┌────────┤ frames
    ─────────►│input 0├─►│ overlay ├─────►│ overlay ├─►│output 0├────────►
              ├───────┘  │         │      │         │  └────────┤
     frames   ├───────┐╭►│         │    ╭►│         │           │
    ─────────►│input 1├╯ └─────────┘    │ └─────────┘           │
              ├───────┘                 │                       │
     frames   ├───────┐ ┌─────┐ ┌─────┬─╯              ┌────────┤ frames
    ─────────►│input 2├►│scale├►│split├───────────────►│output 1├────────►
              ├───────┘ └─────┘ └─────┘                └────────┤
              └─────────────────────────────────────────────────┘

Os quadros da segunda entrada são sobrepostos aos da primeira. Os quadros da terceira entrada são redimensionados e depois duplicados em dois fluxos idênticos. Um deles é sobreposto à combinação das duas primeiras entradas, e o resultado é exposto como a primeira saída do filtergraph. A outra cópia acaba sendo a segunda saída do filtergraph.

  • Os encoders recebem quadros brutos de áudio, vídeo ou legenda e os codificam em pacotes codificados. O processo de codificação (compressão) costuma ser com perdas — degrada a qualidade do fluxo para reduzir o tamanho da saída; alguns encoders são sem perdas, mas ao custo de um tamanho de saída bem maior. Um encoder de vídeo ou áudio recebe sua entrada da saída de algum filtergraph; os encoders de legenda recebem entrada de um decoder (já que a filtragem de legendas ainda não é compatível). Todo encoder está associado ao fluxo elementar de saída de algum muxer e envia sua saída a ele.

Uma representação esquemática de um encoder tem esta aparência:

    ┌─────────┐
     raw frames  │         │ packets
    ────────────►│ encoder ├─────────►
                 │         │
                 └─────────┘
  • Os muxers (abreviação de "multiplexadores") recebem, para seus fluxos elementares, pacotes codificados vindos de encoders (o caminho de transcodificação) ou diretamente de demuxers (o caminho de cópia de fluxo), os intercalam (quando há mais de um fluxo elementar) e gravam os bytes resultantes no arquivo de saída (ou pipe, fluxo de rede etc.).

Uma representação esquemática de um muxer tem esta aparência:

    ┌──────────────────────┬───────────┐
     packets for stream 0  │                      │   muxer   │
    ──────────────────────►│  elementary stream 0 ╞═══════════╡
                           │                      │           │
                           ├──────────────────────┤  global   │
     packets for stream 1  │                      │properties │
    ──────────────────────►│  elementary stream 1 │   and     │
                           │                      │ metadata  │
                           ├──────────────────────┤           │
                           │                      │           │
                           │     ...........      │           │
                           │                      │           │
                           ├──────────────────────┤           │
     packets for stream N  │                      │           │
    ──────────────────────►│  elementary stream N │           │
                           │                      │           │
                           └──────────────────────┴─────┬─────┘
                                                        │
                         write to file, network stream, │
                             grabbing device, etc.      │
                                                        │
                                                        ▼

3.1 Cópia de fluxo

O pipeline mais simples em ffmpeg é a cópia de fluxo de um único fluxo, isto é, copiar os pacotes de um fluxo elementar de entrada sem decodificá-los, filtrá-los ou codificá-los. Como exemplo, considere um arquivo de entrada chamado INPUT.mkv com 3 fluxos elementares, do qual pegamos o segundo e o gravamos no arquivo OUTPUT.mp4. Uma representação esquemática desse pipeline tem esta aparência:

┌──────────┬─────────────────────┐
│ demuxer  │                     │ unused
╞══════════╡ elementary stream 0 ├────────╳
│          │                     │
│INPUT.mkv ├─────────────────────┤          ┌──────────────────────┬───────────┐
│          │                     │ packets  │                      │   muxer   │
│          │ elementary stream 1 ├─────────►│  elementary stream 0 ╞═══════════╡
│          │                     │          │                      │OUTPUT.mp4 │
│          ├─────────────────────┤          └──────────────────────┴───────────┘
│          │                     │ unused
│          │ elementary stream 2 ├────────╳
│          │                     │
└──────────┴─────────────────────┘

O pipeline acima pode ser construído com a seguinte linha de comando:

ffmpeg -i INPUT.mkv -map 0:1 -c copy OUTPUT.mp4

Nessa linha de comando

  • há uma única entrada, INPUT.mkv;
  • não há opções de entrada para essa entrada;
  • há uma única saída, OUTPUT.mp4;
  • há duas opções de saída para essa saída:
    • -map 0:1 seleciona o fluxo de entrada a ser usado: da entrada com índice 0 (ou seja, a primeira) pega-se o fluxo com índice 1 (ou seja, o segundo);
    • -c copy seleciona o encoder copy, ou seja, cópia de fluxo sem decodificação nem codificação.

A cópia de fluxo é útil para alterar a quantidade de fluxos elementares, o formato do container ou modificar metadados em nível de container. Como não há decodificação nem codificação, ela é muito rápida e não há perda de qualidade. No entanto, pode não funcionar em alguns casos devido a diversos fatores (por exemplo, o container de destino precisar de alguma informação que não esteja disponível na origem). Aplicar filtros obviamente também é impossível, já que os filtros atuam sobre quadros decodificados.

Podem-se construir cenários de cópia de fluxo mais complexos — por exemplo, combinar fluxos de dois arquivos de entrada em uma única saída:

┌──────────┬────────────────────┐         ┌────────────────────┬───────────┐
│ demuxer 0│                    │ packets │                    │   muxer   │
╞══════════╡elementary stream 0 ├────────►│elementary stream 0 ╞═══════════╡
│INPUT0.mkv│                    │         │                    │OUTPUT.mp4 │
└──────────┴────────────────────┘         ├────────────────────┤           │
┌──────────┬────────────────────┐         │                    │           │
│ demuxer 1│                    │ packets │elementary stream 1 │           │
╞══════════╡elementary stream 0 ├────────►│                    │           │
│INPUT1.aac│                    │         └────────────────────┴───────────┘
└──────────┴────────────────────┘

que pode ser construído com a linha de comando

ffmpeg -i INPUT0.mkv -i INPUT1.aac -map 0:0 -map 1:0 -c copy OUTPUT.mp4

A opção de saída -map é usada duas vezes aqui, criando dois fluxos no arquivo de saída: um alimentado pela primeira entrada e outro pela segunda. A única instância da opção -c seleciona cópia de fluxo para ambos os fluxos. Também seria possível usar várias instâncias dessa opção junto com especificadores de fluxo para aplicar valores diferentes a cada fluxo, como será demonstrado nas seções seguintes.

Um cenário inverso é dividir vários fluxos de uma única entrada em várias saídas:

┌──────────┬─────────────────────┐          ┌───────────────────┬───────────┐
│ demuxer  │                     │ packets  │                   │ muxer 0   │
╞══════════╡ elementary stream 0 ├─────────►│elementary stream 0╞═══════════╡
│          │                     │          │                   │OUTPUT0.mp4│
│INPUT.mkv ├─────────────────────┤          └───────────────────┴───────────┘
│          │                     │ packets  ┌───────────────────┬───────────┐
│          │ elementary stream 1 ├─────────►│                   │ muxer 1   │
│          │                     │          │elementary stream 0╞═══════════╡
└──────────┴─────────────────────┘          │                   │OUTPUT1.mp4│
                                            └───────────────────┴───────────┘

construído com

ffmpeg -i INPUT.mkv -map 0:0 -c copy OUTPUT0.mp4 -map 0:1 -c copy OUTPUT1.mp4

Observe que é necessária uma instância separada da opção -c para cada arquivo de saída, mesmo que os valores sejam os mesmos. Isso ocorre porque as opções não globais (que são a maioria) só se aplicam no contexto do arquivo diante do qual são colocadas.

Esses exemplos podem, é claro, ser generalizados ainda mais para remapeamentos arbitrários de qualquer número de entradas para qualquer número de saídas.

3.2 Transcodificação

A transcodificação é o processo de decodificar um fluxo e depois codificá-lo novamente. Como a codificação costuma ser computacionalmente cara e, na maioria dos casos, degrada a qualidade do fluxo (ou seja, é com perdas), você só deve transcodificar quando necessário e, nos demais casos, fazer cópia de fluxo. Os motivos típicos para transcodificar são:

  • aplicar filtros — por exemplo, redimensionar, desentrelaçar ou sobrepor vídeo; reamostrar ou mixar áudio;
  • você quer entregar o fluxo a algo que não consegue decodificar o codec original.

Observe que ffmpeg transcodificará todos os fluxos de áudio, vídeo e legenda, a menos que você especifique -c copy para eles.

Considere um pipeline de exemplo que lê um arquivo de entrada com um fluxo de áudio e um de vídeo, transcodifica o vídeo e copia o áudio em um único arquivo de saída. Isso pode ser representado esquematicamente da seguinte forma

┌──────────┬─────────────────────┐
│ demuxer  │                     │       audio packets
╞══════════╡ stream 0 (audio)    ├─────────────────────────────────────╮
│          │                     │                                     │
│INPUT.mkv ├─────────────────────┤ video    ┌─────────┐     raw        │
│          │                     │ packets  │  video  │ video frames   │
│          │ stream 1 (video)    ├─────────►│ decoder ├──────────────╮ │
│          │                     │          │         │              │ │
└──────────┴─────────────────────┘          └─────────┘              │ │
                                                                     ▼ ▼
                                                                     │ │
┌──────────┬─────────────────────┐ video    ┌─────────┐              │ │
│ muxer    │                     │ packets  │  video  │              │ │
╞══════════╡ stream 0 (video)    │◄─────────┤ encoder ├──────────────╯ │
│          │                     │          │(libx264)│                │
│OUTPUT.mp4├─────────────────────┤          └─────────┘                │
│          │                     │                                     │
│          │ stream 1 (audio)    │◄────────────────────────────────────╯
│          │                     │
└──────────┴─────────────────────┘

e implementado com a seguinte linha de comando:

ffmpeg -i INPUT.mkv -map 0:v -map 0:a -c:v libx264 -c:a copy OUTPUT.mp4

Observe como são usados os especificadores de fluxo :v e :a para selecionar fluxos de entrada e aplicar a eles valores diferentes da opção -c; veja a seção Especificadores de fluxo para mais detalhes.

3.3 Filtragem

Ao transcodificar, os fluxos de áudio e vídeo podem ser filtrados antes da codificação, com um filtergraph simples ou complexo.

3.3.1 Filtergraphs simples

Filtergraphs simples são aqueles que têm exatamente uma entrada e uma saída, ambas do mesmo tipo (áudio ou vídeo). São configurados com a opção -filter por fluxo (com os apelidos -vf e -af para -filter:v (vídeo) e -filter:a (áudio), respectivamente). Observe que os filtergraphs simples estão vinculados ao seu fluxo de saída, de modo que, por exemplo, se você tiver vários fluxos de áudio, -af criará um filtergraph separado para cada um.

Retomando o exemplo de transcodificação anterior, ao acrescentar filtragem (e omitir o áudio, para maior clareza), fica assim:

┌──────────┬───────────────┐
│ demuxer  │               │          ┌─────────┐
╞══════════╡ video stream  │ packets  │  video  │ frames
│INPUT.mkv │               ├─────────►│ decoder ├─────►───╮
│          │               │          └─────────┘         │
└──────────┴───────────────┘                              │
                                  ╭───────────◄───────────╯
                                  │   ┌────────────────────────┐
                                  │   │  simple filtergraph    │
                                  │   ╞════════════════════════╡
                                  │   │  ┌───────┐  ┌───────┐  │
                                  ╰──►├─►│ yadif ├─►│ scale ├─►├╮
                                      │  └───────┘  └───────┘  ││
                                      └────────────────────────┘│
                                                                │
                                                                │
┌──────────┬───────────────┐ video    ┌─────────┐               │
│ muxer    │               │ packets  │  video  │               │
╞══════════╡ video stream  │◄─────────┤ encoder ├───────◄───────╯
│OUTPUT.mp4│               │          │         │
│          │               │          └─────────┘
└──────────┴───────────────┘

3.3.2 Filtergraphs complexos

Filtergraphs complexos são aqueles que não podem ser descritos simplesmente como uma cadeia de processamento linear aplicada a um único fluxo. É o caso, por exemplo, quando o grafo tem mais de uma entrada e/ou saída, ou quando o tipo do fluxo de saída é diferente do de entrada. Os filtergraphs complexos são configurados com a opção -filter_complex. Observe que essa opção é global, já que um filtergraph complexo, por sua natureza, não pode ser associado de forma inequívoca a um único fluxo ou arquivo. Cada instância de -filter_complex cria um novo filtergraph complexo, e pode haver qualquer número deles.

Um exemplo trivial de filtergraph complexo é o filtro overlay, que tem duas entradas de vídeo e uma saída de vídeo, consistindo em sobrepor um vídeo ao outro. Seu equivalente em áudio é o filtro amix.

3.4 Decoders de loopback

Embora os decoders normalmente estejam associados a fluxos de um demuxer, também é possível criar decoders "de loopback" que decodificam a saída de algum encoder e permitem realimentá-la em filtergraphs complexos. Isso é feito com a diretiva -dec, que recebe como parâmetro o índice do fluxo de saída que deve ser decodificado. Cada diretiva dessas cria um novo decoder de loopback, indexado com inteiros sucessivos a partir de zero. Esses índices devem então ser usados para referenciar os decoders de loopback nos rótulos de link do filtergraph complexo, conforme descrito na documentação de -filter_complex.

As AVOptions de decodificação podem ser passadas aos decoders de loopback colocando-as antes de -dec, de forma análoga às opções de entrada/saída.

Por exemplo, o exemplo a seguir:

ffmpeg -i INPUT                                        \
  -map 0:v:0 -c:v libx264 -crf 45 -f null -            \
  -threads 3 -dec 0:0                                  \
  -filter_complex '[0:v][dec:0]hstack[stack]'          \
  -map '[stack]' -c:v ffv1 OUTPUT

lê um vídeo de entrada e

  • (linha 2) o codifica com libx264 em baixa qualidade;
  • (linha 3) decodifica esse fluxo codificado usando 3 threads;
  • (linha 4) coloca o vídeo decodificado lado a lado com o vídeo de entrada original;
  • (linha 5) o vídeo combinado é então codificado sem perdas e gravado em OUTPUT.

Esse pipeline de transcodificação pode ser representado com o diagrama a seguir:

┌──────────┬───────────────┐
│ demuxer  │               │   ┌─────────┐            ┌─────────┐    ┌────────────────────┐
╞══════════╡ video stream  │   │  video  │            │  video  │    │ null muxer         │
│   INPUT  │               ├──►│ decoder ├──┬────────►│ encoder ├─┬─►│(discards its input)│
│          │               │   └─────────┘  │         │(libx264)│ │  └────────────────────┘
└──────────┴───────────────┘                │         └─────────┘ │
                                 ╭───────◄──╯   ┌─────────┐       │
                                 │              │loopback │       │
                                 │ ╭─────◄──────┤ decoder ├────◄──╯
                                 │ │            └─────────┘
                                 │ │
                                 │ │
                                 │ │  ┌───────────────────┐
                                 │ │  │complex filtergraph│
                                 │ │  ╞═══════════════════╡
                                 │ │  │  ┌─────────────┐  │
                                 ╰─╫─►├─►│   hstack    ├─►├╮
                                   ╰─►├─►│             │  ││
                                      │  └─────────────┘  ││
                                      └───────────────────┘│
                                                           │
┌──────────┬───────────────┐  ┌─────────┐                  │
│ muxer    │               │  │  video  │                  │
╞══════════╡ video stream  │◄─┤ encoder ├───────◄──────────╯
│  OUTPUT  │               │  │ (ffv1)  │
│          │               │  └─────────┘
└──────────┴───────────────┘

4 Seleção de fluxos

ffmpeg oferece a opção -map para o controle manual da seleção de fluxos em cada arquivo de saída. É possível dispensar -map e deixar que o ffmpeg realize a seleção automática de fluxos, como descrito a seguir. As opções -vn / -an / -sn / -dn podem ser usadas para excluir, respectivamente, fluxos de vídeo, áudio, legenda e dados, sejam mapeados manualmente ou selecionados automaticamente, exceto os fluxos que são saídas de filtergraphs complexos.

4.1 Descrição

As subseções a seguir descrevem as diversas regras envolvidas na seleção de fluxos. Os exemplos apresentados na sequência mostram como essas regras são aplicadas na prática.

Embora todo esforço seja feito para refletir com precisão o comportamento do programa, o FFmpeg está em desenvolvimento contínuo e o código pode ter mudado desde a redação deste texto.

4.1.1 Seleção automática de fluxos

Na ausência de opções -map para um determinado arquivo de saída, o ffmpeg examina o formato de saída para verificar que tipo de fluxos pode incluir nele, a saber: vídeo, áudio e/ou legendas. Para cada tipo de fluxo aceitável, o ffmpeg escolherá um fluxo, quando disponível, dentre todas as entradas.

Ele selecionará esse fluxo com base nos seguintes critérios:

  • para vídeo, o fluxo com a maior resolução,
  • para áudio, o fluxo com mais canais,
  • para legendas, o primeiro fluxo de legenda encontrado, mas há uma ressalva: o encoder de legenda padrão do formato de saída pode ser baseado em texto ou em imagem, e só será escolhido um fluxo de legenda do mesmo tipo.

Caso vários fluxos do mesmo tipo obtenham a mesma pontuação, é escolhido o fluxo com o menor índice.

Os fluxos de dados ou de anexo não são selecionados automaticamente e só podem ser incluídos usando -map.

4.1.2 Seleção manual de fluxos

Quando -map é usado, apenas os fluxos mapeados pelo usuário são incluídos nesse arquivo de saída, com uma possível exceção para saídas de filtergraph descrita a seguir.

4.1.3 Filtergraphs complexos

Se houver fluxos de saída de filtergraph complexo com pads sem rótulo, eles serão adicionados ao primeiro arquivo de saída. Isso causará um erro fatal se o tipo de fluxo não for compatível com o formato de saída. Na ausência da opção -map, a inclusão desses fluxos faz com que a seleção automática de fluxos desse tipo seja ignorada. Se houver opções -map presentes, esses fluxos de filtergraph são incluídos além dos fluxos mapeados.

Os fluxos de saída de filtergraph complexo com pads rotulados devem ser mapeados uma única vez.

4.1.4 Tratamento de fluxos

O tratamento de fluxos é independente da seleção de fluxos, com uma exceção para legendas descrita a seguir. O tratamento de fluxos é definido pela opção -codec direcionada a fluxos dentro de um arquivo de saída específico. Em particular, as opções de codec são aplicadas pelo ffmpeg depois do processo de seleção de fluxos e, portanto, não influenciam esse processo. Se nenhuma opção -codec for especificada para um tipo de fluxo, o ffmpeg selecionará o encoder padrão registrado pelo muxer do arquivo de saída.

Existe uma exceção para legendas. Se um encoder de legenda for especificado para um arquivo de saída, será incluído o primeiro fluxo de legenda encontrado, de qualquer tipo, texto ou imagem. O ffmpeg não valida se o encoder especificado consegue converter o fluxo selecionado nem se o fluxo convertido é aceitável dentro do formato de saída. Isso também se aplica de modo geral: quando o usuário define um encoder manualmente, o processo de seleção de fluxos não consegue verificar se o fluxo codificado poderá ser incluído (mux) no arquivo de saída. Se não puder, o ffmpeg abortará e todos os arquivos de saída deixarão de ser processados.

4.2 Exemplos

Os exemplos a seguir ilustram o comportamento, as peculiaridades e as limitações dos métodos de seleção de fluxos do ffmpeg.

Eles pressupõem os três arquivos de entrada a seguir.

input file 'A.avi'
      stream 0: video 640x360
      stream 1: audio 2 channels

input file 'B.mp4'
      stream 0: video 1920x1080
      stream 1: audio 2 channels
      stream 2: subtitles (text)
      stream 3: audio 5.1 channels
      stream 4: subtitles (text)

input file 'C.mkv'
      stream 0: video 1280x720
      stream 1: audio 2 channels
      stream 2: subtitles (image)

Exemplo: seleção automática de fluxos

ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

Há três arquivos de saída especificados e, para os dois primeiros, nenhuma opção -map é definida, então o ffmpeg selecionará os fluxos desses dois arquivos automaticamente.

out1.mkv é um arquivo container Matroska e aceita fluxos de vídeo, áudio e legenda, então o ffmpeg tentará selecionar um de cada tipo.
Para vídeo, selecionará o stream 0 de B.mp4, que tem a maior resolução entre todos os fluxos de vídeo de entrada.
Para áudio, selecionará o stream 3 de B.mp4, já que tem o maior número de canais.
Para legendas, selecionará o stream 2 de B.mp4, que é o primeiro fluxo de legenda entre A.avi e B.mp4.

out2.wav aceita somente fluxos de áudio, então apenas o stream 3 de B.mp4 é selecionado.

Para out3.mov, como uma opção -map é definida, não ocorrerá seleção automática de fluxos. A opção -map 1:a selecionará todos os fluxos de áudio da segunda entrada, B.mp4. Nenhum outro fluxo será incluído nesse arquivo de saída.

Para as duas primeiras saídas, todos os fluxos incluídos serão transcodificados. Os encoders escolhidos serão os padrão registrados por cada formato de saída, que podem não coincidir com o codec dos fluxos de entrada selecionados.

Para a terceira saída, a opção de codec para os fluxos de áudio foi definida como copy, então nenhuma operação de decodificação, filtragem ou codificação ocorrerá, nem pode ocorrer. Os pacotes dos fluxos selecionados serão transportados do arquivo de entrada e incluídos (mux) no arquivo de saída.

Exemplo: seleção automática de legendas

ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv

Embora out1.mkv seja um arquivo container Matroska que aceita fluxos de legenda, somente um fluxo de vídeo e um de áudio serão selecionados. O fluxo de legenda de C.mkv é baseado em imagem, e o encoder de legenda padrão do muxer Matroska é baseado em texto, então espera-se que a operação de transcodificação das legendas falhe e, por isso, o fluxo não é selecionado. Já em out2.mkv, um encoder de legenda é especificado no comando e, assim, o fluxo de legenda é selecionado, além do fluxo de vídeo. A presença de -an desativa a seleção de fluxo de áudio para out2.mkv.

Exemplo: saídas de filtergraph sem rótulo

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

Um filtergraph é configurado aqui usando a opção -filter_complex e consiste em um único filtro de vídeo. O filtro overlay requer exatamente duas entradas de vídeo, mas nenhuma é especificada, então são usados os dois primeiros fluxos de vídeo disponíveis, os de A.avi e C.mkv. O pad de saída do filtro não tem rótulo e, por isso, é enviado ao primeiro arquivo de saída, out1.mp4. Por causa disso, a seleção automática do fluxo de vídeo é ignorada, o que teria selecionado o fluxo de B.mp4. O fluxo de áudio com mais canais, ou seja, o stream 3 de B.mp4, é escolhido automaticamente. Nenhum fluxo de legenda é escolhido, no entanto, já que o formato MP4 não tem encoder de legenda padrão registrado, e o usuário não especificou um encoder de legenda.

O segundo arquivo de saída, out2.srt, aceita apenas fluxos de legenda baseados em texto. Assim, embora o primeiro fluxo de legenda disponível pertença a C.mkv, ele é baseado em imagem e, portanto, é ignorado. O fluxo selecionado, o stream 2 de B.mp4, é o primeiro fluxo de legenda baseado em texto.

Exemplo: saídas de filtergraph com rótulo

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
       -map '[outv]' -an        out1.mp4 \
                                out2.mkv \
       -map '[outv]' -map 1:a:0 out3.mkv

O comando acima falhará, pois o pad de saída rotulado [outv] foi mapeado duas vezes. Nenhum dos arquivos de saída será processado.

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
       -an        out1.mp4 \
                  out2.mkv \
       -map 1:a:0 out3.mkv

Esse comando acima também falhará, pois a saída do filtro hue tem um rótulo, [outv], que não foi mapeado em lugar nenhum.

O comando deve ser modificado da seguinte forma,

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
        -map '[outv1]' -an        out1.mp4 \
                                  out2.mkv \
        -map '[outv2]' -map 1:a:0 out3.mkv

O fluxo de vídeo de B.mp4 é enviado ao filtro hue, cuja saída é clonada uma vez usando o filtro split, e ambas as saídas são rotuladas. Depois, uma cópia de cada uma é mapeada para o primeiro e o terceiro arquivos de saída.

O filtro overlay, que requer duas entradas de vídeo, usa os dois primeiros fluxos de vídeo ainda não usados. São os fluxos de A.avi e C.mkv. A saída de overlay não é rotulada, então é enviada ao primeiro arquivo de saída, out1.mp4, independentemente da presença da opção -map.

Ao filtro aresample é enviado o primeiro fluxo de áudio ainda não usado, o de A.avi. Como a saída desse filtro também não é rotulada, ela também é mapeada para o primeiro arquivo de saída. A presença de -an só suprime a seleção automática ou manual de fluxos de áudio, não as saídas enviadas por filtergraphs. Esses dois fluxos mapeados serão ordenados antes do fluxo mapeado em out1.mp4.

Os fluxos de vídeo, áudio e legenda mapeados para out2.mkv são determinados inteiramente pela seleção automática de fluxos.

out3.mkv consiste na saída de vídeo clonada do filtro hue e no primeiro fluxo de áudio de B.mp4.

5 Opções

Todas as opções numéricas, salvo indicação contrária, aceitam como entrada uma string que representa um número, que pode ser seguida por um dos prefixos de unidade do SI, por exemplo: ’K’, ’M’ ou ’G’.

Se ’i’ for acrescentado ao prefixo de unidade do SI, o prefixo completo será interpretado como um prefixo de unidade para múltiplos binários, baseados em potências de 1024 em vez de potências de 1000. Acrescentar ’B’ ao prefixo de unidade do SI multiplica o valor por 8. Isso permite usar, por exemplo, ’KB’, ’MiB’, ’G’ e ’B’ como sufixos numéricos.

Opções que não recebem argumentos são opções booleanas e definem o valor correspondente como true. Podem ser definidas como false ao prefixar o nome da opção com "no". Por exemplo, usar "-nofoo" definirá como false a opção booleana de nome "foo".

Opções que recebem argumentos aceitam uma sintaxe especial em que o argumento informado na linha de comando é interpretado como o caminho para o arquivo do qual o valor real do argumento é carregado. Para usar esse recurso, acrescente uma barra ’/’ imediatamente antes do nome da opção (depois do hífen inicial). Por exemplo:

ffmpeg -i INPUT -/filter:v filter.script OUTPUT

isso carregará uma descrição de filtergraph a partir do arquivo chamado filter.script.

5.1 Especificadores de fluxo

Algumas opções são aplicadas por fluxo, por exemplo, a taxa de bits ou o codec. Os especificadores de fluxo são usados para indicar com precisão a qual fluxo (ou fluxos) uma determinada opção pertence.

Um especificador de fluxo é geralmente uma string acrescentada ao nome da opção e separada dele por dois-pontos. Por exemplo, -codec:a:1 ac3 contém o especificador de fluxo a:1, que corresponde ao segundo fluxo de áudio. Portanto, isso selecionaria o codec ac3 para o segundo fluxo de áudio.

Um especificador de fluxo pode corresponder a vários fluxos, de modo que a opção é aplicada a todos eles. Por exemplo, o especificador de fluxo em -b:a 128k corresponde a todos os fluxos de áudio.

Um especificador de fluxo vazio corresponde a todos os fluxos. Por exemplo, -codec copy ou -codec: copy copiariam todos os fluxos sem recodificar.

As formas possíveis de especificadores de fluxo são:

stream_index

Corresponde ao fluxo com esse índice. Por exemplo, -threads:1 4 definiria como 4 a quantidade de threads do segundo fluxo. Se stream_index for usado como especificador de fluxo adicional (veja abaixo), ele seleciona o fluxo de número stream_index entre os fluxos correspondentes. A numeração dos fluxos se baseia na ordem em que são detectados pela libavformat, exceto quando um especificador de grupo de fluxos ou um ID de programa também é especificado. Nesse caso, baseia-se na ordem dos fluxos dentro do grupo ou programa.

stream_type[:additional_stream_specifier]

stream_type é um dos seguintes: ’v’ ou ’V’ para vídeo, ’a’ para áudio, ’s’ para legenda, ’d’ para dados e ’t’ para anexos. ’v’ corresponde a todos os fluxos de vídeo; ’V’ corresponde apenas a fluxos de vídeo que não sejam imagens anexadas, miniaturas de vídeo ou artes de capa. Se additional_stream_specifier for usado, ele corresponde a fluxos que têm esse tipo e também correspondem a additional_stream_specifier. Caso contrário, corresponde a todos os fluxos do tipo especificado.

g:group_specifier[:additional_stream_specifier]

Corresponde a fluxos que estão no grupo com o especificador group_specifier. Se additional_stream_specifier for usado, corresponde a fluxos que fazem parte do grupo e também correspondem a additional_stream_specifier. group_specifier pode ser um dos seguintes:

group_index

Corresponde ao fluxo com esse índice de grupo.

#group_id ou i:group_id

Corresponde ao fluxo com esse ID de grupo.

p:program_id[:additional_stream_specifier]

Corresponde a fluxos que estão no programa com o id program_id. Se additional_stream_specifier for usado, corresponde a fluxos que fazem parte do programa e também correspondem a additional_stream_specifier.

#stream_id ou i:stream_id

Corresponde ao fluxo pelo ID de fluxo (por exemplo, o PID em um container MPEG-TS).

m:key[:value]

Corresponde a fluxos cuja tag de metadados key tem o valor especificado. Se value não for informado, corresponde a fluxos que contenham a tag indicada com qualquer valor. O caractere de dois-pontos ’:’ em key ou value precisa ter escape com barra invertida.

disp:dispositions[:additional_stream_specifier]

Corresponde a fluxos com a(s) disposition(s) indicada(s). dispositions é uma lista de uma ou mais dispositions (como exibidas pela opção -dispositions) unidas com ’+’.

u

Corresponde a fluxos com configuração utilizável: o codec deve estar definido, e as informações essenciais, como a dimensão do vídeo ou a taxa de amostragem do áudio, devem estar presentes.

Observe que, em ffmpeg, a correspondência por metadados só funciona corretamente para arquivos de entrada.

5.2 Opções genéricas

Essas opções são comuns às ferramentas ff*.

-L, -license

Mostra a licença.

-h, -?, -help, --help [arg]

Mostra a ajuda. Um parâmetro opcional pode ser especificado para exibir ajuda sobre um item específico. Se nenhum argumento for especificado, somente as opções básicas (não avançadas) da ferramenta são mostradas.

Os valores possíveis de arg são:

long

Exibe as opções avançadas da ferramenta, além das opções básicas.

full

Exibe a lista completa de opções, incluindo as opções compartilhadas e privadas de encoders, decoders, demuxers, muxers, filtros etc.

decoder=decoder_name

Exibe informações detalhadas sobre o decoder chamado decoder_name. Use a opção -decoders para obter uma lista de todos os decoders.

encoder=encoder_name

Exibe informações detalhadas sobre o encoder chamado encoder_name. Use a opção -encoders para obter uma lista de todos os encoders.

demuxer=demuxer_name

Exibe informações detalhadas sobre o demuxer chamado demuxer_name. Use a opção -formats para obter uma lista de todos os demuxers e muxers.

muxer=muxer_name

Exibe informações detalhadas sobre o muxer chamado muxer_name. Use a opção -formats para obter uma lista de todos os muxers e demuxers.

filter=filter_name

Exibe informações detalhadas sobre o filtro chamado filter_name. Use a opção -filters para obter uma lista de todos os filtros.

bsf=bitstream_filter_name

Exibe informações detalhadas sobre o filtro de bitstream chamado bitstream_filter_name. Use a opção -bsfs para obter uma lista de todos os filtros de bitstream.

protocol=protocol_name

Exibe informações detalhadas sobre o protocolo chamado protocol_name. Use a opção -protocols para obter uma lista de todos os protocolos.

-version

Mostra a versão.

-buildconf

Mostra a configuração de compilação, uma opção por linha.

-formats

Mostra os formatos disponíveis (incluindo dispositivos).

-demuxers

Mostra os demuxers disponíveis.

-muxers

Mostra os muxers disponíveis.

-devices

Mostra os dispositivos disponíveis.

-codecs

Mostra todos os codecs conhecidos pela libavcodec.

Observe que o termo ’codec’ é usado ao longo desta documentação como forma abreviada do que, com mais precisão, é chamado de formato de bitstream de mídia.

-decoders

Mostra os decoders disponíveis.

-encoders

Mostra todos os encoders disponíveis.

-bsfs

Mostra os filtros de bitstream disponíveis.

-protocols

Mostra os protocolos disponíveis.

-filters

Mostra os filtros do libavfilter disponíveis.

-pix_fmts

Mostra os pixel formats disponíveis.

-sample_fmts

Mostra os sample formats disponíveis.

-layouts

Mostra os nomes de canal e os layouts de canais padrão.

-dispositions

Mostra as dispositions de fluxo.

-colors

Mostra os nomes de cor reconhecidos.

-sources device[,opt1=val1[,opt2=val2]...]

Mostra as fontes detectadas automaticamente do dispositivo de entrada. Alguns dispositivos podem fornecer nomes de fonte dependentes do sistema que não podem ser detectados automaticamente. Não se deve presumir que a lista retornada esteja sempre completa.

ffmpeg -sources pulse,server=192.168.0.4

-sinks device[,opt1=val1[,opt2=val2]...]

Mostra os sinks detectados automaticamente do dispositivo de saída. Alguns dispositivos podem fornecer nomes de sink dependentes do sistema que não podem ser detectados automaticamente. Não se deve presumir que a lista retornada esteja sempre completa.

ffmpeg -sinks pulse,server=192.168.0.4

-loglevel [flags+]loglevel | -v [flags+]loglevel

Define o nível de log e as flags usadas pela biblioteca.

O prefixo opcional de flags pode ser composto pelos seguintes valores:

‘repeat’

Indica que a saída de log repetida não deve ser condensada na primeira linha e que a linha "Last message repeated n times" será omitida.

‘level’

Indica que a saída de log deve acrescentar um prefixo [level] a cada linha de mensagem. Isso pode ser usado como alternativa à coloração do log, por exemplo, ao despejar o log em um arquivo.

‘time’

Indica que as linhas de log devem ser prefixadas com informação de hora.

‘datetime’

Indica que as linhas de log devem ser prefixadas com informação de data e hora.

As flags também podem ser usadas isoladamente, acrescentando um prefixo ’+’/’-’ para ativar/desativar uma única flag sem afetar as demais nem alterar o loglevel. Ao definir flags e loglevel juntos, espera-se um separador ’+’ entre o último valor de flags e o loglevel.

loglevel é uma string ou um número contendo um dos seguintes valores:

‘quiet, -8’

Não mostra absolutamente nada; modo silencioso.

‘panic, 0’

Mostra somente erros fatais que poderiam levar o processo a travar, como uma falha de asserção. Atualmente isso não é usado para nada.

‘fatal, 8’

Mostra somente erros fatais. São erros após os quais o processo definitivamente não pode continuar.

‘error, 16’

Mostra todos os erros, incluindo os recuperáveis.

‘warning, 24’

Mostra todos os avisos e erros. Qualquer mensagem relacionada a eventos possivelmente incorretos ou inesperados será exibida.

‘info, 32’

Mostra mensagens informativas durante o processamento. Isso se soma aos avisos e erros. Este é o valor padrão.

‘verbose, 40’

O mesmo que info, porém mais detalhado.

‘debug, 48’

Mostra tudo, incluindo informações de depuração.

‘trace, 56’

Por exemplo, para habilitar a saída de log repetida, acrescentar o prefixo level e definir loglevel como verbose:

ffmpeg -loglevel repeat+level+verbose -i input output

Outro exemplo que habilita a saída de log repetida sem afetar o estado atual da flag de prefixo level nem o loglevel:

ffmpeg [...] -loglevel +repeat

Por padrão, o programa registra o log em stderr. Se o terminal for compatível com cores, elas são usadas para marcar erros e avisos. A coloração do log pode ser desativada definindo a variável de ambiente AV_LOG_FORCE_NOCOLOR, ou forçada definindo a variável de ambiente AV_LOG_FORCE_COLOR.

-report

Despeja a linha de comando completa e a saída de log em um arquivo chamado program-YYYYMMDD-HHMMSS.log no diretório atual. Esse arquivo pode ser útil para relatos de bug. Também implica -loglevel debug.

Definir a variável de ambiente FFREPORT com qualquer valor tem o mesmo efeito. Se o valor for uma sequência key=value separada por ’:’, essas opções afetarão o relatório; os valores das opções devem ter escape se contiverem caracteres especiais ou o delimitador de opções ’:’ (veja a seção “Quoting and escaping” no manual ffmpeg-utils).

As opções a seguir são reconhecidas:

file

define o nome de arquivo a ser usado no relatório; %p é expandido para o nome do programa, %t é expandido para uma marca de tempo, %% é expandido para um % literal

level

define o nível de verbosidade do log usando um valor numérico (veja -loglevel).

Por exemplo, para gerar um relatório em um arquivo chamado ffreport.log usando um nível de log 32 (apelido do nível de log info):

FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

Erros na análise da variável de ambiente não são fatais e não aparecerão no relatório.

-hide_banner

Suprime a exibição do banner.

Todas as ferramentas do FFmpeg normalmente mostram um aviso de copyright, as opções de compilação e as versões das bibliotecas. Esta opção pode ser usada para suprimir a exibição dessas informações.

-cpuflags flags (global)

Permite definir e limpar flags de CPU. Esta opção é destinada a testes. Não a use a menos que saiba o que está fazendo.

ffmpeg -cpuflags -sse+mmx ...
ffmpeg -cpuflags mmx ...
ffmpeg -cpuflags 0 ...

As flags possíveis para esta opção são:

‘x86’

‘mmx’ ‘mmxext’ ‘sse’ ‘sse2’ ‘sse2slow’ ‘sse3’ ‘sse3slow’ ‘ssse3’ ‘atom’ ‘sse4.1’ ‘sse4.2’ ‘avx’ ‘avx2’ ‘xop’ ‘fma3’ ‘fma4’ ‘3dnow’ ‘3dnowext’ ‘bmi1’ ‘bmi2’ ‘cmov’ ‘ARM’

‘armv5te’ ‘armv6’ ‘armv6t2’ ‘vfp’ ‘vfpv3’ ‘neon’ ‘setend’ ‘AArch64’

‘armv8’ ‘vfp’ ‘neon’ ‘PowerPC’

‘altivec’ ‘Specific Processors’

‘pentium2’ ‘pentium3’ ‘pentium4’ ‘k6’ ‘k62’ ‘athlon’ ‘athlonxp’ ‘k8’ -cpucount count (global)

Substitui a detecção da quantidade de CPUs. Esta opção é destinada a testes. Não a use a menos que saiba o que está fazendo.

ffmpeg -cpucount 2

-max_alloc bytes

Define o limite máximo de tamanho para alocar um bloco no heap pela família de funções malloc do ffmpeg. Tenha extremo cuidado ao usar esta opção. Não a use se não entender todas as consequências disso. O padrão é INT_MAX.

5.3 AVOptions

Essas opções são fornecidas diretamente pelas bibliotecas libavformat, libavdevice e libavcodec. Para ver a lista de AVOptions disponíveis, use a opção -help. Elas são divididas em duas categorias:

generic

Essas opções podem ser definidas para qualquer container, codec ou dispositivo. As opções generic são listadas nas opções de AVFormatContext para containers/dispositivos e nas opções de AVCodecContext para codecs.

private

Essas opções são específicas do container, dispositivo ou codec em questão. As opções private são listadas sob os respectivos containers/dispositivos/codecs.

Por exemplo, para gravar um cabeçalho ID3v2.3 em vez do ID3v2.4 padrão em um arquivo MP3, use a opção private id3v2_version do muxer de MP3:

ffmpeg -i input.flac -id3v2_version 3 out.mp3

Todas as AVOptions de codec são por fluxo, portanto um especificador de fluxo deve ser anexado a elas:

ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4

No exemplo acima, um fluxo de áudio multicanal é mapeado duas vezes para a saída. A primeira instância é codificada com o codec ac3 e taxa de bits 640k. A segunda instância é reduzida (downmix) para 2 canais e codificada com o codec aac. Para ela é especificada uma taxa de bits de 128k usando o índice absoluto do fluxo de saída.

Observação: a sintaxe -nooption não pode ser usada para AVOptions booleanas; use -option 0/-option 1.

Observação: a antiga forma não documentada de especificar AVOptions por fluxo, colocando v/a/s antes do nome da opção, está agora obsoleta e será removida em breve.

5.4 Opções principais

-f fmt (input/output)

Força o formato do arquivo de entrada ou saída. O formato normalmente é detectado automaticamente nos arquivos de entrada e deduzido pela extensão do arquivo nos arquivos de saída, portanto essa opção não é necessária na maioria dos casos.

-i url (input)

url do arquivo de entrada

-y (global)

Sobrescreve os arquivos de saída sem perguntar.

-n (global)

Não sobrescreve os arquivos de saída e encerra imediatamente se um arquivo de saída especificado já existir.

-stream_loop number (input)

Define o número de vezes que o fluxo de entrada deve ser repetido em loop. Loop 0 significa sem loop; loop -1 significa loop infinito.

-recast_media (global)

Permite forçar um decoder de um tipo de mídia diferente do detectado ou designado pelo demuxer. Útil para decodificar dados de mídia multiplexados como fluxos de dados.

-c[:stream_specifier] codec (input/output,per-stream) -codec[:stream_specifier] codec (input/output,per-stream)

Seleciona um encoder (quando usado antes de um arquivo de saída) ou um decoder (quando usado antes de um arquivo de entrada) para um ou mais fluxos. codec é o nome de um decoder/encoder ou o valor especial copy (somente saída), que indica que o fluxo não deve ser recodificado.

Por exemplo

ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

codifica todos os fluxos de vídeo com libx264 e copia todos os fluxos de áudio.

Para cada fluxo é aplicada a última opção c correspondente; assim,

ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

todos os fluxos serão copiados, exceto o segundo de vídeo, que será codificado com libx264, e o de áudio número 138, que será codificado com libvorbis.

-t duration (input/output)

Quando usada como opção de entrada (antes de -i), limita a duração dos dados lidos do arquivo de entrada.

Quando usada como opção de saída (antes de uma url de saída), interrompe a escrita da saída quando sua duração atinge duration.

duration deve ser uma especificação de duração de tempo; veja (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

-to e -t são mutuamente exclusivas, e -t tem prioridade.

-to position (input/output)

Interrompe a escrita da saída ou a leitura da entrada em position. position deve ser uma especificação de duração de tempo; veja (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

-to e -t são mutuamente exclusivas, e -t tem prioridade.

-fs limit_size (output)

Define o limite de tamanho do arquivo, expresso em bytes. Nenhum bloco adicional de bytes é gravado depois que o limite é ultrapassado. O tamanho do arquivo de saída é ligeiramente maior que o tamanho solicitado.

-ss position (input/output)

Quando usada como opção de entrada (antes de -i), busca até position neste arquivo de entrada. Observe que na maioria dos formatos não é possível buscar com exatidão, portanto o ffmpeg buscará o ponto de busca mais próximo antes de position. Ao transcodificar com -accurate_seek habilitado (o padrão), esse trecho extra entre o ponto de busca e position é decodificado e descartado. Ao fazer cópia de fluxo, ou quando -noaccurate_seek é usado, esse trecho é preservado.

Quando usada como opção de saída (antes de uma url de saída), decodifica mas descarta a entrada até que as marcas de tempo alcancem position.

position deve ser uma especificação de duração de tempo; veja (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

-sseof position (input)

Semelhante à opção -ss, mas relativa ao "fim do arquivo". Ou seja, valores negativos ficam mais cedo no arquivo, e 0 é o EOF.

-isync input_index (input)

Atribui uma entrada como fonte de sincronização.

Isso obtém a diferença entre os tempos de início da entrada de destino e da entrada de referência, e desloca as marcas de tempo do arquivo de destino por essa diferença. As marcas de tempo de origem das duas entradas devem derivar da mesma fonte de clock para obter os resultados esperados. Se copyts estiver definido, start_at_zero também deve estar definido. Se qualquer uma das entradas não tiver marca de tempo inicial, nenhum ajuste de sincronização é feito.

Os valores aceitáveis são os que se referem a um índice de entrada válido do ffmpeg. Se a referência de sincronização for o próprio índice de destino ou -1, nenhum ajuste é feito nas marcas de tempo de destino. Uma referência de sincronização não pode, por sua vez, estar sincronizada com nenhuma outra entrada.

O valor padrão é -1.

-itsoffset offset (input)

Define o deslocamento de tempo da entrada.

offset deve ser uma especificação de duração de tempo; veja (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

O offset é somado às marcas de tempo dos arquivos de entrada. Especificar um offset positivo significa que os fluxos correspondentes são atrasados pela duração de tempo especificada em offset.

-itsscale scale (input,per-stream)

Reescala as marcas de tempo de entrada. scale deve ser um número de ponto flutuante.

-timestamp date (output)

Define a marca de tempo de gravação no container.

date deve ser uma especificação de data; veja (ffmpeg-utils)the Date section in the ffmpeg-utils(1) manual.

-metadata[:metadata_specifier] key=value (output,per-metadata)

Define um par chave/valor de metadados.

Um metadata_specifier opcional pode ser informado para definir metadados em fluxos, capítulos ou programas. Veja a documentação de -map_metadata para mais detalhes.

Essa opção substitui os metadados definidos com -map_metadata. Também é possível excluir metadados usando um valor vazio.

Por exemplo, para definir o título no arquivo de saída:

ffmpeg -i in.avi -metadata title="my title" out.flv

Para definir o idioma do primeiro fluxo de áudio:

ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT

-disposition[:stream_specifier] value (output,per-stream)

Define as flags de disposition de um fluxo.

Valor padrão: por padrão, todas as flags de disposition são copiadas do fluxo de entrada, a menos que o fluxo de saída ao qual essa opção se aplica seja alimentado por um filtergraph complexo - nesse caso, nenhuma flag de disposition é definida por padrão.

value é uma sequência de flags de disposition separadas por ’+’ ou ’-’. Um prefixo ’+’ adiciona a disposition indicada, e ’-’ a remove. Se a primeira flag também tiver o prefixo ’+’ ou ’-’, a disposition resultante é o valor padrão atualizado por value. Se a primeira flag não tiver prefixo, a disposition resultante é value. Também é possível limpar a disposition definindo-a como 0.

Se nenhuma opção -disposition for especificada para um arquivo de saída, o ffmpeg definirá automaticamente a flag de disposition ’default’ no primeiro fluxo de cada tipo, quando houver vários fluxos desse tipo no arquivo de saída e nenhum deles já estiver marcado como default.

A opção -dispositions lista as flags de disposition conhecidas.

Por exemplo, para tornar o segundo fluxo de áudio o fluxo padrão:

ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv

Para tornar o segundo fluxo de legenda o fluxo padrão e remover a disposition default do primeiro fluxo de legenda:

ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv

Para adicionar uma capa/miniatura incorporada:

ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4

Para adicionar a flag ’original’ e remover a flag de disposition ’comment’ do primeiro fluxo de áudio, sem remover suas demais flags de disposition:

ffmpeg -i in.mkv -c copy -disposition:a:0 +original-comment out.mkv

Para remover a flag ’original’ e adicionar a flag de disposition ’comment’ ao primeiro fluxo de áudio, sem remover suas demais flags de disposition:

ffmpeg -i in.mkv -c copy -disposition:a:0 -original+comment out.mkv

Para definir apenas as flags de disposition ’original’ e ’comment’ no primeiro fluxo de áudio (e remover suas demais flags de disposition):

ffmpeg -i in.mkv -c copy -disposition:a:0 original+comment out.mkv

Para remover todas as flags de disposition do primeiro fluxo de áudio:

ffmpeg -i in.mkv -c copy -disposition:a:0 0 out.mkv

Nem todos os muxers oferecem suporte a miniaturas incorporadas, e os que oferecem só são compatíveis com alguns formatos, como JPEG ou PNG.

-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output)

Cria um programa com o title e program_num especificados, e adiciona a ele o(s) stream(s) indicado(s).

-stream_group [map=input_file_id=stream_group][type=type:]st=stream[:st=stream][:stg=stream_group][:id=stream_group_id...] (output)

Cria um grupo de fluxos do type e stream_group_id especificados, ou mapeando um grupo de entrada, adicionando a ele o(s) stream(s) indicado(s) e/ou o(s) stream_group(s) previamente definido(s).

type pode ser um dos seguintes:

iamf_audio_element

Agrupa fluxos que pertencem ao mesmo Audio Element do IAMF

Para esse tipo de grupo, estão disponíveis as seguintes opções

audio_element_type

O tipo do Audio Element. São aceitos os seguintes valores:

channel

Representação de áudio por canais escalável

scene

Representação ambissônica

demixing

Informações de demixing usadas para reconstruir uma representação de áudio por canais escalável. Essa opção deve ser separada do restante por uma ’,’, e aceita as seguintes opções key=value

parameter_id

Um identificador ao qual blocos de parâmetros em quadros podem se referir

dmixp_mode

Uma combinação predefinida de parâmetros de demixing

recon_gain

Informações de recon gain usadas para reconstruir uma representação de áudio por canais escalável. Essa opção deve ser separada do restante por uma ’,’, e aceita as seguintes opções key=value

parameter_id

Um identificador ao qual blocos de parâmetros em quadros podem se referir

layer

Uma camada que define um Channel Layout no Audio Element. Essa opção deve ser separada do restante por uma ’,’. Várias entradas separadas por ’,’ podem ser definidas, e ao menos uma deve ser configurada.

Aceita as seguintes opções key=value separadas por ":"

ch_layout

O layout de canais dessa camada

flags

Estão disponíveis as seguintes flags:

recon_gain

Se deve sinalizar se recon_gain está presente como metadado em blocos de parâmetros dentro dos quadros

output_gain output_gain_flags

A quais canais output_gain se aplica. Estão disponíveis as seguintes flags:

FL FR BL BR TFL TFR ambisonics_mode

O modo ambissônico. Não tem efeito se audio_element_type estiver definido como channel.

São aceitos os seguintes valores:

mono

Cada canal ambissônico é codificado como um fluxo mono individual dentro do grupo

default_w

Valor de peso padrão

iamf_mix_presentation

Agrupa fluxos que pertencem a todos os Audio Element do IAMF referenciados pelo mesmo Mix Presentation do IAMF

Para esse tipo de grupo, estão disponíveis as seguintes opções

submix

Um sub-mix dentro do Mix Presentation. Essa opção deve ser separada do restante por uma ’,’. Várias entradas separadas por ’,’ podem ser definidas, e ao menos uma deve ser configurada.

Aceita as seguintes opções key=value separadas por ":"

parameter_id

Um identificador ao qual blocos de parâmetros em quadros podem se referir, para pós-processar o sinal de áudio mixado e gerar o sinal de áudio de reprodução

parameter_rate

A taxa de amostragem na qual são expressos os campos de duração dos blocos de parâmetros em quadros que se referem a esse parameter_id

default_mix_gain

Valor de ganho de mixagem padrão a aplicar quando não há blocos de parâmetros compartilhando o mesmo parameter_id para um determinado quadro

element

Referencia um Audio Element usado nesse Mix Presentation para gerar o sinal de áudio de saída final de reprodução. Essa opção deve ser separada do restante por uma ’|’. Várias entradas separadas por ’|’ podem ser definidas, e ao menos uma deve ser configurada.

Aceita as seguintes opções key=value separadas por ":":

stg

O stream_group_id do Audio Element ao qual esse sub-mix se refere

parameter_id

Um identificador ao qual blocos de parâmetros em quadros podem se referir, para aplicar qualquer processamento ao Audio Element referenciado e renderizado antes de ele ser somado a outros Audio Elements processados

parameter_rate

A taxa de amostragem na qual são expressos os campos de duração dos blocos de parâmetros em quadros que se referem a esse parameter_id

default_mix_gain

Valor de ganho de mixagem padrão a aplicar quando não há blocos de parâmetros compartilhando o mesmo parameter_id para um determinado quadro

annotations

Uma string key=value que descreve o elemento sub-mix, em que "key" é uma string em conformidade com BCP-47 que especifica o idioma da string "value". "key" deve ser a mesma que consta no annotations do mix

headphones_rendering_mode

Indica se o Audio Element de entrada baseado em canais é renderizado para alto-falantes estéreo ou espacializado com um renderizador binaural ao ser reproduzido em fones de ouvido. Não tem efeito se o audio_element_type do Audio Element referenciado estiver definido como channel.

São aceitos os seguintes valores:

stereo binaural layout

Especifica os layouts desse sub-mix sobre os quais a informação de loudness foi medida. Essa opção deve ser separada do restante por uma ’|’. Várias entradas separadas por ’|’ podem ser definidas, e ao menos uma deve ser configurada.

Aceita as seguintes opções key=value separadas por ":":

layout_type

loudspeakers

O layout segue a convenção de sistemas de alto-falantes (sound system) da ITU-2051-3.

binaural

O layout é binaural.

sound_system

Layout de canais correspondente a um dos Sound Systems A a J da ITU-2051-3, além de 7.1.2 e 3.1.2. Não tem efeito se layout_type estiver definido como binaural.

integrated_loudness

A informação de integrated loudness do programa, conforme definido na ITU-1770-4.

digital_peak

O valor de pico digital (amostrado) do sinal de áudio, conforme definido na ITU-1770-4.

true_peak

O true peak do sinal de áudio, conforme definido na ITU-1770-4.

dialog_anchored_loudness

A informação de Dialogue loudness, conforme definido na ITU-1770-4.

album_anchored_loudness

A informação de Album loudness, conforme definido na ITU-1770-4.

annotations

Uma string key=value que descreve o mix, em que "key" é uma string em conformidade com BCP-47 que especifica o idioma da string "value". "key" deve ser a mesma que consta no annotations de todos os elementos sub-mix

Por exemplo, para criar um arquivo IAMF 5.1 escalável a partir de vários arquivos WAV de entrada

ffmpeg -i front.wav -i back.wav -i center.wav -i lfe.wav
-map 0:0 -map 1:0 -map 2:0 -map 3:0 -c:a opus
-stream_group type=iamf_audio_element:id=1:st=0:st=1:st=2:st=3,
demixing=parameter_id=998,
recon_gain=parameter_id=101,
layer=ch_layout=stereo,
layer=ch_layout=5.1(side),
-stream_group type=iamf_mix_presentation:id=2:stg=0:annotations=en-us=Mix_Presentation,
submix=parameter_id=100:parameter_rate=48000|element=stg=0:parameter_id=100:annotations=en-us=Scalable_Submix|layout=sound_system=stereo|layout=sound_system=5.1(side)
-streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.iamf

Para copiar os dois stream groups (Audio Element e Mix Presentation) de um arquivo IAMF de entrada com quatro fluxos para uma saída mp4

ffmpeg -i input.iamf -c:a copy -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group map=0=1:stg=0
-streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.mp4

-target type (output)

Especifica o tipo de arquivo de destino (vcd, svcd, dvd, dv, dv50). type pode ser prefixado com pal-, ntsc- ou film- para usar o padrão correspondente. Todas as opções de formato (taxa de bits, codecs, tamanhos de buffer) são então definidas automaticamente. Basta digitar:

ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

Ainda assim, é possível especificar opções adicionais, desde que se saiba que elas não entram em conflito com o padrão, como em:

ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg

Os parâmetros definidos para cada destino são os seguintes.

VCD

pal:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x288 -r 25
-codec:v mpeg1video -g 15 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k

ntsc:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x240 -r 30000/1001
-codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k

film:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x240 -r 24000/1001
-codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k

SVCD

pal:
-f svcd -packetsize 2324
-s 480x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k

ntsc:
-f svcd -packetsize 2324
-s 480x480 -pix_fmt yuv420p -r 30000/1001
-codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k

film:
-f svcd -packetsize 2324
-s 480x480 -pix_fmt yuv420p -r 24000/1001
-codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k

DVD

pal:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k

ntsc:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x480 -pix_fmt yuv420p -r 30000/1001
-codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k

film:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x480 -pix_fmt yuv420p -r 24000/1001
-codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k

DV

pal:
-f dv
-s 720x576 -pix_fmt yuv420p -r 25
-ar 48000 -ac 2

ntsc:
-f dv
-s 720x480 -pix_fmt yuv411p -r 30000/1001
-ar 48000 -ac 2

film:
-f dv
-s 720x480 -pix_fmt yuv411p -r 24000/1001
-ar 48000 -ac 2

O destino dv50 é idêntico ao destino dv, exceto que o pixel format definido é yuv422p para os três padrões.

Qualquer valor definido pelo usuário para um parâmetro acima substituirá o valor predefinido do destino. Nesse caso, a saída pode não estar em conformidade com o padrão de destino.

-dn (input/output)

Como opção de entrada, impede que todos os fluxos de dados de um arquivo sejam filtrados ou selecionados/mapeados automaticamente para qualquer saída. Veja a opção -discard para desabilitar fluxos individualmente.

Como opção de saída, desabilita a gravação de dados, ou seja, a seleção ou o mapeamento automático de qualquer fluxo de dados. Para controle manual completo, veja a opção -map.

-dframes number (output)

Define o número de quadros de dados a serem gerados na saída. É um alias obsoleto de -frames:d, que deve ser usado em seu lugar.

-frames[:stream_specifier] framecount (output,per-stream)

Interrompe a escrita no fluxo após framecount quadros.

-q[:stream_specifier] q (output,per-stream) -qscale[:stream_specifier] q (output,per-stream)

Usa uma escala de qualidade fixa (VBR). O significado de q/qscale depende do codec. Se qscale for usado sem um stream_specifier, ele se aplica apenas ao fluxo de vídeo; isso é para manter a compatibilidade com o comportamento anterior, já que especificar o mesmo valor específico de codec para 2 codecs diferentes, ou seja, áudio e vídeo, geralmente não é o que se pretende quando nenhum stream_specifier é usado.

-filter[:stream_specifier] filtergraph (output,per-stream)

Cria o filtergraph especificado por filtergraph e o usa para filtrar o fluxo.

filtergraph é uma descrição do filtergraph a aplicar ao fluxo, e deve ter uma única entrada e uma única saída do mesmo tipo do fluxo. No filtergraph, a entrada é associada ao rótulo in, e a saída ao rótulo out. Veja o manual ffmpeg-filters para mais informações sobre a sintaxe do filtergraph.

Veja a opção -filter_complex se quiser criar filtergraphs com múltiplas entradas e/ou saídas.

-reinit_filter[:stream_specifier] integer (input,per-stream)

Essa opção booleana determina se o(s) filtergraph(s) que esse fluxo alimenta é reinicializado quando os parâmetros do quadro de entrada mudam no meio do fluxo. Essa opção é habilitada por padrão, já que a maioria dos filtros de vídeo e todos os filtros de áudio não conseguem lidar com desvios nas propriedades do quadro de entrada. Na reinicialização, o estado existente do filtro é perdido, como por exemplo a referência à contagem de quadros n disponível em alguns filtros. Quaisquer quadros em buffer no momento da reinicialização são perdidos. As propriedades cuja mudança dispara a reinicialização são, para vídeo, a resolução do quadro ou o pixel format; para áudio, o sample format, a taxa de amostragem, o número de canais ou o layout de canais.

-drop_changed[:stream_specifier] integer (input,per-stream)

Essa opção booleana determina se um quadro com parâmetros de quadro diferentes no meio do fluxo é descartado em vez de levar à reinicialização do filtergraph, já que isso causaria perda do estado do filtro. Geralmente útil para evitar pacotes corrompidos mas ainda assim decodificáveis em entradas de streaming ao vivo. O padrão é false.

-filter_threads nb_threads (global)

Define quantas threads são usadas para processar um pipeline de filtros. Cada pipeline produzirá um pool de threads com essa quantidade de threads disponíveis para processamento paralelo. O padrão é o número de CPUs disponíveis.

-filter_buffered_frames nb_frames (global)

Define o número máximo de quadros em buffer permitidos em um filtergraph. Em circunstâncias normais, um filtergraph não deve armazenar em buffer mais do que alguns quadros, especialmente se os quadros forem alimentados e lidos dele de forma equilibrada (que é o comportamento previsto no ffmpeg). Dito isso, essa opção permite limitar o número total de quadros em buffer em todos os links de um filtergraph. Se mais quadros forem gerados, a filtragem é abortada e um erro é retornado. O valor padrão é 0, o que significa sem limite.

-pre[:stream_specifier] preset_name (output,per-stream)

Especifica o preset para o(s) fluxo(s) correspondente(s).

-stats (global)

Registra o progresso/as estatísticas de codificação como log de nível "info" (veja -loglevel). Está ativado por padrão; para desabilitá-lo explicitamente, é preciso especificar -nostats.

-stats_period time (global)

Define o período de atualização do progresso/das estatísticas de codificação. O padrão é 0.5 segundos.

-print_graphs (global)

Imprime detalhes do grafo de execução em stderr no formato definido por -print_graphs_format.

-print_graphs_file filename (global)

Grava detalhes do grafo de execução no arquivo especificado, no formato definido por -print_graphs_format.

-print_graphs_format format (global)

Define o formato de saída (os formatos disponíveis são: default, compact, csv, flat, ini, json, xml, mermaid, mermaidhtml). O formato padrão é json.

-progress url (global)

Envia informações de progresso legíveis por programas para url.

As informações de progresso são gravadas periodicamente e ao final do processo de codificação. Consistem em linhas "key=value". key é composta apenas por caracteres alfanuméricos. A última key de uma sequência de informações de progresso é sempre "progress", com o valor "continue" ou "end".

O período de atualização é definido usando -stats_period.

Por exemplo, para registrar as informações de progresso em stdout:

ffmpeg -progress pipe:1 -i in.mkv out.mkv

-stdin

Habilita a interação pela entrada padrão. Ativada por padrão, a menos que a entrada padrão seja usada como entrada. Para desabilitar a interação explicitamente, é preciso especificar -nostdin.

Desabilitar a interação pela entrada padrão é útil, por exemplo, se o ffmpeg estiver no grupo de processos em segundo plano. Um resultado aproximadamente igual pode ser obtido com ffmpeg ... < /dev/null, mas isso requer um shell.

-debug_ts (global)

Exibe informações de marca de tempo/latência. Está desativada por padrão. Essa opção é útil principalmente para fins de teste e depuração, e o formato de saída pode mudar de uma versão para outra, portanto não deve ser usada em scripts portáveis.

Veja também a opção -fdebug ts.

-attach filename (output)

Adiciona um anexo ao arquivo de saída. Isso é compatível com alguns formatos, como o Matroska, por exemplo para fontes usadas na renderização de legendas. Os anexos são implementados como um tipo específico de fluxo, portanto essa opção adicionará um novo fluxo ao arquivo. Depois disso, é possível usar opções per-stream nesse fluxo da forma usual. Os fluxos de anexo criados com essa opção serão criados após todos os demais fluxos (ou seja, os criados com -map ou por mapeamentos automáticos).

Observe que, para o Matroska, também é preciso definir a tag de metadados mimetype:

ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

(supondo que o fluxo de anexo será o terceiro no arquivo de saída).

-dump_attachment[:stream_specifier] filename (input,per-stream)

Extrai o fluxo de anexo correspondente para um arquivo chamado filename. Se filename estiver vazio, será usado o valor da tag de metadados filename.

Por exemplo, para extrair o primeiro anexo para um arquivo chamado ’out.ttf’:

ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

Para extrair todos os anexos para arquivos determinados pela tag filename:

ffmpeg -dump_attachment:t "" -i INPUT

Nota técnica: os anexos são implementados como extradata do codec, portanto essa opção pode, na verdade, ser usada para extrair extradata de qualquer fluxo, não apenas de anexos.

5.5 Opções de vídeo

-vframes number (output)

Define o número de quadros de vídeo a serem gerados na saída. É um alias obsoleto de -frames:v, que deve ser usado em seu lugar.

-r[:stream_specifier] fps (input/output,per-stream)

Define a taxa de quadros (valor em Hz, fração ou abreviação).

Como opção de entrada, ignora quaisquer marcas de tempo armazenadas no arquivo e, em vez disso, gera marcas de tempo assumindo uma taxa de quadros constante fps. Isso não é o mesmo que a opção -framerate usada por alguns formatos de entrada, como image2 ou v4l2 (em versões antigas do FFmpeg costumava ser o mesmo). Em caso de dúvida, use -framerate em vez da opção de entrada -r.

Como opção de saída:

codificação de vídeo

Duplica ou descarta quadros imediatamente antes de codificá-los, para obter uma taxa de quadros de saída constante fps.

streamcopy de vídeo

Indica ao muxer que fps é a taxa de quadros do fluxo. Nesse caso, nenhum dado é descartado ou duplicado. Isso pode gerar arquivos inválidos se fps não corresponder à taxa de quadros real do fluxo, conforme determinada pelas marcas de tempo dos pacotes. Veja também o filtro de bitstream setts.

-fpsmax[:stream_specifier] fps (output,per-stream)

Define a taxa de quadros máxima (valor em Hz, fração ou abreviação).

Limita a taxa de quadros de saída quando essa taxa é definida automaticamente e é maior do que esse valor. Útil no processamento em lote ou quando a taxa de quadros de entrada é detectada incorretamente como muito alta. Não pode ser definida junto com -r. É ignorada durante a cópia de fluxo.

-s[:stream_specifier] size (input/output,per-stream)

Define o tamanho do quadro.

Como opção de entrada, é um atalho para a opção private video_size, reconhecida por alguns demuxers nos quais o tamanho do quadro não é armazenado no arquivo ou é configurável – por exemplo, vídeo raw ou capturadoras de vídeo.

Como opção de saída, insere o filtro de vídeo scale no final do filtergraph correspondente. Use o filtro scale diretamente para inseri-lo no início ou em outro local.

O formato é ‘wxh’ (padrão, igual ao de origem).

-aspect[:stream_specifier] aspect (output,per-stream)

Define a proporção de aspecto de exibição do vídeo especificada por aspect.

aspect pode ser uma string de número de ponto flutuante, ou uma string no formato num:den, em que num e den são o numerador e o denominador da proporção de aspecto. Por exemplo, "4:3", "16:9", "1.3333" e "1.7777" são valores de argumento válidos.

Se usada junto com -vcodec copy, afeta a proporção de aspecto armazenada em nível de container, mas não a proporção de aspecto armazenada nos quadros codificados, se existir.

-display_rotation[:stream_specifier] rotation (input,per-stream)

Define os metadados de rotação do vídeo.

rotation é um número decimal que especifica, em graus, o quanto o vídeo deve ser rotacionado no sentido anti-horário antes de ser exibido.

Essa opção substitui os metadados de rotação/transformação de exibição armazenados no arquivo, se houver. Quando o vídeo está sendo transcodificado (em vez de copiado) e -autorotate está habilitada, o vídeo é rotacionado na etapa de filtragem. Caso contrário, os metadados são gravados no arquivo de saída se o muxer for compatível.

Se as opções -display_hflip e/ou -display_vflip forem informadas, elas são aplicadas após a rotação especificada por essa opção.

-display_hflip[:stream_specifier] (input,per-stream)

Define se, na exibição, a imagem deve ser invertida horizontalmente.

Veja a opção -display_rotation para mais detalhes.

-display_vflip[:stream_specifier] (input,per-stream)

Define se, na exibição, a imagem deve ser invertida verticalmente.

Veja a opção -display_rotation para mais detalhes.

-mastering_display[:stream_specifier] G(%u,%u)B(%u,%u)R(%u,%u)WP(%u,%u)L(%u,%u) (input,per-stream)

Define os metadados de mastering display do vídeo.

G(%u,%u)B(%u,%u)R(%u,%u)WP(%u,%u)L(%u,%u) é uma string que especifica as primárias de exibição X,Y para os canais GBR e o ponto branco (WP) em unidades de 0.00002, e os valores de luminância máxima-mínima (L) em unidades de 0.0001 candela por metro quadrado. Os valores são inteiros sem sinal que representam o numerador de um racional com denominador implícito de 50000 para GBR e (WP), e denominador implícito de 10000 para (L).

Essa opção substitui os metadados de mastering display armazenados no arquivo, se houver.

-content_light[:stream_specifier] %u,%u (input,per-stream)

Define os metadados de content light do vídeo.

%u,%u é uma string que especifica o nível máximo de content light e o nível máximo médio de luz da imagem.

Essa opção substitui os metadados de content light armazenados no arquivo, se houver.

-vn (input/output)

Como opção de entrada, impede que todos os fluxos de vídeo de um arquivo sejam filtrados ou selecionados/mapeados automaticamente para qualquer saída. Veja a opção -discard para desabilitar fluxos individualmente.

Como opção de saída, desabilita a gravação de vídeo, ou seja, a seleção ou o mapeamento automático de qualquer fluxo de vídeo. Para controle manual completo, veja a opção -map.

-vcodec codec (output)

Define o codec de vídeo. É um alias de -codec:v.

-pass[:stream_specifier] n (output,per-stream)

Seleciona o número do passo (1 ou 2). É usado para fazer codificação de vídeo em duas passadas. As estatísticas do vídeo são registradas na primeira passada em um arquivo de log (veja também a opção -passlogfile), e na segunda passada esse arquivo de log é usado para gerar o vídeo na taxa de bits exata solicitada. Na passada 1, basta desativar o áudio e definir a saída como null; exemplos para Windows e Unix:

ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null

-passlogfile[:stream_specifier] prefix (output,per-stream)

Define o prefixo do nome do arquivo de log de duas passadas como prefix; o prefixo de nome de arquivo padrão é “ffmpeg2pass”. O nome completo do arquivo será PREFIX-N.log, em que N é um número específico do fluxo de saída

-vf filtergraph (output)

Cria o filtergraph especificado por filtergraph e o usa para filtrar o fluxo.

É um alias de -filter:v; veja a opção -filter.

-autorotate

Rotaciona automaticamente o vídeo de acordo com os metadados do arquivo. Habilitada por padrão; use -noautorotate para desabilitá-la.

-autoscale

Dimensiona automaticamente o vídeo de acordo com a resolução do primeiro quadro. Habilitada por padrão; use -noautoscale para desabilitá-la. Quando autoscale está desabilitada, os quadros de saída do filter graph podem não ficar todos na mesma resolução, o que pode ser inadequado para alguns encoder/muxer. Portanto, não é recomendado desabilitá-la a menos que você realmente saiba o que está fazendo. Desabilite autoscale por sua conta e risco.

5.6 Opções avançadas de vídeo

-pix_fmt[:stream_specifier] format (input/output,per-stream)

Define o pixel format. Use -pix_fmts para exibir todos os pixel formats compatíveis. Se o pixel format selecionado não puder ser escolhido, o ffmpeg exibirá um aviso e selecionará o melhor pixel format compatível com o encoder. Se pix_fmt for prefixado com +, o ffmpeg encerrará com um erro caso o pixel format solicitado não possa ser escolhido, e as conversões automáticas dentro dos filtergraphs são desabilitadas. Se pix_fmt for um único +, o ffmpeg seleciona o mesmo pixel format da entrada (ou da saída do grafo), e as conversões automáticas são desabilitadas.

-sws_flags flags (input/output)

Define as flags padrão da biblioteca libswscale. Essas flags são usadas pelos filtros scale inseridos automaticamente e pelos que estão dentro de simple filtergraphs, caso não sejam substituídas dentro da definição do filtergraph.

Veja (ffmpeg-scaler)ffmpeg-scaler manual para uma lista de opções do scaler.

-rc_override[:stream_specifier] override (output,per-stream)

Substituição de controle de taxa para intervalos específicos, no formato de uma lista "int,int,int" separada por barras. Os dois primeiros valores são os números de quadro inicial e final; o último é o quantizador a usar, se positivo, ou o fator de qualidade, se negativo.

-vstats

Despeja as estatísticas de codificação de vídeo em vstats_HHMMSS.log. Veja a seção de formato de arquivo vstats para a descrição do formato.

-vstats_file file

Despeja as estatísticas de codificação de vídeo em file. Veja a seção de formato de arquivo vstats para a descrição do formato.

-vstats_version file

Especifica qual versão do formato vstats deve ser usada. O padrão é 2. Veja a seção de formato de arquivo vstats para a descrição do formato.

-vtag fourcc/tag (output)

Força a tag/fourcc de vídeo. É um alias de -tag:v.

-force_key_frames[:stream_specifier] time[,time...] (output,per-stream) -force_key_frames[:stream_specifier] expr:expr (output,per-stream) -force_key_frames[:stream_specifier] source (output,per-stream) -force_key_frames[:stream_specifier] scd_metadata (output,per-stream)

force_key_frames pode receber argumentos com a seguinte forma:

time[,time...]

Se o argumento consistir em marcas de tempo, o ffmpeg arredondará os tempos especificados para a marca de tempo de saída mais próxima, de acordo com a base de tempo do encoder, e forçará um keyframe no primeiro quadro cuja marca de tempo seja igual ou maior que a marca de tempo calculada. Observe que, se a base de tempo do encoder for grosseira demais, os keyframes podem ser forçados em quadros com marcas de tempo menores que o tempo especificado. A base de tempo padrão do encoder é o inverso da taxa de quadros de saída, mas pode ser definida de outra forma via -enc_time_base.

Se um dos tempos for "chapters[delta]", ele é expandido para o tempo de início de todos os capítulos do arquivo, deslocado por delta, expresso como um tempo em segundos. Essa opção pode ser útil para garantir que haja um ponto de busca em uma marca de capítulo ou em qualquer outro local designado no arquivo de saída.

Por exemplo, para inserir um key frame aos 5 minutos, além de key frames 0.1 segundo antes do início de cada capítulo:

-force_key_frames 0:05:00,chapters-0.1

expr:expr

Se o argumento for prefixado com expr:, a string expr é interpretada como uma expressão e é avaliada a cada quadro. Um key frame é forçado caso a avaliação seja diferente de zero.

A expressão em expr pode conter as seguintes constantes:

n

o número do quadro atualmente processado, começando em 0

n_forced

o número de quadros forçados

prev_forced_n

o número do quadro forçado anterior; é NAN quando ainda não foi forçado nenhum keyframe

prev_forced_t

o tempo do quadro forçado anterior; é NAN quando ainda não foi forçado nenhum keyframe

t

o tempo do quadro atualmente processado

Por exemplo, para forçar um key frame a cada 5 segundos, você pode especificar:

-force_key_frames expr:gte(t,n_forced*5)

Para forçar um key frame 5 segundos após o tempo do último forçado, começando no segundo 13:

-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))

source

Se o argumento for source, o ffmpeg forçará um key frame se o quadro atualmente sendo codificado estiver marcado como key frame em sua origem. Nos casos em que esse quadro de origem específico precise ser descartado, o próximo quadro disponível é forçado a se tornar um key frame em seu lugar.

scd_metadata

Se o argumento for scd_metadata, o ffmpeg forçará um key frame se o quadro atual contiver uma entrada de metadados com a chave lavfi.scd.time. Esses metadados podem ser adicionados por filtros como scdet e scdet_vulkan. Evite inserir filtros que dupliquem quadros após o scdet, pois isso pode causar metadados duplicados em vários quadros e a inserção repetida de key frames.

Observe que forçar keyframes demais é muito prejudicial para os algoritmos de lookahead de certos encoders: usar opções de GOP fixo ou similares seria mais eficiente.

-apply_cropping[:stream_specifier] source (input,per-stream)

Recorta automaticamente o vídeo após a decodificação, de acordo com os metadados do arquivo. O padrão é all.

none (0)

Não aplica nenhum metadado de recorte.

all (1)

Aplica o recorte tanto em nível de codec quanto de container. Esse é o modo padrão.

codec (2)

Aplica o recorte em nível de codec.

container (3)

Aplica o recorte em nível de container.

-copyinkf[:stream_specifier] (output,per-stream)

Ao fazer cópia de fluxo, copia também os quadros que não são key frames encontrados no início.

-init_hw_device type[=name][:device[,key=value...]]

Inicializa um novo dispositivo de hardware do type type chamado name, usando os parâmetros de dispositivo informados. Se nenhum name for especificado, ele receberá um nome padrão no formato "type%d".

O significado de device e dos argumentos seguintes depende do tipo de dispositivo:

cuda

device é o número do dispositivo CUDA.

São reconhecidas as seguintes opções:

primary_ctx

Se definido como 1, usa o contexto de dispositivo primário em vez de criar um novo.

Exemplos:

-init_hw_device cuda:1

Escolhe o segundo dispositivo do sistema.

-init_hw_device cuda:0,primary_ctx=1

Escolhe o primeiro dispositivo e usa o contexto de dispositivo primário.

dxva2

device é o número do adaptador de exibição Direct3D 9.

d3d11va

device é o número do adaptador de exibição Direct3D 11. Se não for especificado, tentará usar o adaptador de exibição Direct3D 11 padrão ou o primeiro adaptador de exibição Direct3D 11 cujo VendorId de hardware seja especificado por ‘vendor_id’.

Exemplos:

-init_hw_device d3d11va

Cria um dispositivo d3d11va no adaptador de exibição Direct3D 11 padrão.

-init_hw_device d3d11va:1

Cria um dispositivo d3d11va no adaptador de exibição Direct3D 11 especificado pelo índice 1.

-init_hw_device d3d11va:,vendor_id=0x8086

Cria um dispositivo d3d11va no primeiro adaptador de exibição Direct3D 11 cujo VendorId de hardware seja 0x8086.

vaapi

device é um nome de exibição X11, um nó de renderização DRM, ou um índice de adaptador DirectX. Se não for especificado, tentará abrir a exibição X11 padrão ($DISPLAY) e, em seguida, o primeiro nó de renderização DRM (/dev/dri/renderD128), ou o adaptador DirectX padrão no Windows.

São reconhecidas as seguintes opções:

kernel_driver

Quando device não é especificado, use esta opção para indicar o nome do driver de kernel associado ao dispositivo desejado. Esta opção está disponível somente quando os métodos de aceleração por hardware drm e vaapi estão habilitados.

vendor_id

Quando device e kernel_driver não são especificados, use esta opção para indicar o vendor id associado ao dispositivo desejado. Esta opção está disponível somente quando os métodos de aceleração por hardware drm e vaapi estão habilitados e kernel_driver não é especificado.

Exemplos:

-init_hw_device vaapi

Cria um dispositivo vaapi no dispositivo padrão.

-init_hw_device vaapi:/dev/dri/renderD129

Cria um dispositivo vaapi no nó de renderização DRM /dev/dri/renderD129.

-init_hw_device vaapi:1

Cria um dispositivo vaapi no adaptador DirectX 1.

-init_hw_device vaapi:,kernel_driver=i915

Cria um dispositivo vaapi em um dispositivo associado ao driver de kernel ‘i915’.

-init_hw_device vaapi:,vendor_id=0x8086

Cria um dispositivo vaapi em um dispositivo associado ao vendor id ‘0x8086’.

vdpau

device é um nome de exibição X11. Se não for especificado, tentará abrir a exibição X11 padrão ($DISPLAY).

qsv

device seleciona um valor em ‘MFX_IMPL_*’. Os valores permitidos são:

auto sw hw auto_any hw_any hw2 hw3 hw4

Se não for especificado, ‘auto_any’ é usado. (Observe que pode ser mais simples obter o resultado desejado para o QSV criando o subdispositivo apropriado para a plataforma (‘dxva2’, ‘d3d11va’ ou ‘vaapi’) e depois derivando dele um dispositivo QSV.)

As opções a seguir são reconhecidas:

child_device

Especifica um nó de renderização DRM no Linux ou um adaptador DirectX no Windows.

child_device_type

Escolhe o tipo de subdispositivo apropriado para a plataforma. No Windows, ‘d3d11va’ é usado como tipo de subdispositivo padrão quando --enable-libvpl é especificado no momento da configuração, e ‘dxva2’ é usado como tipo de subdispositivo padrão quando --enable-libmfx é especificado no momento da configuração. No Linux, o usuário só pode usar ‘vaapi’ como tipo de subdispositivo.

Exemplos:

-init_hw_device qsv:hw,child_device=/dev/dri/renderD129

Cria um dispositivo QSV com ‘MFX_IMPL_HARDWARE’ no nó de renderização DRM /dev/dri/renderD129.

-init_hw_device qsv:hw,child_device=1

Cria um dispositivo QSV com ‘MFX_IMPL_HARDWARE’ no adaptador DirectX 1.

-init_hw_device qsv:hw,child_device_type=d3d11va

Escolhe o subdispositivo de GPU do tipo ‘d3d11va’ e cria um dispositivo QSV com ‘MFX_IMPL_HARDWARE’.

-init_hw_device qsv:hw,child_device_type=dxva2

Escolhe o subdispositivo de GPU do tipo ‘dxva2’ e cria um dispositivo QSV com ‘MFX_IMPL_HARDWARE’.

-init_hw_device qsv:hw,child_device=1,child_device_type=d3d11va

Cria um dispositivo QSV com ‘MFX_IMPL_HARDWARE’ no adaptador DirectX 1 com o subdispositivo do tipo ‘d3d11va’.

-init_hw_device vaapi=va:/dev/dri/renderD129 -init_hw_device qsv=hw1@ va

Cria um dispositivo VAAPI chamado ‘va’ em /dev/dri/renderD129 e, a partir dele, deriva um dispositivo QSV chamado ‘hw1’.

opencl

device seleciona a plataforma e o dispositivo como platform_index.device_index.

O conjunto de dispositivos também pode ser filtrado usando pares chave-valor, para encontrar apenas os dispositivos que correspondam a determinadas strings de plataforma ou de dispositivo.

As strings que podem ser usadas como filtros são:

platform_profile platform_version platform_name platform_vendor platform_extensions device_name device_vendor driver_version device_version device_profile device_extensions device_type

Os índices e os filtros devem, em conjunto, selecionar um dispositivo de forma unívoca.

Exemplos:

-init_hw_device opencl:0.1

Escolhe o segundo dispositivo da primeira plataforma.

-init_hw_device opencl:,device_name=Foo9000

Escolhe o dispositivo cujo nome contenha a string Foo9000.

-init_hw_device opencl:1,device_type=gpu,device_extensions=cl_khr_fp16

Escolhe o dispositivo de GPU da segunda plataforma que oferece suporte à extensão cl_khr_fp16.

vulkan

Se device for um número inteiro, seleciona o dispositivo pelo índice em uma lista de dispositivos dependente do sistema. Se device for qualquer outra string, seleciona o primeiro dispositivo cujo nome contenha essa string como substring.

As opções a seguir são reconhecidas:

debug

Se definido como 1, habilita a camada de validação, caso esteja instalada.

linear_images

Se definido como 1, as imagens alocadas pelo hwcontext serão lineares e mapeáveis localmente.

instance_extensions

Uma lista separada por sinais de mais das extensões de instância adicionais a habilitar.

device_extensions

Uma lista separada por sinais de mais das extensões de dispositivo adicionais a habilitar.

Exemplos:

-init_hw_device vulkan:1

Escolhe o segundo dispositivo do sistema.

-init_hw_device vulkan:RADV

Escolhe o primeiro dispositivo cujo nome contenha a string RADV.

-init_hw_device vulkan:0,instance_extensions=VK_KHR_wayland_surface+VK_KHR_xcb_surface

Escolhe o primeiro dispositivo e habilita as extensões de instância Wayland e XCB.

-init_hw_device type[=name]@source

Inicializa um novo dispositivo de hardware do tipo type, chamado name, derivando-o do dispositivo existente com o nome source.

-init_hw_device list

Lista todos os tipos de dispositivo de hardware compatíveis com esta compilação do ffmpeg.

-filter_hw_device name

Passa o dispositivo de hardware chamado name para todos os filtros de qualquer filtergraph. Isso pode ser usado para definir o dispositivo de destino do upload no filtro hwupload, ou o dispositivo de destino do mapeamento no filtro hwmap. Outros filtros também podem usar este parâmetro quando precisarem de um dispositivo de hardware. Observe que isso normalmente só é necessário quando a entrada ainda não está em quadros de hardware; quando já está, os filtros derivam o dispositivo necessário a partir do contexto dos quadros que recebem como entrada.

Esta é uma configuração global, portanto todos os filtros recebem o mesmo dispositivo.

-hwaccel[:stream_specifier] hwaccel (input,per-stream)

Usa aceleração por hardware para decodificar o(s) fluxo(s) correspondente(s). Os valores permitidos para hwaccel são:

none

Não usa nenhuma aceleração por hardware (o padrão).

auto

Seleciona automaticamente o método de aceleração por hardware.

vdpau

Usa a aceleração por hardware VDPAU (Video Decode and Presentation API for Unix).

dxva2

Usa a aceleração por hardware DXVA2 (DirectX Video Acceleration).

d3d11va

Usa a aceleração por hardware D3D11VA (DirectX Video Acceleration).

vaapi

Usa a aceleração por hardware VAAPI (Video Acceleration API).

qsv

Usa a aceleração Intel QuickSync Video para a transcodificação de vídeo.

Diferentemente da maioria dos outros valores, esta opção não habilita a decodificação acelerada (que é usada automaticamente sempre que um decoder qsv é selecionado), e sim a transcodificação acelerada, sem copiar os quadros para a memória do sistema.

Para que isso funcione, tanto o decoder quanto o encoder devem oferecer suporte à aceleração QSV, e nenhum filtro deve ser usado.

videotoolbox

Usa a aceleração por hardware do Video Toolbox.

Esta opção não tem efeito se o hwaccel selecionado não estiver disponível ou não for compatível com o decoder escolhido.

Observe que a maioria dos métodos de aceleração é voltada para reprodução e não será mais rápida que a decodificação por software em CPUs modernas. Além disso, o ffmpeg geralmente precisará copiar os quadros decodificados da memória da GPU para a memória do sistema, o que causa mais perda de desempenho. Por isso, esta opção é útil principalmente para testes.

-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)

Seleciona um dispositivo a ser usado para a aceleração por hardware.

Esta opção só faz sentido quando a opção -hwaccel também é especificada. Ela pode se referir, pelo nome, a um dispositivo existente criado com -init_hw_device, ou pode criar um novo dispositivo como se ‘-init_hw_device’ type:hwaccel_device tivesse sido chamado imediatamente antes.

-hwaccels

Lista todos os componentes de aceleração por hardware habilitados nesta compilação do ffmpeg. A disponibilidade real em tempo de execução depende do hardware e da instalação do driver adequado.

-fix_sub_duration_heartbeat[:stream_specifier]

Define um fluxo de vídeo de saída específico como o fluxo heartbeat, segundo o qual a legenda atualmente em andamento é dividida e enviada adiante ao receber um pacote de acesso aleatório.

Isso reduz a latência das legendas cujo pacote final ou legenda seguinte ainda não foi recebido. Como contrapartida, isso provavelmente leva à duplicação de eventos de legenda para cobrir a duração completa; portanto, em casos de uso em que a latência com que o evento de legenda é repassado à saída não é relevante, esta opção não deve ser usada.

Para que isso tenha algum efeito, é necessário que -fix_sub_duration esteja definido para o fluxo de legenda de entrada relevante, e que esse fluxo de legenda de entrada esteja mapeado diretamente para a mesma saída em que reside o fluxo heartbeat.

5.7 Opções de áudio

-aframes number (output)

Define o número de quadros de áudio a serem gerados na saída. Este é um alias obsoleto de -frames:a, que deve ser usado em seu lugar.

-ar[:stream_specifier] freq (input/output,per-stream)

Define a taxa de amostragem de áudio. Nos fluxos de saída, por padrão ela é definida de acordo com a taxa de amostragem do fluxo de entrada correspondente. Nos fluxos de entrada, esta opção só faz sentido para dispositivos de captura de áudio e demuxers brutos, e é mapeada para as opções correspondentes do demuxer.

-aq q (output)

Define a qualidade de áudio (específica do codec, VBR). É um alias de -q:a.

-ac[:stream_specifier] channels (input/output,per-stream)

Define o número de canais de áudio. Nos fluxos de saída, por padrão ele é definido com o número de canais de áudio de entrada. Nos fluxos de entrada, esta opção só faz sentido para dispositivos de captura de áudio e demuxers brutos, e é mapeada para as opções correspondentes do demuxer.

-an (input/output)

Como opção de entrada, impede que todos os fluxos de áudio de um arquivo sejam filtrados, selecionados automaticamente ou mapeados para qualquer saída. Consulte a opção -discard para desabilitar fluxos individualmente.

Como opção de saída, desabilita a gravação de áudio, ou seja, a seleção ou o mapeamento automático de qualquer fluxo de áudio. Para controle manual completo, consulte a opção -map.

-acodec codec (input/output)

Define o codec de áudio. É um alias de -codec:a.

-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)

Define o sample format de áudio. Use -sample_fmts para obter a lista de sample formats compatíveis.

-af filtergraph (output)

Cria o filtergraph especificado por filtergraph e o usa para filtrar o fluxo.

É um alias de -filter:a; consulte a opção -filter.

5.8 Opções avançadas de áudio

-atag fourcc/tag (output)

Força a tag/fourcc de áudio. É um alias de -tag:a.

-ch_layout[:stream_specifier] layout (input/output,per-stream)

Alias de -channel_layout.

-channel_layout[:stream_specifier] layout (input/output,per-stream)

Define o layout de canais de áudio. Nos fluxos de saída, por padrão ele é definido com o layout de canais de entrada. Nos fluxos de entrada, ele substitui o layout de canais da entrada. Nem todos os decoders respeitam o layout de canais substituído. Esta opção também define o layout de canais para dispositivos de captura de áudio e demuxers brutos, e é mapeada para a opção correspondente do demuxer.

-guess_layout_max channels (input,per-stream)

Se algum layout de canais de entrada não for conhecido, tenta deduzi-lo somente se corresponder, no máximo, ao número de canais especificado. Por exemplo, 2 indica ao ffmpeg para reconhecer 1 canal como mono e 2 canais como estéreo, mas não 6 canais como 5.1. Por padrão, a dedução é sempre tentada. Use 0 para desabilitar toda dedução. Usar a opção -channel_layout para especificar explicitamente um layout de entrada também desabilita a dedução.

5.9 Opções de legenda

-scodec codec (input/output)

Define o codec de legenda. É um alias de -codec:s.

-sn (input/output)

Como opção de entrada, impede que todos os fluxos de legenda de um arquivo sejam filtrados, selecionados automaticamente ou mapeados para qualquer saída. Consulte a opção -discard para desabilitar fluxos individualmente.

Como opção de saída, desabilita a gravação de legenda, ou seja, a seleção ou o mapeamento automático de qualquer fluxo de legenda. Para controle manual completo, consulte a opção -map.

5.10 Opções avançadas de legenda

-fix_sub_duration

Corrige a duração das legendas. Para cada legenda, aguarda o próximo pacote no mesmo fluxo e ajusta a duração da primeira para evitar sobreposição. Isso é necessário com alguns codecs de legenda, especialmente as legendas DVB, porque a duração no pacote original é apenas uma estimativa aproximada, e o fim é na verdade marcado por um quadro de legenda vazio. Deixar de usar esta opção quando necessário pode resultar em durações exageradas ou falhas de multiplexação por causa de marcas de tempo não monotônicas.

Observe que esta opção atrasa a saída de todos os dados até que o próximo pacote de legenda seja decodificado: isso pode aumentar bastante o consumo de memória e a latência.

-canvas_size size

Define o tamanho da tela usada para renderizar as legendas.

5.11 Opções avançadas

-map [-]input_file_id[:stream_specifier][:view_specifier][:?] | [linklabel] (output)

Cria um ou mais fluxos no arquivo de saída. Esta opção tem duas formas de especificar a(s) fonte(s) de dados: a primeira seleciona um ou mais fluxos de algum arquivo de entrada (especificado com -i); a segunda usa uma saída de algum filtergraph complexo (especificado com -filter_complex).

Na primeira forma, um fluxo de saída é criado para cada fluxo do arquivo de entrada com o índice input_file_id. Se stream_specifier for informado, apenas os fluxos que corresponderem ao especificador são usados (consulte a seção Especificadores de fluxo para a sintaxe de stream_specifier).

Um caractere - antes do identificador de fluxo cria um mapeamento "negativo". Ele desabilita, nos mapeamentos já criados, os fluxos correspondentes.

Um view_specifier opcional pode ser informado depois do especificador de fluxo; em vídeo multivista, ele especifica a vista a ser usada. O especificador de vista pode ter um dos seguintes formatos:

view:view_id

seleciona uma vista pelo seu ID; view_id pode ser definido como ’all’ para usar todas as vistas intercaladas em um único fluxo;

vidx:view_idx

seleciona uma vista pelo seu índice, ou seja, 0 é a vista base, 1 é a primeira vista não base etc.

vpos:position

seleciona uma vista pela posição de exibição; position pode ser left ou right

Por padrão, a transcodificação usa apenas a vista base, ou seja, o equivalente a vidx:0. Na cópia de fluxo, os especificadores de vista não são compatíveis, e todas as vistas são sempre copiadas.

Um ? ao final do índice de fluxo torna o mapeamento opcional: se o mapeamento não corresponder a nenhum fluxo, ele será ignorado em vez de falhar. Observe que o mapeamento ainda falhará se for usado um índice de arquivo de entrada inválido, como quando o mapeamento se refere a uma entrada inexistente.

Uma forma alternativa [linklabel] mapeia saídas de filtergraphs complexos (veja a opção -filter_complex) para o arquivo de saída. linklabel deve corresponder a um rótulo de link de saída definido no grafo.

Esta opção pode ser especificada várias vezes, cada uma adicionando mais fluxos ao arquivo de saída. Qualquer fluxo de entrada também pode ser mapeado qualquer número de vezes como origem de diferentes fluxos de saída, por exemplo, para usar opções de codificação e/ou filtros diferentes. Os fluxos são criados na saída na mesma ordem em que as opções -map são informadas na linha de comando.

Usar esta opção desabilita os mapeamentos padrão deste arquivo de saída.

Exemplos:

mapear tudo

Para mapear TODOS os fluxos do primeiro arquivo de entrada para a saída

ffmpeg -i INPUT -map 0 output

selecionar um fluxo específico

Se o primeiro arquivo de entrada tiver dois fluxos de áudio, esses fluxos são identificados por 0:0 e 0:1. Você pode usar -map para selecionar quais fluxos colocar em um arquivo de saída. Por exemplo:

ffmpeg -i INPUT -map 0:1 out.wav

isso mapeia o segundo fluxo de entrada de INPUT para o (único) fluxo de saída de out.wav.

criar vários fluxos

Para selecionar o fluxo de índice 2 do arquivo de entrada a.mov (especificado pelo identificador 0:2) e o fluxo de índice 6 do arquivo de entrada b.mov (especificado pelo identificador 1:6), e copiá-los para o arquivo de saída out.mov:

ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov

criar vários fluxos 2

Para selecionar todo o vídeo e o terceiro fluxo de áudio de um arquivo de entrada:

ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT

mapeamento negativo

Para mapear todos os fluxos exceto o segundo de áudio, use mapeamentos negativos

ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT

mapeamento opcional

Para mapear os fluxos de vídeo e áudio da primeira entrada e, usando o ? final, ignorar o mapeamento de áudio se não houver fluxos de áudio na primeira entrada:

ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT

mapear por idioma

Para escolher o fluxo de áudio em inglês:

ffmpeg -i INPUT -map 0:m:language:eng OUTPUT

-ignore_unknown

Ignora fluxos de entrada de tipo desconhecido em vez de falhar, caso se tente copiar esses fluxos.

-copy_unknown

Permite copiar fluxos de entrada de tipo desconhecido em vez de falhar, caso se tente copiar esses fluxos.

-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)

Define as informações de metadados do próximo arquivo de saída a partir de infile. Observe que esses são índices de arquivo (com base em zero), não nomes de arquivo. Os parâmetros opcionais metadata_spec_in/out especificam quais metadados copiar. Um especificador de metadados pode ter um dos seguintes formatos:

g

metadados globais, ou seja, metadados que se aplicam ao arquivo inteiro

s[:stream_spec]

metadados por fluxo. stream_spec é um especificador de fluxo, conforme descrito no capítulo Especificadores de fluxo. Em um especificador de metadados de entrada, a cópia é feita a partir do primeiro fluxo correspondente. Em um especificador de metadados de saída, a cópia é feita para todos os fluxos correspondentes.

c:chapter_index

metadados por capítulo. chapter_index é o índice de capítulo com base em zero.

p:program_index

metadados por programa. program_index é o índice de programa com base em zero.

Se o especificador de metadados for omitido, o padrão é global.

Por padrão, os metadados globais são copiados do primeiro arquivo de entrada, e os metadados por fluxo e por capítulo são copiados junto com os fluxos/capítulos. Esses mapeamentos padrão são desabilitados ao se criar qualquer mapeamento do tipo correspondente. Um índice de arquivo negativo pode ser usado para criar um mapeamento fictício que apenas desabilita a cópia automática.

Por exemplo, para copiar os metadados do primeiro fluxo do arquivo de entrada para os metadados globais do arquivo de saída:

ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3

Para fazer o inverso, ou seja, copiar os metadados globais para todos os fluxos de áudio:

ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

Observe que um simples 0 também funcionaria neste exemplo, já que os metadados globais são presumidos por padrão.

-map_chapters input_file_index (output)

Copia os capítulos do arquivo de entrada com índice input_file_index para o próximo arquivo de saída. Se nenhum mapeamento de capítulo for especificado, os capítulos são copiados do primeiro arquivo de entrada que tiver pelo menos um capítulo. Use um índice de arquivo negativo para desabilitar qualquer cópia de capítulos.

-benchmark (global)

Mostra informações de benchmarking ao final de uma codificação. Mostra o tempo real, de sistema e de usuário utilizados, e o consumo máximo de memória. O consumo máximo de memória não é compatível com todos os sistemas; quando não é, geralmente é exibido como 0.

-benchmark_all (global)

Mostra informações de benchmarking durante a codificação. Mostra o tempo real, de sistema e de usuário utilizados em várias etapas (codificação/decodificação de áudio/vídeo).

-timelimit duration (global)

Sai depois que o ffmpeg estiver em execução por duration segundos em tempo de usuário de CPU.

-dump (global)

Despeja cada pacote de entrada em stderr.

-hex (global)

Ao despejar pacotes, despeja também o payload.

-readrate speed (input)

Limita a velocidade de leitura da entrada.

Seu valor é um número positivo em ponto flutuante que representa a duração máxima de mídia, em segundos, que deve ser ingerida em um segundo de tempo real (wallclock). O valor padrão é zero e representa que nenhuma limitação é imposta à velocidade de ingestão. O valor 1 representa a velocidade em tempo real e equivale a -re.

Usado principalmente para simular um dispositivo de captura ou um fluxo de entrada ao vivo (por exemplo, ao ler de um arquivo). Não deve ser usado com um valor baixo quando a entrada é um dispositivo de captura real ou um fluxo ao vivo, pois isso pode causar perda de pacotes.

É útil quando a velocidade de fluxo dos pacotes de saída é importante, como em streaming ao vivo.

-re (input)

Lê a entrada na taxa de quadros nativa. Isso equivale a definir -readrate 1.

-readrate_initial_burst seconds

Define um tempo inicial de burst de leitura, em segundos, após o qual -re/-readrate passa a ser aplicado.

-readrate_catchup speed (input)

Se a entrada ou a saída ficar bloqueada, fazendo com que a velocidade real de leitura fique abaixo do readrate especificado, esta taxa entra em vigor até que a entrada alcance o readrate especificado. Não deve ser inferior ao readrate principal.

-fps_mode[:stream_specifier] parameter (output,per-stream)

Define o método de sincronização de vídeo / o modo de taxa de quadros.

passthrough

Cada quadro é passado do demuxer para o muxer com sua marca de tempo.

cfr

Os quadros são duplicados e descartados para atingir exatamente a taxa de quadros constante solicitada.

vfr

Os quadros são passados adiante com sua marca de tempo, ou descartados, de modo a evitar que 2 quadros tenham a mesma marca de tempo.

auto

Escolhe entre cfr e vfr dependendo das capacidades do muxer. Este é o método padrão.

Observe que, depois disso, as marcas de tempo ainda podem ser modificadas pelo muxer. Por exemplo, no caso de a opção de formato avoid_negative_ts estar habilitada.

Com -map, você pode selecionar de qual fluxo as marcas de tempo devem ser retiradas. Você pode deixar o vídeo ou o áudio inalterado e sincronizar o(s) fluxo(s) restante(s) com o que não foi alterado.

-frame_drop_threshold parameter

Limiar de descarte de quadros, que especifica o quanto os quadros de vídeo podem atrasar antes de serem descartados. Em unidades de taxa de quadros, de modo que 1.0 equivale a um quadro. O padrão é -1.1. Um possível caso de uso é evitar descartes de quadros em caso de marcas de tempo ruidosas, ou aumentar a precisão do descarte de quadros em caso de marcas de tempo exatas.

-apad parameters (output,per-stream)

Preenche o(s) fluxo(s) de áudio de saída. É o mesmo que aplicar -af apad. O argumento é uma string de parâmetros de filtro composta da mesma forma que no filtro apad. Para que a opção tenha efeito, -shortest deve estar definido para esta saída.

-copyts

Não processa as marcas de tempo de entrada, mas mantém seus valores sem tentar saneá-los. Em especial, não remove o valor inicial de deslocamento do tempo de início.

Observe que, dependendo da opção fps_mode ou de um processamento específico do muxer (por exemplo, caso a opção de formato avoid_negative_ts esteja habilitada), as marcas de tempo de saída podem não corresponder às de entrada mesmo quando esta opção é selecionada.

-start_at_zero

Quando usada com copyts, desloca as marcas de tempo de entrada para que comecem em zero.

Isso significa que usar, por exemplo, -ss 50 fará com que as marcas de tempo de saída comecem em 50 segundos, independentemente da marca de tempo em que o arquivo de entrada começava.

-copytb mode

Especifica como definir a timebase do encoder ao copiar fluxos. mode é um valor numérico inteiro e pode assumir um dos seguintes valores:

1

Usa a timebase do demuxer.

A timebase é copiada para o encoder de saída a partir do demuxer de entrada correspondente. Isso às vezes é necessário para evitar marcas de tempo que não cresçam de forma monotônica ao copiar fluxos de vídeo com taxa de quadros variável.

0

Usa a timebase do decoder.

A timebase é copiada para o encoder de saída a partir do decoder de entrada correspondente.

-1

Tenta fazer a escolha automaticamente, de modo a gerar uma saída coerente.

O valor padrão é -1.

-enc_time_base[:stream_specifier] timebase (output,per-stream)

Define a timebase do encoder. timebase pode assumir um dos seguintes valores:

0

Atribui um valor padrão de acordo com o tipo de mídia.

Para vídeo, usa 1/framerate; para áudio, usa 1/samplerate.

demux

Usa a timebase do demuxer.

filter

Usa a timebase do filtergraph.

um número positivo

Usa o número informado como a timebase.

Este campo pode ser informado como a razão entre dois números inteiros (por exemplo, 1:24, 1:48000) ou como um número decimal (por exemplo, 0.04166, 2.0833e-5)

O valor padrão é 0.

-bitexact (input/output)

Habilita o modo bitexact para (de)muxer e (de/en)coder

-shortest (output)

Termina a codificação quando o fluxo de saída mais curto chega ao fim.

Observe que esta opção pode exigir o buffering de quadros, o que introduz latência adicional. A quantidade máxima dessa latência pode ser controlada com a opção -shortest_buf_duration.

-shortest_buf_duration duration (output)

A opção -shortest pode exigir que se armazenem em buffer quantidades potencialmente grandes de dados quando pelo menos um dos fluxos é "esparso" (ou seja, tem grandes intervalos entre quadros; costuma ser o caso das legendas).

Esta opção controla a duração máxima, em segundos, dos quadros em buffer. Valores maiores podem permitir que a opção -shortest produza resultados mais precisos, mas aumentam o uso de memória e a latência.

O valor padrão é 10 segundos.

-dts_delta_threshold threshold

Limiar delta de descontinuidade de marca de tempo, expresso como um número decimal de segundos.

A correção de descontinuidade de marca de tempo habilitada por esta opção só é aplicada a formatos de entrada que aceitam descontinuidade de marca de tempo (aqueles para os quais a flag AVFMT_TS_DISCONT está habilitada), por exemplo MPEG-TS e HLS, e é desabilitada automaticamente ao se usar a opção -copyts (a menos que seja detectado wrapping).

Se for detectada uma descontinuidade de marca de tempo cujo valor absoluto seja maior que threshold, o ffmpeg remove a descontinuidade diminuindo/aumentando o DTS e o PTS atuais pelo valor delta correspondente.

O valor padrão é 10.

-dts_error_threshold threshold

Limiar delta de erro de marca de tempo, expresso como um número decimal de segundos.

A correção de marca de tempo habilitada por esta opção só é aplicada a formatos de entrada que não aceitam descontinuidade de marca de tempo (aqueles para os quais a flag AVFMT_TS_DISCONT não está habilitada).

Se for detectada uma descontinuidade de marca de tempo cujo valor absoluto seja maior que threshold, o ffmpeg descarta o valor de marca de tempo PTS/DTS.

O valor padrão é 3600*30 (30 horas), escolhido de forma arbitrária e bastante conservadora.

-muxdelay seconds (output)

Define o atraso máximo de demux-decode.

-muxpreload seconds (output)

Define o atraso inicial de demux-decode.

-streamid output-stream-index:new-value (output)

Atribui um novo valor de stream-id a um fluxo de saída. Esta opção deve ser especificada antes do nome do arquivo de saída ao qual se aplica. Quando existem vários arquivos de saída, um streamid pode ser reatribuído a um valor diferente.

Por exemplo, para definir o PID do fluxo 0 como 33 e o PID do fluxo 1 como 36 em um arquivo de saída mpegts:

ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts

-bsf[:stream_specifier] bitstream_filters (input/output,per-stream)

Aplica filtros de bitstream aos fluxos correspondentes. Os filtros são aplicados a cada pacote conforme ele é recebido do demuxer (quando usada como opção de entrada) ou antes de ser enviado ao muxer (quando usada como opção de saída).

bitstream_filters é uma lista separada por vírgulas de especificações de filtro de bitstream, cada uma no formato

filter[=optname0=optval0:optname1=optval1:...]

Qualquer um dos caracteres ’,=:’ que deva fazer parte de um valor de opção precisa ser escapado com uma barra invertida.

Use a opção -bsfs para obter a lista de filtros de bitstream.

Por exemplo:

ffmpeg -bsf:v h264_mp4toannexb -i h264.mp4 -c:v copy -an out.h264

aplica o filtro de bitstream h264_mp4toannexb (que converte um fluxo H.264 encapsulado em MP4 para Annex B) ao fluxo de vídeo de entrada.

Por outro lado,

ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt

aplica o filtro de bitstream mov2textsub (que extrai texto de legendas MOV) ao fluxo de legenda de saída. Observe, porém, que, como os dois exemplos usam -c copy, importa pouco se os filtros são aplicados na entrada ou na saída; isso mudaria se houvesse transcodificação.

-tag[:stream_specifier] codec_tag (input/output,per-stream)

Força uma tag/fourcc para os fluxos correspondentes.

-timecode hh:mm:ssSEPff

Especifica o timecode para gravação. SEP é ’:’ para timecode non-drop e ’;’ (ou ’.’) para drop.

ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg

-filter_complex filtergraph (global)

Define um filtergraph complexo, ou seja, um com um número arbitrário de entradas e/ou saídas. Para grafos simples (aqueles com uma entrada e uma saída do mesmo tipo), consulte as opções -filter. filtergraph é uma descrição do filtergraph, conforme descrito na seção “Filtergraph syntax” do manual do ffmpeg-filters. Esta opção pode ser especificada várias vezes; cada uso cria um novo filtergraph complexo.

As entradas de um filtergraph complexo podem vir de diferentes tipos de origem, distinguidos pelo formato do rótulo de link correspondente:

  • Para conectar um fluxo de entrada, use [file_index:stream_specifier] (ou seja, a mesma sintaxe de -map). Se stream_specifier corresponder a vários fluxos, o primeiro é usado. Em vídeo multivista, o especificador de fluxo pode ser seguido do especificador de vista; consulte a documentação da opção -map para a sintaxe.
  • Para conectar um decoder de loopback, use [dec:dec_idx], em que dec_idx é o índice do decoder de loopback a ser conectado à entrada informada. Em vídeo multivista, o índice do decoder pode ser seguido do especificador de vista; consulte a documentação da opção -map para a sintaxe.
  • Para conectar uma saída de outro filtergraph complexo, use seu rótulo de link. Por exemplo, o exemplo a seguir:
    ffmpeg -i input.mkv \
      -filter_complex '[0:v]scale=size=hd1080,split=outputs=2[for_enc][orig_scaled]' \
      -c:v libx264 -map '[for_enc]' output.mkv \
      -dec 0:0 \
      -filter_complex '[dec:0][orig_scaled]hstack[stacked]' \
      -map '[stacked]' -c:v ffv1 comparison.mkv
    

lê um vídeo de entrada e

* (linha 2) usa um filtergraph complexo com uma entrada e duas saídas para escalar o vídeo para 1920x1080 e duplicar o resultado nas duas saídas; 
* (linha 3) codifica uma das saídas escaladas com `libx264` e grava o resultado em output.mkv; 
* (linha 4) decodifica esse fluxo codificado com um decoder de loopback; 
* (linha 5) coloca a saída do decoder de loopback (ou seja, o vídeo codificado em `libx264`) lado a lado com a entrada original escalada; 
* (linha 6) o vídeo combinado é então codificado sem perdas e gravado em comparison.mkv.

Observe que os dois filtergraphs não podem ser combinados em um só, porque isso criaria um ciclo no pipeline de transcodificação (a saída do filtergraph vai para a codificação, dali para a decodificação e depois volta para o mesmo grafo), e esse tipo de ciclo não é permitido.

Uma entrada sem rótulo é conectada ao primeiro fluxo de entrada não utilizado do tipo correspondente.

Os rótulos de link de saída são referenciados com -map. As saídas sem rótulo são adicionadas ao primeiro arquivo de saída.

Observe que, com esta opção, é possível usar apenas fontes lavfi, sem arquivos de entrada normais.

Por exemplo, para sobrepor uma imagem a um vídeo

ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
'[out]' out.mkv

Aqui, [0:v] se refere ao primeiro fluxo de vídeo do primeiro arquivo de entrada, que é conectado à primeira entrada (main) do filtro overlay. Da mesma forma, o primeiro fluxo de vídeo da segunda entrada é conectado à segunda entrada (overlay) de overlay.

Supondo que haja apenas um fluxo de vídeo em cada arquivo de entrada, os rótulos de entrada podem ser omitidos, de modo que o exemplo acima equivale a

ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map
'[out]' out.mkv

Além disso, o rótulo de saída pode ser omitido, e a única saída do filtergraph é adicionada automaticamente ao arquivo de saída, de modo que basta escrever

ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv

Como exceção especial, é possível usar um fluxo de legenda em bitmap como entrada: ele é convertido em um vídeo do mesmo tamanho que o maior vídeo do arquivo, ou 720x576 se não houver nenhum vídeo presente. Observe que esta é uma solução experimental e temporária. Ela será removida assim que o libavfilter tiver suporte adequado a legendas.

Por exemplo, para embutir (hardcode) legendas sobre uma gravação DVB-T armazenada em formato MPEG-TS, atrasando as legendas em 1 segundo:

ffmpeg -i input.ts -filter_complex \
  '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
  -sn -map '#0x2dc' output.mkv

(0x2d0, 0x2dc e 0x2ef são os PIDs de MPEG-TS do vídeo, do áudio e das legendas, respectivamente; 0:0, 0:3 e 0:7 também funcionariam)

Para gerar 5 segundos de vídeo vermelho puro usando a fonte lavfi color:

ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv

-filter_complex_threads nb_threads (global)

Define quantas threads são usadas para processar um grafo filter_complex. É semelhante a filter_threads, mas usada somente para grafos -filter_complex. O padrão é o número de CPUs disponíveis.

-lavfi filtergraph (global)

Define um filtergraph complexo, ou seja, um com um número arbitrário de entradas e/ou saídas. Equivale a -filter_complex.

-accurate_seek (input)

Esta opção habilita ou desabilita a busca precisa em arquivos de entrada com a opção -ss. Ela é habilitada por padrão, de modo que a busca é precisa ao transcodificar. Use -noaccurate_seek para desabilitá-la, o que pode ser útil, por exemplo, ao copiar alguns fluxos e transcodificar os demais.

-seek_timestamp (input)

Esta opção habilita ou desabilita a busca por marca de tempo em arquivos de entrada com a opção -ss. Ela é desabilitada por padrão. Se habilitada, o argumento da opção -ss é considerado uma marca de tempo real, e não é deslocado pelo tempo de início do arquivo. Isso só importa para arquivos que não começam na marca de tempo 0, como fluxos de transporte.

-thread_queue_size size (input/output)

Na entrada, esta opção define o número máximo de pacotes na fila ao ler do arquivo ou dispositivo. Em fluxos ao vivo de baixa latência / alta taxa, os pacotes podem ser descartados se não forem lidos em tempo hábil; definir este valor pode forçar o ffmpeg a usar uma thread de entrada separada e ler os pacotes assim que chegam. Por padrão, o ffmpeg só faz isso se várias entradas forem especificadas.

Na saída, esta opção especifica o número máximo de pacotes que podem ser enfileirados para cada thread de multiplexação.

-sdp_file file (global)

Grava informações sdp de um fluxo de saída em file. Isso permite despejar informações sdp quando pelo menos uma saída não é um fluxo rtp. (Exige que pelo menos um dos formatos de saída seja rtp).

-discard (input)

Permite descartar fluxos específicos ou quadros de fluxos. Qualquer fluxo de entrada pode ser totalmente descartado usando o valor all, ao passo que o descarte seletivo de quadros de um fluxo ocorre no demuxer e não é compatível com todos os demuxers.

none

Não descarta nenhum quadro.

default

Padrão, que não descarta nenhum quadro.

noref

Descarta todos os quadros que não são de referência.

bidir

Descarta todos os quadros bidirecionais.

nokey

Descarta todos os quadros, exceto os keyframes.

all

Descarta todos os quadros.

-abort_on flags (global)

Interrompe e aborta em várias condições. As flags a seguir estão disponíveis:

empty_output

Nenhum pacote foi passado ao muxer; a saída está vazia.

empty_output_stream

Nenhum pacote foi passado ao muxer em alguns dos fluxos de saída.

-max_error_rate (global)

Define a fração de falhas de decodificação de quadros em todas as entradas a partir da qual o ffmpeg retorna o código de saída 69. Ultrapassar esse limiar não encerra o processamento. O intervalo é um número em ponto flutuante entre 0 e 1. O padrão é 2/3.

-xerror (global)

Interrompe e sai em caso de erro

-max_muxing_queue_size packets (output,per-stream)

Ao transcodificar fluxos de áudio e/ou vídeo, o ffmpeg não começa a gravar na saída até ter um pacote de cada um desses fluxos. Enquanto aguarda isso acontecer, os pacotes dos demais fluxos ficam em buffer. Esta opção define o tamanho desse buffer, em pacotes, para o fluxo de saída correspondente.

O valor padrão desta opção deve ser alto o suficiente para a maioria dos usos, então só altere esta opção se tiver certeza de que precisa dela.

-muxing_queue_data_threshold bytes (output,per-stream)

Este é um limiar mínimo até o qual o tamanho da fila de multiplexação não é levado em conta. O padrão é 50 megabytes por fluxo, e se baseia no tamanho total dos pacotes passados ao muxer.

-auto_conversion_filters (global)

Habilita a inserção automática de filtros de conversão de formato em todos os filtergraphs, inclusive os definidos por -vf, -af, -filter_complex e -lavfi. Se a negociação de formato do filtro exigir uma conversão, a inicialização dos filtros falha. Ainda é possível realizar conversões inserindo o filtro de conversão pertinente (scale, aresample) no grafo. Habilitada por padrão; para desabilitá-la explicitamente, é preciso especificar -noauto_conversion_filters.

-bits_per_raw_sample[:stream_specifier] value (output,per-stream)

Declara que o número de bits por amostra bruta no fluxo de saída informado é value. Observe que esta opção define a informação fornecida ao encoder/muxer; ela não altera o fluxo para que ele se ajuste a esse valor. Definir valores que não correspondam às propriedades do fluxo pode resultar em falhas de codificação ou em arquivos de saída inválidos.

-stats_enc_pre[:stream_specifier] path (output,per-stream) -stats_enc_post[:stream_specifier] path (output,per-stream) -stats_mux_pre[:stream_specifier] path (output,per-stream)

Grava, no arquivo indicado por path, informações de codificação por quadro sobre os fluxos correspondentes.

-stats_enc_pre grava informações sobre quadros brutos de vídeo ou áudio pouco antes de serem enviados para codificação, enquanto -stats_enc_post grava informações sobre pacotes codificados conforme são recebidos do encoder. -stats_mux_pre grava informações sobre pacotes bem no momento em que estão prestes a ser enviados ao muxer. Cada quadro ou pacote gera uma linha no arquivo especificado. O formato dessa linha é controlado por -stats_enc_pre_fmt / -stats_enc_post_fmt / -stats_mux_pre_fmt.

Quando as estatísticas de vários fluxos são gravadas em um único arquivo, as linhas correspondentes a fluxos diferentes ficam intercaladas. A ordem exata dessa intercalação não é especificada, nem há garantia de que permaneça estável entre diferentes execuções do programa, mesmo com as mesmas opções.

-stats_enc_pre_fmt[:stream_specifier] format_spec (output,per-stream) -stats_enc_post_fmt[:stream_specifier] format_spec (output,per-stream) -stats_mux_pre_fmt[:stream_specifier] format_spec (output,per-stream)

Especifica o formato das linhas gravadas com -stats_enc_pre / -stats_enc_post / -stats_mux_pre.

format_spec é uma string que pode conter diretivas no formato {fmt}. format_spec é escapada com barra invertida — use \{, \}, e \\ para gravar na saída um {, } ou \, respectivamente.

As diretivas informadas em fmt podem ser uma das seguintes:

fidx

Índice do arquivo de saída.

sidx

Índice do fluxo de saída dentro do arquivo.

n

Número do quadro. Antes da codificação: número de quadros enviados ao encoder até o momento. Depois da codificação: número de pacotes recebidos do encoder até o momento. Multiplexação: número de pacotes enviados ao muxer para este fluxo até o momento.

ni

Número do quadro de entrada. Índice do quadro de entrada (ou seja, gerado por um decoder) que corresponde a este quadro ou pacote de saída. -1 se não estiver disponível.

tb

Timebase em que as marcas de tempo deste quadro/pacote são expressas, como um número racional num/den. Observe que o encoder e o muxer podem usar timebases diferentes.

tbi

Timebase de ptsi, como um número racional num/den. Disponível quando ptsi está disponível; 0/1 caso contrário.

pts

Marca de tempo de apresentação do quadro ou pacote, como um número inteiro. Deve ser multiplicada pela timebase para calcular o tempo de apresentação.

ptsi

Marca de tempo de apresentação do quadro de entrada (veja ni), como um número inteiro. Deve ser multiplicada por tbi para calcular o tempo de apresentação. É exibida como (2^63 - 1 = 9223372036854775807) quando não está disponível.

t

Tempo de apresentação do quadro ou pacote, como um número decimal. Igual a pts multiplicado por tb.

ti

Tempo de apresentação do quadro de entrada (veja ni), como um número decimal. Igual a ptsi multiplicado por tbi. É exibido como inf quando não está disponível.

dts (packet)

Marca de tempo de decodificação do pacote, como um número inteiro. Deve ser multiplicada pela timebase para calcular o tempo de apresentação.

dt (packet)

Tempo de decodificação do quadro ou pacote, como um número decimal. Igual a dts multiplicado por tb.

sn (frame,audio)

Número de amostras de áudio enviadas ao encoder até o momento.

samp (frame,audio)

Número de amostras de áudio no quadro.

size (packet)

Tamanho do pacote codificado, em bytes.

br (packet)

Taxa de bits atual, em bits por segundo.

abr (packet)

Taxa de bits média de todo o fluxo até o momento, em bits por segundo; -1 se não for possível determiná-la neste ponto.

key (packet)

Caractere ’K’ se o pacote contiver um keyframe; caractere ’N’ caso contrário.

As diretivas marcadas com packet só podem ser usadas com -stats_enc_post_fmt e -stats_mux_pre_fmt.

As diretivas marcadas com frame só podem ser usadas com -stats_enc_pre_fmt.

As diretivas marcadas com audio só podem ser usadas com fluxos de áudio.

As strings de formato padrão são:

pre-encoding

{fidx} {sidx} {n} {t}

post-encoding

{fidx} {sidx} {n} {t}

No futuro, novos itens podem ser adicionados ao final das strings de formatação padrão. Os usuários que dependam de o formato permanecer exatamente igual devem especificá-lo manualmente.

Observe que as estatísticas de fluxos diferentes gravados no mesmo arquivo podem ter formatos diferentes.

5.12 Arquivos de preset

Um arquivo de preset contém uma sequência de pares opção=valor, um por linha, especificando uma sequência de opções que seria incômodo indicar na linha de comando. Linhas que começam com o caractere de hash (’#’) são ignoradas e servem para incluir comentários. Consulte o diretório presets na árvore de código-fonte do FFmpeg para ver exemplos.

Existem dois tipos de arquivos de preset: os arquivos ffpreset e avpreset.

5.12.1 Arquivos ffpreset

Os arquivos ffpreset são especificados com as opções vpre, apre, spre e fpre. A opção fpre recebe como entrada o nome do arquivo do preset em vez de um nome de preset, e pode ser usada com qualquer tipo de codec. Para as opções vpre, apre e spre, as opções especificadas em um arquivo de preset são aplicadas ao codec atualmente selecionado do mesmo tipo que a opção de preset.

O argumento passado às opções de preset vpre, apre e spre identifica o arquivo de preset a ser usado de acordo com as seguintes regras:

Primeiro, o ffmpeg procura um arquivo chamado arg.ffpreset nos diretórios $FFMPEG_DATADIR (se definido), $HOME/.ffmpeg e no datadir definido em tempo de configuração (normalmente PREFIX/share/ffmpeg), ou em uma pasta ffpresets ao lado do executável no win32, nessa ordem. Por exemplo, se o argumento for libvpx-1080p, ele procurará o arquivo libvpx-1080p.ffpreset.

Se esse arquivo não for encontrado, o ffmpeg procurará um arquivo chamado codec_name-arg.ffpreset nos diretórios mencionados acima, onde codec_name é o nome do codec ao qual as opções do arquivo de preset serão aplicadas. Por exemplo, se você selecionar o codec de vídeo com -vcodec libvpx e usar -vpre 1080p, ele procurará o arquivo libvpx-1080p.ffpreset.

5.12.2 Arquivos avpreset

Os arquivos avpreset são especificados com a opção pre. Funcionam de forma semelhante aos arquivos ffpreset, mas só permitem opções específicas do encoder. Portanto, não é possível usar um par opção=valor que especifique um encoder.

Quando a opção pre é especificada, o ffmpeg procurará arquivos com o sufixo .avpreset nos diretórios $AVCONV_DATADIR (se definido), $HOME/.avconv e no datadir definido em tempo de configuração (normalmente PREFIX/share/ffmpeg), nessa ordem.

Primeiro, o ffmpeg procura um arquivo chamado codec_name-arg.avpreset nos diretórios mencionados acima, onde codec_name é o nome do codec ao qual as opções do arquivo de preset serão aplicadas. Por exemplo, se você selecionar o codec de vídeo com -vcodec libvpx e usar -pre 1080p, ele procurará o arquivo libvpx-1080p.avpreset.

Se esse arquivo não for encontrado, o ffmpeg procurará um arquivo chamado arg.avpreset nos mesmos diretórios.

5.13 Formato do arquivo vstats

As opções -vstats e -vstats_file habilitam a geração de um arquivo contendo estatísticas sobre as saídas de vídeo geradas.

A opção -vstats_version controla a versão de formato do arquivo gerado.

Com a versão 1, o formato é:

frame= FRAME q= FRAME_QUALITY PSNR= PSNR f_size= FRAME_SIZE s_size= STREAM_SIZEkB time= TIMESTAMP br= BITRATEkbits/s avg_br= AVERAGE_BITRATEkbits/s

Com a versão 2, o formato é:

out= OUT_FILE_INDEX st= OUT_FILE_STREAM_INDEX frame= FRAME_NUMBER q= FRAME_QUALITYf PSNR= PSNR f_size= FRAME_SIZE s_size= STREAM_SIZEkB time= TIMESTAMP br= BITRATEkbits/s avg_br= AVERAGE_BITRATEkbits/s

O valor correspondente a cada chave é descrito a seguir:

avg_br

taxa de bits média expressa em Kbits/s

br

taxa de bits expressa em Kbits/s

frame

número de quadros codificados

out

índice do arquivo de saída

PSNR

Relação sinal-ruído de pico

q

qualidade do quadro

f_size

tamanho do pacote codificado expresso em número de bytes

s_size

tamanho do fluxo expresso em KiB

st

índice de fluxo do arquivo de saída

time

instante do pacote

type

tipo de imagem

Consulte também as opções -stats_enc para conhecer outra forma de exibir estatísticas de codificação.

6 Exemplos

6.1 Captura de vídeo e áudio

Se você especificar o formato de entrada e o dispositivo, o ffmpeg pode capturar vídeo e áudio diretamente.

ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

Ou com uma fonte de áudio ALSA (entrada mono, id de placa 1) em vez de OSS:

ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg

Observe que você precisa ativar a fonte de vídeo e o canal corretos antes de iniciar o ffmpeg com qualquer visualizador de TV, como o xawtv, de Gerd Knorr. Também é preciso ajustar corretamente os níveis de gravação de áudio com um mixer padrão.

6.2 Captura de X11

Capture a tela do X11 com o ffmpeg da seguinte forma:

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg

0.0 é o número display.screen do seu servidor X11, o mesmo da variável de ambiente DISPLAY.

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg

0.0 é o número display.screen do seu servidor X11, o mesmo da variável de ambiente DISPLAY. 10 é o deslocamento em x e 20 o deslocamento em y para a captura.

6.3 Conversão de formato de arquivo de vídeo e áudio

Qualquer formato de arquivo e protocolo compatível pode servir como entrada para o ffmpeg:

Exemplos:

  • Você pode usar arquivos YUV como entrada:
    ffmpeg -i /tmp/test%d.Y /tmp/out.mpg
    

Isso usará os arquivos:

    /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
    /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...

Os arquivos Y usam o dobro da resolução dos arquivos U e V. São arquivos raw, sem cabeçalho. Podem ser gerados por qualquer decoder de vídeo decente. Você precisa especificar o tamanho da imagem com a opção -s caso o ffmpeg não consiga deduzi-lo.

  • Você pode usar como entrada um arquivo YUV420P raw:
    ffmpeg -i /tmp/test.yuv /tmp/out.avi
    

test.yuv é um arquivo que contém dados raw YUV planares. Cada quadro é composto pelo plano Y seguido pelos planos U e V com metade da resolução vertical e horizontal.

  • Você pode gerar a saída em um arquivo YUV420P raw:

    ffmpeg -i mydivx.avi hugefile.yuv
    
  • Você pode definir vários arquivos de entrada e de saída:

    ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
    

Converte o arquivo de áudio a.wav e o arquivo de vídeo YUV raw a.yuv para o arquivo MPEG a.mpg.

  • Você também pode fazer conversões de áudio e vídeo ao mesmo tempo:
    ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
    

Converte a.wav para áudio MPEG com taxa de amostragem de 22050 Hz.

  • Você pode codificar para vários formatos ao mesmo tempo e definir um mapeamento do fluxo de entrada para os fluxos de saída:
    ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2
    

Converte a.wav para a.mp2 a 64 kbits e para b.mp2 a 128 kbits. ’-map file:index’ especifica qual fluxo de entrada é usado para cada fluxo de saída, na ordem de definição dos fluxos de saída.

  • Você pode transcodificar VOBs decifrados:
    ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi
    

Este é um exemplo típico de ripagem de DVD; a entrada é um arquivo VOB e a saída é um arquivo AVI com vídeo MPEG-4 e áudio MP3. Observe que, neste comando, usamos quadros B para que o fluxo MPEG-4 seja compatível com DivX5, e o tamanho de GOP é 300, o que significa um quadro intra a cada 10 segundos para um vídeo de entrada a 29.97fps. Além disso, o fluxo de áudio é codificado em MP3, portanto é preciso habilitar o suporte a LAME passando --enable-libmp3lame ao configure. O mapeamento é particularmente útil na transcodificação de DVD para obter o idioma de áudio desejado.

NOTA: para ver os formatos de entrada compatíveis, use ffmpeg -demuxers.

  • Você pode extrair imagens de um vídeo, ou criar um vídeo a partir de várias imagens:

Para extrair imagens de um vídeo:

    ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

Isso extrairá um quadro de vídeo por segundo e os gravará em arquivos chamados foo-001.jpeg, foo-002.jpeg etc. As imagens serão redimensionadas para se ajustarem aos novos valores de WxH.

Se você quiser extrair apenas um número limitado de quadros, pode usar o comando acima combinado com a opção -frames:v ou -t, ou combinado com -ss para começar a extração a partir de um determinado ponto no tempo.

Para criar um vídeo a partir de várias imagens:

    ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi

A sintaxe foo-%03d.jpeg especifica o uso de um número decimal composto de três dígitos preenchidos com zeros para expressar o número de sequência. É a mesma sintaxe aceita pela função printf da linguagem C, mas apenas os formatos que aceitam um inteiro normal são adequados.

Ao importar uma sequência de imagens, -i também aceita a expansão interna de padrões de curinga no estilo do shell (globbing), selecionando a opção -pattern_type glob, específica do image2.

Por exemplo, para criar um vídeo a partir de nomes de arquivo que correspondam ao padrão glob foo-*.jpeg:

    ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
  • Você pode colocar vários fluxos do mesmo tipo na saída:
    ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut
    

O arquivo de saída resultante test12.nut conterá os quatro primeiros fluxos dos arquivos de entrada em ordem inversa.

  • Para forçar a saída de vídeo CBR:

    ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
    
  • As quatro opções lmin, lmax, mblmin e mblmax usam unidades ’lambda’, mas você pode usar a constante QP2LAMBDA para converter facilmente a partir de unidades ’q’:

    ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
    

7 Veja também

ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters

8 Autores

Os desenvolvedores do FFmpeg.

Para mais detalhes sobre a autoria, consulte o histórico do Git do projeto (https://git.ffmpeg.org/ffmpeg), por exemplo digitando o comando git log no diretório de código-fonte do FFmpeg, ou navegando pelo repositório online em https://git.ffmpeg.org/ffmpeg.

Os mantenedores dos componentes específicos estão listados no arquivo MAINTAINERS na árvore de código-fonte.

Hospedagem fornecida por telepoint.bg