.png)
Em vez de fornecer uma taxa de quadros fixa para FFMPEG/libx264 (-r/-framerate), gostaria de especificar uma taxa de quadros variável com um valor MÁXIMO e permitir que a libx264 diminua a taxa de quadros conforme achar adequado. A ideia aqui é obter compressão extra quando há algo como um quadro estático estendido (o que aconteceBASTANTEem meus vídeos de origem).
Sei que um quadro MPEG preditivo ou bidirecional será compactado muito bem, mas também é possível que a taxa de quadros de origem seja menor do que aquela para a qual pretendo transcodificar (possivelmente resultando em um fluxo MAIOR!).
Responder1
Frustrado por você também não ter encontrado uma resposta, eu iria pelo menos responder às perguntas de outras pessoas sobre como habilitar o VFR (não o VFR).BR) saída do FFMPEG.
A resposta para isso é a -vsync
opção com nome estranho. Você pode configurá-lo para algumas opções diferentes, mas a que você deseja é '2' ou vfr
. Na página de manual:
-vsync parâmetro
Método de sincronização de vídeo. Por motivos de compatibilidade, os valores antigos podem ser especificados como números. Valores recém-adicionados deverão ser sempre especificados como strings.
0, passagem
- Cada quadro é passado com seu carimbo de data/hora do desmultiplicador 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 transmitidos com seu carimbo de data/hora ou descartados para evitar que 2 quadros tenham o mesmo carimbo de data/hora.
derrubar
- Como passagem, mas destrói todos os carimbos de data/hora, fazendo com que o muxer gere novos carimbos de data/hora com base na taxa de quadros.
-1, automático
- Escolhe entre 1 e 2 dependendo das capacidades 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 formatoevitar_negativo_tsestá ativado.
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) com o(s) inalterado(s).
No entanto, não tenho reputação suficiente para postar um comentário apenas para responder a essa 'subquestão' que todo mundo parece estar tendo. Mas eu tinha algumas ideias sobre as quais, honestamente, não estava muito otimista... Mas a primeira que tentei na verdadetrabalhado. Então.
Você simplesmente precisa combinar a -vsync 2
opção com a -r $maxfps
opção, é claro, onde você substitui $maxfps
pela taxa de quadros máxima desejada! E FUNCIONA! Ele não duplica quadros de um arquivo de origem, mas descarta quadros que fazem com que o arquivo ultrapasse a taxa de quadros máxima!
Por padrão, parece que -r $maxfps
por si só faz com que ele duplique/descarte quadros para atingir uma taxa de quadros constante, e -vsync 2
por si só faz com que ele puxe os quadros diretamente sem realmente afetar os valores de PTS.
Eu não estava otimista quanto a isso porque já sabia que isso -r $maxfps
o colocava em uma taxa de quadros constante. Sinceramente, esperava um erro ou apenas obedecer ao que viesse primeiro ou por último ou o que quer que fosse. O fato de fazer exatamente o que eu queria me deixa bastante satisfeito com os desenvolvedores do FFMPEG.
Espero que isso ajude você ou outra pessoa mais tarde, se você não precisar mais saber disso.
Responder2
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 conforme achar adequado. A idéia aqui é obter compactação extra quando há algo como um quadro estático estendido
No meu entendimento, isso pode ser possível de uma forma comparativamente desajeitada, mas é indesejável por algumas razões complexas e contra-intuitivas
Mesmo que um fluxo x264 tenha uma taxa de quadros, a taxa de quadros é mais um problema de nível de contêiner do que de codec.
Em uma codificação VFR de passagem, haverá o que é essencialmente um arquivo de texto detalhando qual é a taxa de quadros em quais quadros/tempos e, na codificação de uma fonte, uma função como tcfile-in ou tcfile-out passa os carimbos de data e hora para a codificação , para mapear os locais das taxas e manter o vídeo subjetivamente consistente desde a fonte.
A ideia de baixa taxa de quadros é lógica, mas não funciona por vários motivos. 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 uma forma análoga aos muitos controles de taxa de bits).
A fonte também é um problema: as fontes VFR, por padrão, retêm sua variabilidade de quadro, mas aparentemente codificar um arquivo CFR com taxa de bits variável (às vezes uma boa ideia, especialmente quando o telecine é necessário) simplesmente produzirá o mesmo CFR.
Isso significa que você provavelmente teria que reescrever a taxa de bits manualmente (ou seja, carimbos de data e hora de cenas lentas mixadas no arquivo) ou recorrer a umalgoritmo de dizimação de quadros como dup, dedup e exactDedup para avisynth. Se o seu vídeo tiver movimento extremamente baixo, alguns quadros (mesmo a metade?) Serão descartados. 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 em outros parâmetros básicos de vídeo e causar artefatos como aliasing.
E devido à forma como os quantizadores funcionam, o x264 diminuirá desproporcionalmente ainda mais a taxa de bits nessas cenas de baixo movimento. A menos que você tenha uma apresentação de slides de imagens idênticas, haverá movimento (mesmo que 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, a razão pela qual não há muitas opções para fazer o que você deseja é que o x264 é realmente bom no gerenciamento da taxa de bits apenas usando compactação temporal (gravando alterações em quadros parciais). Ir para 1/2 taxa de quadros não reduzirá o tamanho do arquivo pela metade; 10% é provavelmente um ganho realista esperado de baixo movimento ou animação.
Resumindo, diminuir a taxa de bits de suas cenas estáticas afetará muito pouco o tamanho do arquivo, mas adicionará uma série de problemas de qualidade e sincronização, sem mencionar a incompatibilidade com software de edição de vídeo.
Se você quiser experimentar um dizimador, poderá limitar a nova taxa máxima de quadros usando oopções de níveis, cada um dos quais apresenta uma resolução e taxa de quadros máximas. Infelizmente, você provavelmente teria que trabalhar com resoluções muito baixas para obter o tipo de taxa de quadros desejada, usando perfis. Tudo se resume a editar as taxas manualmente, seja inteiramente ou para corrigir as taxas de quadros que você considera muito altas. De qualquer forma, será necessário fazer malabarismos para manter o som sincronizado com as novas taxas de quadros se alterações forem feitas após o processo de codificação quando o arquivo tc for conservado.
A conclusão é 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ê pretenda padrões de transmissão ou mídia. Os players são bem projetados para lidar com taxas de bits variadas (ao contrário dos NLEs) — e quanto mais quadros no seu vídeo, mais suave será a reprodução e talvez menor será o tamanho do arquivo, devido a menores mudanças no movimento entre os quadros.
Aqui está uma coleção de links para informações sobre padrões e discussões em fóruns que devem ajudar com esse aspecto confuso da codificação:
-ferramentas de dizimação avisynth
-interruptores fps e -r
-x264 Geral (tcfile, fps)
-padrões de arquivo timecode
-Níveis e perfis
-Resumo curto e claro da configuração CFR/VFR (seção "framerate")
Responder3
Solução perfeita: reduza quadros muito semelhantes repetidos e salve a saída em taxa de quadros variável (pico)
- Para conteúdo com cenas estáticas longas, a eliminação de quadros duplicados pode reduzir a taxa de quadros de forma dinâmica e significativamente baixa para obter maior redução do tamanho do arquivo do que o codec e sua compactação intra-quadro podem alcançar!
- No meu exemplo:
- Tamanho de arquivo mezanino 100% original a 60 FPS
- 15% CR28 a uma taxa de quadros constante de 60 FPS
- 6% CR28 com taxa de quadros de pico de 60 FPS (quase um fator de 3x!)
Original disponível
ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 screen-recording-vfr.mp4
Transcodifique vídeo já compactado para taxa de quadros dinâmica sem recodificação
ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated-without-reencoding.mp4
Em detalhe
Original disponível
ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 "screen-recording-vfr.mp4"
-i video-mezzanine.mov Original or your high quality rendered export as the input file.
-movflags faststart Streaming ready by putting the moov atom to the file start.
-c:v libx264 H-264 codec
-vf mpdecimate Drop frames not differing greatly from previous frame to reduce frame rate.
-vsync vfr Output as variable frame rate (vfr)! Necessary sister option to 'mpdecimate'.
- To maintain the playback speed while benefitting from the file size reduction.
-r 30 If you specify -r then in this combo it serves as the peak framerate!
I recommend to omit this option:
- Then the peak framerate IS the peak/constant rate of the source.
- Which preserves dynamic scenes fully and compresses long still sequences.
- So the best of both aspects.
- State a peak FPS if loosing FPS in dynamic scenes
is acceptable for the reduction in file size.
-crf 24 - Constant Rate Factor (constant quality at variable bitrate)
-preset veryslow - Quality effort put into the encoding
screen-recording-vfr.mp4 - Output file
Converta vídeo já exportado em taxa de quadros dinâmica sem recodificação
ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated.mp4
Esta é uma operação sem perdas. Nenhuma recodificação com perdas acontece, apenas reembalagem/referenciação.
Ele eliminará tantos quadros duplicados quanto possível!
Exemplo:
Apresentação de slides de apenas 3 imagens estáticas sem transições * cada uma com duração de 5 segundos * a 50 FPS = 750 quadros
ffmpeg
irá reduzi-lo para apenas 3 quadros a 1/5 (=0,2) FPS! Confirmado com mediainfo!
Análise e Aprendizados
- Vídeos com cenas longas de imagens estáticas podem ter a quantidade de quadros e o tamanho do arquivo significativamente reduzidos!
- Para ambos os cenários
- A codificação do arquivo mezanino no mesmo CFR mantém a qualidade visual
- Mas a redução do tamanho do arquivo de taxa de quadros constante para variável é de 15% a 6%.
- A redução da taxa de quadros sem recodificação traz menos redução no tamanho do arquivo, mas ainda assim:
- Traz redução do tamanho do arquivo (15% a 10%)
- A codificação do arquivo mezanino no mesmo CFR mantém a qualidade visual
screen-recording.mov
- Frame rate mode: Variable
- Frame rate: 58.628 FPS
- Minimum frame rate: 30.000 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 732 100 %
- Size: 1675084 bytes 100 %
screen-recording CR24 fps 60.mp4
- Frame rate mode: Constant
- Frame rate: 60.000 FPS
- Frame count: 750 102 %
- Size: 255863 bytes 15 %
screen-recording CR24 mpdecimated vfr.mp4
- Frame rate mode: Variable
- Frame rate: 17.398 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 214 29 %
- Size: 101860 bytes 6 %
screen-recording CR24 mpdecimated fps 30 max.mp4
- Frame rate mode: Variable
- Frame rate: 11.078 FPS
- Minimum frame rate: 1.154 FPS
- Maximum frame rate: 30.000 FPS
- Frame count: 137 17 %
- Size: 94382 bytes 5.6
screen-recording CR24 mpdecimated vfr without re-encoding faststart.mp4
- Frame rate mode: Variable
- Frame rate: 19.974 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 247 33 %
- Size: 165 KB (164947 bytes) 10 %