Otimize o tamanho do arquivo de vídeo sem perda de qualidade

5

Existe uma maneira simples (na linha de comando - eu quero escrever um script que comprime todos os vídeos em uma pasta) para reduzir o tamanho do arquivo de um vídeo (quase) sem perda de qualidade? Existe um método que funciona igualmente bem para diferentes formatos de vídeo (mp4, flv, m4v, mpg, mov, avi)?

Devo mencionar que a maioria dos vídeos que eu gostaria de compactar são vídeos baixados da web (mp4, flv), então não está claro se há muito espaço para mais compressão.

    
por student 08.03.2011 / 11:37

2 respostas

3

Na terra mística do PNG, o modo mais eficaz de próximo - a compactação sem perda é compactar a imagem com quase todas as combinações possíveis de configurações e comparar a saída. Isso é o que aplicativos como pngcrush fazem.

Não há razão para que um processo semelhante não funcione no papel. Na prática, existem alguns problemas:

  • A compactação de vídeo uma vez já é um processo muito mais longo do que a codificação de uma imagem PNG.
  • Existem cerca de 1000 vezes mais combinações de configurações.
  • Esses dois conspiram para tornar o processo exponencialmente mais longo por vários poderes.
  • Também usaria uma quantidade irracional de espaço em disco, memória e tempo de CPU.
  • Os quadros se mesclam se houver uma alteração na taxa de quadros e obviamente mudam se você alterar o tamanho ou o recorte do quadro, tornando o processo de comparação ainda mais difícil

Para completar, você está lidando com conteúdo que já está envenenado com artefatos e codificação de lodo. Minha resposta simples para "Existe uma maneira simples" tem que ser Não.

Mas se você tiver um monte de vídeos de baixa compactação como o FLV (uma compactação bastante ruim na minha experiência com o formato), pode valer a pena ir com ffmpeg ou mencoder para os FLVs. Algo como isso pode funcionar:

find -iname '*.flv' -exec \
    mencoder {} -o {}.recomp.avi -ovc x264 -x264encopts threads=9:bitrate=400 -oac mp3lame -lameopts abr:br=52 \;

Mas haverá perda. Você apenas tem que julgar o quanto é aceitável.

    
por Oli 08.03.2011 / 16:14
1

Você também pode realizar isso com o avconv com base em avconv -i <sourcefile> -c:v libx264 -crf 23 output.mp4 você pode ajustar a qualidade para cima reduzindo o fator crf (23 no exemplo) e ajustando para baixo aumentando-a.

Você pode definir os valores entre 0 e 51, em que valores mais baixos resultariam em melhor qualidade (à custa de tamanhos de arquivo maiores). Os valores são entre 18 e 28. O padrão para x264 é 23, então você pode usar isso como ponto de partida.

Um script que deve permitir que você mude para um formato diferente sem perda de qualidade (mas pouca ou nenhuma redução no tamanho seria

#!/bin/bash
echo "This script will attempt to copy the video and audio streams of all non-mkv files in the current directory to a mkv video container of the same name as the sources without overwriting."
read -p "Press any key to continue or CTRL-C to cancel"

for f in *.* 
    do
    name=$(echo "$f" | sed 's/\.[^\.]*$//')
    ext=$(echo "$f" | sed 's/^.*\.//')
    echo "$f is made up of the base $name and ends with $ext"
    target="$name.mkv"
    echo target = $target
        if  [ "$f" = "$target" ];
        then
            echo "$f=$target skipping overwrite"
        else 
            avconv -i "$f" -c:a copy -c:v copy "$name.mkv"
        fi
    done

Observe que os codecs de áudio e vídeo em uso neste script são copy , portanto, não deve ocorrer recodificação. Qualquer economia em tamanho será mínima e será apenas o resultado de um contêiner mais eficiente do que o usado anteriormente. Para obter uma redução no tamanho, é necessário recodificar e você precisará ajustar o script substituindo c:v copy por -c:v libx264 -crf 23 (ajustando o valor de -crf às suas necessidades, conforme mencionado acima). Sinta-se à vontade para comentar ou remover qualquer linha de eco supérflua.

Nota: Os formatos que você menciona "mp4, flv, m4v, mpg, mov, avi" são contêineres e têm pouca ou nenhuma importância nos codecs usados para codificar os fluxos dentro deles. Uma discussão sobre recodificação para redução de tamanho exigiria conhecimento dos codecs contidos nos contêineres e teria que ser avaliada caso a caso.

Fontes: teste e link

    
por Elder Geek 17.11.2015 / 19:23