FFMPEG / libx264: Como especificar uma taxa de quadros variável, mas com um máximo?


16

Em vez de fornecer uma taxa de quadros fixa ao FFMPEG / libx264 (-r / -framerate), eu gostaria de especificar uma taxa de quadros variável com um valor MÁXIMO e permitir que a libx264 diminua a taxa de quadros como achar melhor. A idéia aqui é obter uma compactação extra quando houver algo como um quadro estático estendido (o que acontece MUITO nos meus vídeos de origem).

Percebo que um quadro MPEG preditivo ou bidirecional se comprimirá muito bem, mas também é possível que a taxa de quadros de origem seja menor do que a que pretendo transcodificar (possivelmente resultando em um fluxo MAIOR!).


1
Onde (ou como) você realmente diz ao x264 para usar o VFR?
slhck

Essa é a minha pergunta.
Mark Gerolimatos

2
Sua pergunta era como especificar o VFR com o máximo . Eu nem sequer estou ciente de alguma maneira de especificar a codificação VFR, usando x264. (Eu também não estou falando sobre ffmpeg, neste ponto, porque é uma outra camada entre sua fonte e x264.)
slhck

@MarkGerolimatos Você encontrou sua resposta ?!
precisa saber é o seguinte

Não, eu nunca fiz.
Mark Gerolimatos

Respostas:


19

Frustrado por você também não ter encontrado uma resposta, eu iria pelo menos responder às perguntas de outras pessoas sobre como habilitar a saída VFR (não V B R) do FFMPEG.

A resposta para isso é a -vsyncopção de nome estranho . Você pode configurá-lo para algumas opções diferentes, mas a que você deseja é '2' ou vfr. Na página do manual:

Parâmetro -vsync
Método de sincronização de vídeo. Por motivos de compatibilidade, valores antigos podem ser especificados como números. Os valores adicionados recentemente terão que ser especificados como strings sempre.

  • 0, passagem

    • Cada quadro é passado com seu registro de data e hora do desmuxador para o muxer.
  • 1, cfr

    • Os quadros serão duplicados e eliminados para atingir exatamente a taxa de quadros constante solicitada.
  • 2, vfr

    • Os quadros são passados ​​com seu carimbo de data / hora ou descartados, para impedir que dois quadros tenham o mesmo carimbo de data / hora.
  • solta

    • Como passagem, mas destrói todos os registros de data e hora, fazendo com que o muxer gere registros de data e hora novos com base na taxa de quadros.
  • -1, automático

    • Escolhe entre 1 e 2, dependendo dos recursos do muxer. Este é o método padrão.

Observe que os carimbos de data e hora podem ser modificados posteriormente pelo muxer, depois disso. Por exemplo, no caso em que a opção de formato Avoid_negative_ts esteja ativada.

Com -map, você pode selecionar de qual fluxo os carimbos de data e hora devem ser obtidos. Você pode deixar o vídeo ou o áudio inalterados e sincronizar o (s) fluxo (s) restante (s) para o fluxo inalterado.

No entanto, não tenho reputação suficiente para postar um comentário, apenas para responder à "sub-pergunta" que todo mundo parece estar tendo. Mas eu tinha algumas idéias sobre as quais não estava honestamente muito otimista ... Mas a primeira que tentei realmente funcionou . Então.

Você só precisa combinar a -vsync 2opção com a -r $maxfpsopção, é claro que substitui $maxfpspela taxa de quadros máxima desejada! E FUNCIONA! Ele não duplica os quadros de um arquivo de origem, mas descarta os quadros que fazem com que o arquivo ultrapasse a taxa de quadros máxima!

Por padrão, parece que, -r $maxfpspor si só, faz com que ele duplique / solte quadros para obter uma taxa de quadros constante e, -vsync 2por si só, faz com que puxe os quadros diretamente, sem realmente afetar os valores de PTS.

Eu não estava otimista sobre isso, porque eu já sabia que o -r $maxfpscoloca em uma taxa de quadros constante. Sinceramente, esperava que um erro ou apenas obedecesse o que viesse primeiro ou por último ou o que quer que seja. O fato de fazer exatamente o que eu queria me deixa bastante satisfeito com os desenvolvedores do FFMPEG.

Espero que isso ajude você, ou alguém mais tarde, se você não precisar mais saber disso.


3
-copytspode ser útil também
rogerdpack 10/10

1

Gostaria de especificar uma taxa de quadros variável com um valor MÁXIMO e permitir que a libx264 diminua a taxa de quadros como achar melhor. A idéia aqui é obter uma compressão extra quando houver algo como um quadro estático estendido

