Reencodificação de biblioteca de vídeo em x265 (HEVC) sem perda de qualidade

30

Estou tentando converter minha biblioteca de vídeos no formato HEVC para ganhar espaço. Eu executei o seguinte comando em todos os arquivos de vídeo da minha biblioteca:

#!/bin/bash
for i in *.mp4;
do 
    #Output new files by prepending "X265" to the names
    avconv -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

Agora, a maioria dos vídeos é boa e a qualidade é a mesma de antes. No entanto, alguns vídeos de alta qualidade (por exemplo, uma impressão de filme de 5 GB) perdem qualidade - o vídeo é todo pixelizado.

Não sei o que fazer neste caso. Preciso modificar o parâmetro crf na minha linha de comando? Ou algo mais?

O problema é que estou fazendo uma conversão em massa. Então, eu preciso de um método em que avconv ajuste automaticamente qualquer parâmetro que precise de ajuste, para cada vídeo.

UPDATE-1

Descobri que crf é o botão que preciso ajustar. O CRF padrão é 28. Para melhor qualidade, eu poderia usar algo menor que 28. Por exemplo:

avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4

No entanto, o problema é que, para alguns vídeos, o valor CRF de 28 é bom o suficiente, enquanto que para alguns vídeos, é necessário um CRF mais baixo. Isso é algo que preciso verificar manualmente convertendo pequenas seções dos grandes vídeos. Mas na conversão em massa, como eu verificaria cada vídeo manualmente? É de alguma forma que avconv pode ajustar o CRF de acordo com o vídeo de entrada de forma inteligente?

UPDATE-2

Descobri que existe uma opção --lossless em x265: link .

No entanto, não sei como usá-lo corretamente. Eu tentei usá-lo da seguinte maneira, mas ele produziu resultados opostos (o vídeo ficou ainda mais pixelizado):

avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4

Editar: Corrigido um erro de digitação na linha anterior, isso ocorre porque o editor não permite edições com menos de 6 caracteres.

    
por shivams 20.09.2015 / 04:26

3 respostas

47

De minha própria experiência, se você não quer absolutamente nenhuma perda de qualidade, - sem dúvida é o que você está procurando.

Não tenho certeza sobre avconv , mas o comando que você digitou parece idêntico ao que eu faço com FFmpeg . Em FFmpeg você pode passar o parâmetro assim:

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv

A maioria dos x265 switches (opções sem valor) podem ser especificados assim (exceto aqueles somente para CLI, aqueles que são usados apenas com x265 binary diretamente).

Com isso fora do caminho, gostaria de compartilhar minha experiência com a codificação x265 . Para a maioria dos vídeos (seja WMV, MPEG ou AVC / H.264) eu uso crf=23 . x265 decide o resto dos parâmetros e normalmente faz um bom trabalho.

No entanto, muitas vezes, antes de me comprometer a transcodificar um vídeo em sua totalidade, eu testo minhas configurações convertendo uma pequena parte do vídeo em questão. Aqui está um exemplo, suponha que um arquivo mkv com fluxo 0 sendo vídeo, fluxo 1 sendo áudio DTS e fluxo 2 sendo um subtítulo:

ffmpeg -hide_banner \
-ss 0 \
-i "INPUT.mkv" \
-attach "COVER.jpg" \
-map_metadata 0 \
-map_chapters 0 \
-metadata title="TITLE" \
-map 0:0 -metadata:s:v:0 language=eng \
-map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \
-map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \
-c:v libx265 -preset ultrafast -x265-params \
crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \
-c:a copy \
-c:s copy \
-t 120 \
"OUTPUT.HEVC.DTS.Sample.mkv"

Note que as barras invertidas interrompem as quebras de linha em um comando longo, eu o faço para me ajudar a rastrear vários bits de uma entrada CLI complexa. Antes de explicá-lo linha por linha, a parte em que você converte apenas uma pequena parte de um vídeo é a segunda linha e a segunda última linha: -ss 0 significa procurar 0 segundo antes de começar a decodificar a entrada e -t 120 significa parar de gravar na saída após 120 segundos. Você também pode usar formatos de hora hh: mm: ss ou hh: mm: ss.sss.

