Converta um vídeo definindo o tamanho final

2

Existe uma maneira de definir o tamanho final máximo para a conversão de vídeo usando o ffmpeg (ou qualquer outro conversor de vídeo baseado em CLI)?

Como se eu tivesse um vídeo de 100MB e quisesse convertê-lo em um vídeo de 10mb com a melhor qualidade possível , considerar o formato final não é importante.

    
por Asme Just 23.04.2018 / 06:53

2 respostas

6

Passar de 100mb para 10mb é um ligeiramente irrealista queda de 90% no tamanho, mas darei um exemplo de redução para 50mb criando um vídeo H.264, que é um mais razoável < Redução de 50% no tamanho, bem como redução para 40mb usando HEVC.

Estou usando o seguinte arquivo de amostra:

wget http://dl3.h265files.com/TearsOfSteel_720p_h265.mkv

Você pode usar esse arquivo de amostra para confirmar os seguintes resultados que eu dei e talvez experimentar um pouco mais. O MediaInfo revela o seguinte para este arquivo baixado:

mediainfo \
--Inform="General;Duration=%Duration/String3%\nFile size=%FileSize/String1%" \
TearsOfSteel_720p_h265.mkv
Duration=00:12:14.058   <-----
File size=101 MiB       <-----

As setas, claro, são minhas! Você então talvez tenha 2 escolhas realmente boas:

  1. Codificar novamente para H.264
  2. Codificar novamente para HEVC

1. Re-Encode para H.264 (50mb)

O H.264 é amplamente aceito agora e seria uma excelente opção para o seu arquivo de vídeo de saída. A fórmula para calcular a taxa de bits de saída para os 50MB desejados seria então:

(50 MiB * 8192 [converts MiB to kBit]) / 734 seconds = ~558 kBit/s total bitrate
558 - 128 kBit/s (desired audio bitrate) = 430 kBit/s video bitrate

Para isso, use o seguinte comando FFmpeg 2 pass:

ffmpeg -y -i TearsOfSteel_720p_h265.mkv \
      -c:v libx264 -b:v 430k -pass 1 \
      -c:a libmp3lame -b:a 128k -f mp4 /dev/null && \
ffmpeg -i TearsOfSteel_720p_h265.mkv \
       -c:v libx264 -b:v 430k -pass 2 \
       -c:a libmp3lame -b:a 128k TearsOfSteel_smaller.mp4

O tamanho do arquivo resultante é de 49,4 MiB com qualidade de visualização bastante razoável, mas não surpreendente. Muito bom para uma redução de 50% no tamanho do arquivo e uma queda enorme na taxa de bits de vídeo, na verdade!

2. Re-codificar para HEVC (40mb)

Outra opção (como sugerido por emk2203) é recodificar o fluxo HEVC existente com uma taxa de bits menor, desta vez objetivando 40mb, já que HEVC reivindica melhor qualidade a uma taxa de bits menor .

Desta vez, a fórmula seria:

(40 MiB * 8192 [converts MiB to kBit]) / 734 seconds = ~446 kBit/s total bitrate
446 - 128 kBit/s (desired audio bitrate) = 318 kBit/s video bitrate

e a linha de comando do FFmpeg 2 pass é:

ffmpeg -y -i TearsOfSteel_720p_h265.mkv \
      -c:v libx265 -x265-params pass=1 -b:v 318k \
      -c:a libmp3lame -b:a 128k -f mp4 /dev/null && \
ffmpeg -i TearsOfSteel_720p_h265.mkv \
       -c:v libx265 -x265-params pass=2 -b:v 318k \
       -c:a libmp3lame -b:a 128k TearsOfSteel_smaller.mp4

E isso fornece um arquivo de 40 MB com qualidade bastante razoável .

Em conclusão:

A partir desse exemplo, você pode experimentar mais, diminuindo o MiB necessário na fórmula e observando a qualidade de visualização subsequente. Divirta-se!

Referências:

  • Guia de codificação de vídeo H.264: codificação de 2 passos Artigo FFmpeg trac que fornece informações definitivas e de fácil acesso na codificação de 2 passagens para H.264.
  • FFmpeg e Guia de codificação H.265 FFmpeg trac gudelines para codificação para HEVC usando o wrapper x265.
  • FFmpeg e VP9 Encoding Guide Outra opção é codificar o VP9 e todos os detalhes estão neste trac do FFmpeg página. Mais uma vez você está após a seção de codificação de 2 passagens ...
por andrew.46 25.04.2018 / 11:45
1

Sim. Escolha um codec de vídeo (x264 é um bom universal) e escolha a resolução, deixe a maioria das configurações no padrão, mas faça uma conversão de 2 passagens com uma taxa de bits média definida.

A lição rápida sobre compactação de vídeo: a complexidade da vídeo muda ao longo do vídeo, por isso, se você compactar com o mesmo nível de qualidade visual durante todo o processo, a taxa de bits real flutuará para cima e para baixo. Se você compactar para uma taxa de bits fixa, a qualidade será ruim em bits de alta complexidade, porque a taxa de bits é muito baixa e / ou a taxa de bits usada será muito alta para as partes de baixa complexidade. Então, tanto quanto você puder, deixe-o apontar para uma qualidade constante e deixe a taxa de bits flutuar como pode. Mas se o compressor está apontando para um tamanho de arquivo específico, ele não sabe se a complexidade do vídeo vai subir ou descer nas partes que ainda não foram convertidas, e é por isso que as pessoas usam uma conversão de 2 passagens ao apontar para uma tamanho de arquivo específico.

Você precisa especificar a saída como uma taxa de bits (áudio e vídeo, além do contêiner ter uma pequena sobrecarga), então você precisa de uma calculadora para converter do tamanho do arquivo e da duração para uma taxa de bits.

    
por thomasrutter 23.04.2018 / 07:09