Como posso determinar se um vídeo pode ser codificado com sucesso com a codificação HEVC (x265)?

3

Estou testando a conversão de alguns vídeos para a codificação HEVC utilizando ffmpeg e libx265 e descobri que a largura de entrada deve ser divisível por 8 para poder recodificar com êxito. Gostaria de determinar se um recodificador será bem-sucedido sem tentar a codificação e, em seguida, examinando a saída. Idealmente, gostaria de fazer isso em um script bash. Minhas habilidades são um pouco limitadas a esse respeito e muito do que eu inventei até agora é muito menos que elegante.

Por exemplo, sei que posso fazer as contas com bc, como em:

 echo 'scale=2;576/8' | bc
72.00

e eu posso obter a largura via

width=$(mediainfo $filename | grep "Width" | sed 's/[^0-9]*//g')

mas o primeiro não responde exatamente a pergunta: a largura é divisível por 8 e o último é feio e usa muitos canos que a pesquisa indica ser menos eficiente.

Eu tenho a linha de comando do ffmpeg para recodificação classificada para minha satisfação usando:

ffmpeg -i "$f" -c:a copy -c:v libx265 -preset "$preset" -crf 25 "$target"

e pretendo redimensionar o vídeo para uma largura divisível por 8, se ainda não o é, mas estou procurando soluções melhores do que as que tenho até agora para determinar se a escala é necessária e como determinar a largura mais próxima divisível por 8 para dimensionar para.

    
por Elder Geek 30.03.2016 / 21:45

2 respostas

1

O seguinte corrigirá a largura para um número divisível por 8 e então redimensionará a altura para um número divisível por 8, mantendo proporção correta:

ffmpeg -i <input> \
       -c:a copy \
       -c:v libx265 -preset medium -x265-params crf=28 \
       -vf scale="trunc(iw/8)*8:-8" \
       <output>

Como um bônus, se a largura já é divisível por 8, não haverá alteração na largura de saída e nenhum erro do FFmpeg.

Uma explicação para a sintaxe da escala, lembrando que a sintaxe é -vf scale=width:height :

1. Cálculo da largura de saída:

  • iw/8 : A largura do fluxo de vídeo de entrada será dividida por 8. Portanto, uma largura original de 690 criaria um número 86,25
  • trunc : o número 86.25 seria 'truncado' para 86
  • *8 : 86 seria multiplicado por 8 para dar uma largura final de 688 que, claro, é divisível por 8!

2. Cálculo da altura de saída:

  • -8 : FFmpeg calculará uma altura que é divisível por 8, mas que também mantém a proporção correta do arquivo original

Em um mundo perfeito, a codificação hevc é executada com unidades de codificação de 8x8, 16x16, 32x32 etc e essa sintaxe garante isso. Mais detalhes sobre este aqui ...

Referências:

por andrew.46 30.03.2016 / 22:55
1

A obtenção da largura é relativamente simples com mediainfo . Se você não tem, você pode instalá-lo com sudo apt-get install mediainfo

width=$(mediainfo '--Inform=Video;%Width%' $filename)

Determinar a divisibilidade por 8 pode ser feito via

if [ $(( $width % 8 )) -eq 0 ] ; then
   echo "Your number is divisible by 8 – you may convert it"
else
   echo "Video width is not divisible by 8 – it needs scaling to re-encode it."
fi

Uma abordagem muito mais simples e rápida inspirada em @ andrew.46 e um pouco mais de pesquisa e teste é deixar o ffmpeg fazer o trabalho com

ffmpeg -i $inputfilename -c:a copy -c:v libx265 -preset veryfast -x265-params crf=25 -vf scale=-8:ih $outputfilename

A configuração -vf scale=-8:ih garante que a largura seja divisível por 8 (-8) e usa a altura de entrada (ih) de acordo para manter a proporção.

Fontes: man mediainfo

link

link

Como posso determinar se um vídeo pode ser codificado com sucesso com a codificação HEVC (x265)

link

    
por Elder Geek 30.03.2016 / 21:45