Agora, linha por linha:

  1. -hide_banner impede que FFmpeg mostre informações de compilação no início. Eu só não quero ver quando eu rola no console;
  2. -ss 0 procura 0 segundo antes de iniciar a decodificação da entrada. Note que se este parâmetro é dado após o arquivo de entrada e antes do arquivo de saída, ele se torna uma opção de saída e diz ffmpeg para decodificar e ignore a entrada até x segundos e, em seguida, comece a gravar na saída. Como uma opção de entrada, ela é menos precisa (porque a busca não é precisa na maioria dos formatos de contêiner), mas quase não leva tempo. Como uma opção de saída, ela é muito precisa, mas leva um tempo considerável para decodificar todo o fluxo antes do tempo especificado e, para fins de teste, você não quer perder tempo;
  3. -i "INPUT.mkv" : especifique o arquivo de entrada;
  4. -attach "COVER.jpg" : anexa uma capa (imagem em miniatura, pôster, qualquer que seja) à saída. A arte da capa é geralmente mostrada em exploradores de arquivos;
  5. -map_metadata 0 : Copie todos os metadados da entrada 0, que no exemplo é apenas a entrada;
  6. -map_chapters 0 : Copiar informações do capítulo (se presentes) da entrada 0;
  7. -metadata title="TITLE" : defina o título do vídeo;
  8. -map 0:0 ... : Mapeia o fluxo 0 da entrada 0, o que significa que queremos que o primeiro fluxo da entrada seja gravado na saída. Como esse fluxo é um fluxo de vídeo, ele é o primeiro fluxo de vídeo na saída , portanto, o especificador de fluxo :s:v:0 . Defina sua tag de idioma para inglês;
  9. -map 0:1 ... : Similar à linha 8, mapeie o segundo fluxo (áudio DTS) e defina seu idioma e título (para facilitar a identificação ao escolher jogadores);
  10. -map 0:2 ... : semelhante à linha 9, exceto que este fluxo é uma legenda;
  11. -metadata:s:t:0 ... : define metadados para a capa. Isso é necessário para o formato de contêiner mkv;
  12. -c:v libx265 ... : opções de codecs de vídeo. É tão longo que eu quebrei em duas linhas. Essa configuração é boa para vídeo bluray de alta qualidade (1080p) com faixas mínimas no gradiente (com um consumo de x265). É provavelmente um exagero para DVDs e programas de TV e vídeos de telefone. Essa configuração é principalmente roubada de esta postagem do Doom9 ;
  13. crf=22:... : Continuação dos parâmetros do codec de vídeo. Veja a postagem no fórum mencionada acima;
  14. -c:a copy : copie o áudio;
  15. -c:s copy : copiar legendas;
  16. -t 120 : Pare de gravar na saída após 120 segundos, o que nos dá um clipe de 2 minutos para visualizar a qualidade de trance;
  17. "OUTPUT.HEVC.DTS.Sample.mkv" : nome do arquivo de saída. Marcar meus nomes de arquivo com o codec de vídeo e o codec de áudio principal.

Uau. Esta é a minha primeira resposta, por isso, se houver algo que eu tenha perdido, por favor deixe um comentário. Eu não sou um especialista em produção de vídeo, sou apenas um cara com preguiça de assistir a um filme colocando o disco no player.

PS. Talvez essa questão pertença a outro lugar, pois não está strongmente relacionada ao Unix & Linux.

    
por 11.12.2015 / 06:28
5

Recentemente, passei pelo problema de transcodificar todo o meu catálogo de vídeos para o HEVC. Eu uso o link com as seguintes configurações.

h265ize -v -m medium -q 20 -x --no-sao --aq-mode 3 --dete --stats

-v - Saída detalhada -m medium - Velocidade de codificação média (menor qualidade mais alta, qualquer coisa mais lenta que eu ache que não vale a pena o tempo / qualidade dif)
-q 20 - o CRF usado, 20 é semelhante a 18 ou mais em x264, mas hey. Isso é para conteúdo de 1080p (90% da minha TV) Eu costumo usar 22 para meus filmes em 4K
-x - Use comandos definidos x265 centrais - no-sao desativa o Deslocamento Adaptativo de Amostra (melhora a velocidade de codificação)
- modo aq-3 - usa Quantificação Adaptável com variância automática, ajuda codifica 8 bits, especialmente em áreas escuras, pára a maioria das faixas que podem acontecer (embora às custas do tempo de codificação)
- delete - substitua o arquivo de codificação pelo arquivo codificado (teste antes de usar este)
- estatísticas - Escreva estatísticas para um arquivo csv na raiz do caminho do qual você correu.

As velocidades de codificação são em torno de 30fps (para a maioria das coisas de 1080p) no meu equipamento. Dual Xeon E5 2687W v2, mas forço o processo FFMPEG a não usar o primeiro lado de um dos processadores (é o meu servidor Plex, então tenho que ter certeza de que haverá transcrições se necessário na reprodução, etc.)

Sim, demorou um tempo para converter a maior parte dele, e agora tenho uma tarefa agendada que é executada duas vezes por dia para codificar as coisas daquele dia para x265.

As economias de espaço foram enormes. Minha SAN inicial estava em uso 20Tb, agora é em torno de 12, mas, obviamente, foi adicionado também com mais 6 meses de conteúdo.

Eu comecei a transcodificar todos os meus filmes também, no entanto, é um processo contínuo, já que tenho que identificar os níveis de qualidade (o Radarr felizmente rotula bem) e usar uma das três configurações de transcodificação:

-m slower -q 18 -x --no-sao --aq-mode 3 para transcodificações de 720p em -m medium -q 20 -x --no-sao --aq-mode 3 para 1080p em -m medium -q 22 -x --no-sao para 2160p

Espero que ajude algumas pessoas. Grite se alguém precisar de uma mão para configurar tudo. E antes de codificar tudo para x265, pense em playback, se o cliente não suporta nativa x265, então a transcade pode ser cara em termos de CPU e Qualidade.

    
por 08.11.2017 / 15:36
1

A sintaxe correta para ativar o modo sem perdas para o codificador x265 no ffmpeg é -x265-params lossless=1 (você precisa anexar =1 ).

No entanto, para codificação sem perdas, há melhores opções de codecs. Eu encontrei testando que FFV1 comprime muito melhor (tamanho do arquivo = ~ 80% de x265) pelo menos em alguns tipos vídeo (se as melhores configurações forem escolhidas para os dois codecs). E também funciona mais rápido e (AFAIK) não é sobrecarregado por patentes. Ou seja, é superior ao H.265 sem perda em todos os aspectos para arquivamento de vídeo.

    
por 31.03.2018 / 23:13