Pergunta

Eu quero ser capaz de efetuar o FFMPEG processos porque eu estou tentando descobrir quanto tempo um minuto de vídeo para converter para ajudar com o planejamento de capacidade do meu codificação de vídeo de servidor.Como faço para habilitar o log e onde está o arquivo de log salvos.Eu tenho o FFMPEG instalado em um CentOS LÂMPADA máquina.

Foi útil?

Solução

O FFMPEG não escreve para um arquivo de log específico, mas envia sua saída para erro padrão. Para capturar isso, você precisa

  • capture e analisá -lo como é gerado
  • Redirecionar o erro padrão para um arquivo e ler que depois o processo é concluído

Exemplo para redirecionamento por erro de std:

ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt

Depois que o processo for feito, você pode inspecionar out.txt.

É um pouco mais complicado fazer a primeira opção, mas é possível. (Eu mesmo fiz isso. Então, faça os outros. Dê uma olhada em volta e a rede para obter detalhes.)

Outras dicas

Encontrei as coisas abaixo nos documentos do FFMPEG. Espero que isto ajude! :)

Referência: http://ffmpeg.org/ffmpeg.html#toc-generic-options

'-Report' DUMP LINHA COMMANHO FULL e saída de console para um arquivo chamado Programa-yyyymmdd-hhmms.log no diretório atual. Este arquivo pode ser útil para relatórios de bugs. Também implica -Loglevel verbose.

NOTA: Definir a variável de ambiente Ffreport para qualquer valor tem o mesmo efeito.

Eu encontro a resposta. 1/Primeiro colocado nas predefinições, tenho este exemplo "Formato de saída MPEG2 DVD HQ"

-vcodec mpeg2video -vstats_file MFRfile.txt -r 29.97 -s 352x480 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2

Se você deseja um relatório inclui os comandos -vstats_file mfrfile.txt nas predefinições como o exemplo. Isso pode fazer um relatório que é ubicadet na fonte da pasta da sua fonte de arquivo. Você pode colocar qualquer nome, se quiser, resolvi meu problema "Escrevo muitas vezes neste fórum" lendo um .docx completo sobre as propriedades do MPEG. Finalmente, posso fazer minha barra de progresso lendo este arquivo txt gerado.

Cumprimentos.

Parece que se você adicionar isso à linha de comando:

 -loglevel debug

ou

 -loglevel verbose

Você obtém mais saída de depuração detalhada na linha de comando.

ffmpeg logs para stderr, e pode fazer o log para um arquivo com um diferente nível de log de stderr.O -report opção de linha de comando não dar-lhe o controle, o nome do arquivo de log ou o nível de log, assim, definir a variável de ambiente é preferível.

(-v é um sinônimo para -loglevel.Executar ffmpeg -v help para ver os níveis.Executar ffmpeg -h full | less para ver TUDO.Ou consultar a documentos on-line, ou suas páginas de wiki como h.264 guia de codificar).

#!/bin/bash

of=out.mkv
FFREPORT="level=32:file=$of.log" ffmpeg -v verbose   -i src.mp4 -c:a copy -preset slower -c:v libx264 -crf 21 "$of"

Que trancode src.mp4 com o x264, e definir o nível de log para stderr para "verbose", e o nível de log para out.mkv.log "status".

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40, etc.).Suporte para isso foi adicionado há 2 anos atrás, você precisa de um não-antiga versão do ffmpeg.(É sempre uma boa idéia de qualquer forma, para a segurança / correções de bugs e aumentos de velocidade)


Alguns codecs, assim como -c:v libx265, escreva diretamente para stderr em vez de usar o ffmpeg é o registo de infra-estrutura. Assim, suas mensagens de log não acabar no arquivo de relatório.Eu suponho que este é um bug / TODO-item de lista.

Para log stderr, enquanto ainda vê-lo em um terminal, você pode usar tee(1).


Se você usar um nível de log que inclui a linha de status atualizações (o padrão -v info, ou superior), eles serão incluídos no arquivo de log, separados com ^M (retorno de carro aka \r).Não há nenhum nível de log que inclui codificador de estatísticas (como SSIM), mas não de status de linha de atualizações, de modo a melhor opção é provavelmente o filtro de fluxo.