No meu entendimento, isso pode ser possivelmente de uma maneira desajeitada, mas é indesejável por algumas razões complexas e contra-intuitivas

Embora um fluxo x264 tenha uma taxa de quadros, a taxa de quadros é mais um problema no nível de contêiner do que um codec.

Em uma codificação VFR de passagem, haverá o que é essencialmente um arquivo de texto detalhando qual é a taxa de quadros sobre quais quadros / horas e, na codificação de uma fonte, uma função como tcfile-in ou tcfile-out passa os carimbos de data / hora para a codificação , para mapear os locais das taxas e manter o vídeo subjetivamente consistente a partir da origem.

A idéia de baixa taxa de quadros é lógica, mas não funciona por várias razões. Embora o x264 seja compatível com VFR com alguns recursos, não acho que exista uma função de análise que varie a taxa de quadros em relação ao movimento para diminuir o tamanho do arquivo (de maneira análoga aos muitos controles de taxa de bits).

A fonte também é um problema: as fontes VFR, por padrão, mantêm sua variabilidade de quadro, mas aparentemente codificando um arquivo CFR com taxa de bits variável (uma boa idéia, às vezes, especialmente quando é necessário telecine) produzirá simplesmente a mesma CFR.

Isso significa que você provavelmente teria que reescrever a taxa de bits manualmente (ou seja, registros de data e hora de cenas lentas compactadas no arquivo) ou recorrer a um algoritmo de dizimação de quadros como dup, dedup e exactDedup para avisynth . Se o seu vídeo tiver movimento extremamente baixo, alguns quadros (até a metade?) Serão jogados fora. O problema é que esses algoritmos não são avançados e não fazem boas escolhas com imagens da "vida real" sobre o que contribuirá para a melhor codificação.

Além disso, a remoção de quadros que contêm itens como quadros I e B reduz a quantidade de detalhes disponíveis ao longo do tempo, o que faz com que o movimento pareça "escalonado" e pode interferir nos outros parâmetros básicos do vídeo e causar artefatos como alias.

E, devido à maneira como os quantizadores funcionam, o x264 realmente diminui a taxa de bits desproporcionalmente ainda mais nessas cenas de baixo movimento. A menos que você tenha uma apresentação de slides de imagens idênticas, haverá movimento (se apenas granulação e outros artefatos) e haverá uma perda de qualidade que não seria vista sem mudanças drásticas na taxa de bits.

E, finalmente, o motivo de não haver muitas opções para fazer o que você quer é que o x264 seja realmente bom em gerenciar taxas de bits usando a compressão temporal (registrando alterações em quadros parciais). Ir para a taxa de quadros de 1/2 não reduzirá o tamanho do arquivo pela metade; 10% é provavelmente um ganho realista que se espera de um movimento ou animação baixos.

Portanto, diminuir a taxa de bits das cenas estáticas fará muito pouco para o tamanho do arquivo, mas adicionará uma série de problemas de qualidade e sincronização, sem mencionar a incompatibilidade com o software de edição de vídeo.

Se você quiser experimentar um dizimador, poderá limitar a nova taxa de quadros máxima usando as opções de níveis , cada uma das quais com uma resolução e taxa de quadros máximas. Infelizmente, você provavelmente teria que trabalhar em resoluções muito baixas para obter o tipo de taxa de quadros que deseja, usando perfis. Ele volta a editar as taxas manualmente, inteiramente ou para corrigir as taxas de quadros que você considera muito altas. De qualquer maneira, será necessário fazer malabarismos para manter o som sincronizado com as novas taxas de quadros se forem feitas alterações após o processo de codificação, quando o tcfile for conservado.

O ponto principal é que gastar tempo otimizando as diversas configurações de taxa de bits renderá muito mais no gerenciamento do tamanho do arquivo e melhorará a qualidade do seu vídeo, em vez de causar complicações com pouco ganho. Preservar o FPS original é provavelmente a melhor ideia, a menos que você esteja buscando padrões de transmissão ou mídia. Os players são capazes de reproduzir taxas de bits variáveis ​​(diferentemente dos editores) e, quanto mais quadros em seu vídeo, mais suave a reprodução e talvez menor o tamanho do arquivo, devido a alterações menores no movimento entre os quadros.

Aqui está uma coleção de links para informações sobre padrões e discussões no fórum que devem ajudar com esse aspecto confuso da codificação:

- ferramentas de dizimação avisynth

- comutadores fps e -r
- x264 Geral (arquivo tc, fps)
- padrões de arquivo de código de tempo
- Níveis e perfis
- Resumo curto e claro das configurações de CFR / VFR (seção "framerate")

discussões teóricas doom9, videohelp, etc.
1 2 3 4 5 6 7

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.