Batch converte H.265 mkv para H.264 com ffmpeg para tornar os arquivos compatíveis para re-codificação

21

Eu tenho arquivos codificados H.265 que consomem muitos recursos e não funcionam bem e meu software de conversão (mencoder) não suporta (atualmente) o formato H.265. Posso convertê-los para H.264 em um arquivo de lote de linha de comando para converter rapidamente os arquivos para nova compactação usando o Devede / OGMrip? Ao pesquisar este site, não o encontrei discutido, por isso vou postar o que sinto ser uma pergunta útil e responder à pergunta.

    
por TheMegolith 08.12.2015 / 17:08

2 respostas

27

Sim, usando ffmpeg .

Abra um terminal e direcione-o para o diretório que contém os arquivos codificados H.265, supondo que você tenha ffmpeg e as bibliotecas apropriadas instaladas e supondo que estejam no formato MKV, copie e cole o seguinte na janela do terminal.

INPUT=""
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

Lá você tem. Isso irá converter para h.264 em um contêiner MPG no mesmo diretório.

Explicação das opções de comando:

  • for i in *.mkv ; do ... done

    Isso configura todos os arquivos .mkv em um diretório para serem incluídos no processo em lote. Isso pode ser alterado para acomodar a extensão do contêiner dos arquivos que você deseja processar.

  • ffmpeg -i "$i" Executa o programa ffmpeg e solicita que os arquivos sejam processados.

    • -bsf:v ativa o filtro de fluxo de bits de vídeo a ser usado.

    • h264_mp4toannexb - É o filtro de fluxo de bits que está ativado.

      Converta um fluxo de bits H.264 a partir do modo de comprimento prefixado para iniciar o modo de código prefixado (conforme definido no Anexo B da especificação ITU-T H.264).

      Isso é exigido por alguns formatos de streaming, normalmente o formato de fluxo de transporte MPEG-2 ( mpegts ) processando MKV h.264 (atualmente) requer isso, se não estiver incluído, você receberá um erro na janela do terminal instruindo você para usá-lo.

    • -sn interrompe o fluxo de fluxo de legendas (para aqueles que não querem legendas no vídeo) Isso é opcional e pode ser removido.

    • -map 0:0 -map 0:1 Informa ao ffmpeg para processar apenas os dois primeiros fluxos do arquivo ( 0:0 é o fluxo de vídeo, 0:1 é o primeiro fluxo de áudio do arquivo). Isso faz duas coisas, retira o excesso de fluxos de áudio, geralmente o primeiro fluxo de áudio é inglês, mas nem sempre. Outros fluxos, como legendas incorporadas, são removidos reduzindo o tamanho do arquivo. Esta também é uma string opcional. Você pode usar ffprobe para visualizar os fluxos disponíveis no arquivo. -map é opcional e pode ser descartado do comando.

    • -vcodec libx264 Isso diz ao ffmpeg para codificar a saída para H.264

    • "$i.ts" Salva a saída para o formato .ts, isso é útil para não sobrescrever seus arquivos de origem.

  • mv "$i.ts" "$i.mpg" Converte a extensão do arquivo em MPG no mesmo diretório. Isso pode ser configurado para enviá-lo para qualquer diretório que você goste.

  • sleep 3 - permite que o processo descanse, dando tempo ao ffmpeg para enfileirar o próximo arquivo

por TheMegolith 08.12.2015 / 17:09
10

Conversão em lote de H.265 para H.264

Estes exemplos foram escritos para o ffmpeg recente. Poupe algum problema e faça o download de uma versão recente. Em seguida, coloque o binário ffmpeg em ~/bin ou /usr/local/bin (talvez você tenha que efetuar logout, em seguida, faça o login para que ele seja notado).

Saída Matroska

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • Este exemplo será enviado para um diretório chamado h264vids .

  • Este exemplo assume que suas entradas são .mp4 . Caso contrário, altere a instância .mp4 no exemplo para o tipo de arquivo de entrada ou use apenas o greedy * sozinho.

  • Ajuste -crf para qualidade e -preset para velocidade / eficiência de codificação. Ou apenas remova essas opções e use os padrões que são razoavelmente bons e devem ser suficientes para a maioria (o exemplo está usando os valores padrão para essas opções). Veja Wiki FFmpeg: H.264 para mais informações sobre estas opções.

saída MP4

Este é um pouco mais complicado. Isso executará a codificação condicional dependendo se o áudio de entrada for AAC ou não. Se o áudio de entrada for AAC, o áudio será copiado (re-muxed) como está e a recodificação desnecessária será evitada. Se o áudio de entrada for não AAC, ele será recodificado para o AAC.

Aqui está um script simples demonstrando como fazer isso usando ffprobe e ffmpeg . Copie e salve no diretório que contém seus vídeos a serem convertidos, conceda permissão de execução com chmod +x yourscriptname e execute-o com ./yourscriptname .

#!/bin/bash

audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")

mkdir h264vids

for f in *.mkv
do
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • Este exemplo será enviado para um diretório chamado h264vids .

  • Este exemplo assume que suas entradas são .mkv . Caso contrário, altere a instância .mkv no exemplo para o tipo de arquivo de entrada ou use apenas o greedy * sozinho.

  • Veja a nota acima referente a -crf e -preset .

  • Você pode pausar a codificação com ctrl + z e continuar com fg .

por LordNeckbeard 25.09.2017 / 01:20