Se não deseja filtrar (por exemplo,assim fps / taxa de bits em cada estado-intervalo de atualização é lá no arquivo), você pode usar less -r para passá-los diretamente para o seu terminal para que você possa visualizar os arquivos corretamente.Se você tiver .enc logs de vários codifica o que você deseja percorrer, less -r ++G *.enc funciona muito bem.(++G significa começar no final do arquivo para todos os arquivos).Com chave única chave de ligações como . e , para o próximo arquivo e arquivo anterior, você pode folhear alguns arquivos de log muito bem.(o padrão de ligações são :n e :p).

Se você não deseja filtrar, sed 's/.*\r//' funciona perfeitamente para o ffmpeg de saída.(No caso geral, você precisa de algo como vt100.py, mas não para retorno de carro).Existem (pelo menos) duas formas de fazer isso com a tee + sed: tee para /dev/tty e o tubo tee de saída em sed, ou usar um processo de substituição de tee dentro de um tubo para o sed.

# pass stdout and stderr through to the terminal, 
## and log a filtered version to a file (with only the last status-line update).

of="$1-x265.mkv"
ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |&    # pipe stdout and stderr
   tee /dev/tty | sed 's/.*\r//' >> "$of.enc"

## or with process substitution where tee's arg will be something like /dev/fd/123

ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |&
  tee >(sed 's/.*\r//' >> "$of.enc")

Para testar um pouco diferentes codificar parâmetros, você pode fazer uma função como este que eu usei recentemente para testar algumas coisas.Eu tinha tudo em uma linha, então eu poderia facilmente seta para cima e editá-lo, mas eu vou onu-dissimular-lo aqui.(É por isso que há ;s no final de cada linha)

ffenc-testclip(){
  # v should be set by the caller, to a vertical resolution.  We scale to WxH, where W is a multiple of 8 (-vf scale=-8:$v)
  db=0;   # convenient to use shell vars to encode settings that you want to include in the filename and the ffmpeg cmdline
  of=25s@21.15.${v}p.x265$pre.mkv; 
  [[ -e "$of.enc" ]]&&echo "$of.enc exists"&&return;   # early-out if the file exists

  # encode 25 seconds starting at 21m15s (or the keyframe before that)
  nice -14 ffmpeg -ss $((21*60+15))  -i src.mp4 -t 25  -map 0 -metadata title= -color_primaries bt709 -color_trc bt709 -colorspace bt709 -sws_flags lanczos+print_info -c:a copy -c:v libx265 -b:v 1500k -vf scale=-8:$v  -preset $pre -ssim 1 -x265-params ssim=1:cu-stats=1:deblock=$db:aq-mode=1:lookahead-slices=0 "$of" |&
   tee /dev/tty | sed 's/.*\r//' >> "$of.enc";
}

# and use it with nested loops like this.
for pre in fast slow;  do for v in  360 480 648 792;do  ffenc-testclip ;done;done

less -r ++G *.enc       # -r is useful if you didn't use sed

Note que ele testa a existência do arquivo de vídeo de saída para evitar vomitar lixo extra para o arquivo de log se ele já existe.Mesmo assim, eu usei e append (>>) o redirecionamento.

Seria "limpo" para escrever uma função shell, que teve args em vez de olhar variáveis shell, mas isso foi fácil e conveniente para escrever para meu próprio uso.É por isso também que eu salvo espaço por não citar corretamente todas as minhas expansões da variável.($v em vez de "$v")

Você deve declarar o relatório como variável para o console.

O problema é que todas as dokumumentações que você pode encontrar não estão funcionando, então ... eu recebi 1 dia da minha vida para encontrar o caminho certo ....

Exemplo: para lote/console

cmd.exe /k set ffreport = file = 'c: ffmpeg proto test.log': nível = 32 && c: ffmpeg bin ffmpeg.exe -loglevel warning -report -i inputfile f Outputfile

JavaScript exemplar:

var reorortLogfile = "cmd.exe /k set ffreport = file = 'c: ffmpeg proto " + filename + ".log': nível = 32 && c: ffmpeg bin ffmpeg.exe" .... ...;

Você pode mudar o nome do DIR e o arquivo como quiser.

Frank de Berlim

Se você só quer saber quanto tempo leva para o comando executar, considere usar o Tempo comando. Você, por exemplo, use time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top