FPS Ideal para usar

1

Eu tenho um aplicativo de desktop em C # e estou usando o ffmpeg como uma maneira de 'zipar' uma carga de jpegs no PC cliente e carregá-lo em meu servidor e descompactá-lo.

O número de jpegs a compactar em qualquer 1 hora varia. Pode ser dezenas, pode ser centenas.

Eu uso esses argumentos para fazer a compactação:

 -f image2 -r FPS-i  + MyPath + \img%05d.jpg -crf 23  -y -r FPS + oggOutput

e esses argumentos para descompactar:

-i + MySavedPath + " -qscale 1  + SaveTpPath + \img-%05d.jpg

As opções que vejo com quem posso brincar são o crf e o FPS.

Quando eu defino o fps para 10, o número de bytes criados é 3630422. Se eu definir o FPS como 25, o número de bytes criados será 147892.

Se eu definir o FPS para dizer 60, o número de bytes é 70023, mas a qualidade dos jpegs é muito baixa, pois não posso usá-los.

Eu pretendo jogar com essas duas opções para ver o que funciona para mim, mas no caso de haver regras definidas de 'fazer' e 'não' por aí, eu gostaria de ser avisado.

Estou usando a extensão de arquivo ogg para o formato de arquivo de vídeo, pois é uma patente aberta.

    
por Andrew Simpson 28.12.2013 / 09:55

1 resposta

3

Se os JPEGs que estão sendo enviados forem sempre muito semelhantes, então, usando um codec de vídeo, você terá o benefício de um tamanho longo de 'GOP' (grupo de imagens). É onde o codec de vídeo codifica o primeiro quadro a uma taxa de bits relativamente alta e, em seguida, codifica apenas as alterações para o próximo número de quadros, com uma taxa de bits muito menor.

Se os JPEGs que estão sendo enviados forem completamente diferentes, dependendo de como o codec é implementado, ele pode tentar fazer a mesma coisa e acabar codificando uma grande quantidade de diferenças a uma taxa de bits muito baixa, degradando a qualidade da imagem. .

Independentemente da natureza dos JPEGs que estão sendo carregados, adicionar outro estágio de transcodificação (ou dois) irá certamente degradar a qualidade da imagem até certo ponto.

Sobre a questão diretamente:
Eu suspeito que o motivo pelo qual o FPS está afetando a qualidade dos arquivos é devido à configuração da taxa de bits. A taxa de bits é em bytes por segundo , não por frame. Você não especificou (é -b:v ), então ele estará usando uma taxa de bits padrão ou um método VBR, está codificando 10 quadros em x bytes, seu segundo exemplo está tentando compactar 25 quadros no mesmo número de bytes e no seu exemplo final ele está tentando comprimir 60 quadros no mesmo número de bytes, então a qualidade será necessariamente muito menor.

Atenta para otimizar a qualidade da imagem para o tamanho do arquivo ao usar um codec de vídeo: aumente a taxa de bits com base na qualidade desejada e diminua o GOP ( -g ) com base na natureza dos arquivos que você está enviando. Alterar o FPS é uma maneira bastante indireta de afetar esses dois valores, portanto, se você simplesmente deixar o FPS como padrão e ajustar esses outros dois valores, terá um controle muito melhor.

Não responde diretamente à sua pergunta:
Você não obterá as mesmas imagens que você colocou - a compactação de vídeo não permite isso, independentemente de quão alta é a taxa de bits. Se você quiser alguma chance de precisar usar um esquema de compactação sem perdas, e já que eles já estão compactados em JPEG, a compactação de dados normal provavelmente é sua melhor aposta, porque qualquer tentativa de codificar perceptualmente esses arquivos tentará codificar todos os arquivos. Artefatos JPEG (o 'ruído'), bem como a imagem real desejada. Definitivamente valeria a pena tentar um arquivo zip normal (gzip, bzip, 7zip, ...) e ver se isso pode fazer com que o tamanho do arquivo seja baixo o suficiente para suas necessidades. Como alternativa, tente diminuir a qualidade dos arquivos individuais (por exemplo, Image Magick ou similar) e, em seguida, feche-os.

    
por 28.12.2013 / 10:27