3 pontos por GN⁺ 2023-07-31 | 1 comentários | Compartilhar no WhatsApp
  • ffmprovisr é um site de apoio à criação de comandos em que usuários com dificuldade para montar comandos do FFmpeg podem escolher uma tarefa e ver comandos de exemplo e explicações de cada flag
  • As receitas se concentram em ffmpeg, ffplay e ffprobe, mostrando de forma decomposta elementos como arquivo de entrada, codec, filtros, mapeamento de streams e contêiner de saída
  • O escopo coberto é amplo, indo de remux/transcodificação a cortar e unir, legendas e marca-d'água, miniaturas e GIFs, arquivos de teste, metadados, checksums e relatórios do QCTools
  • Não há busca própria, mas é indicado expandir todas as receitas e usar a busca do navegador para encontrar a palavra-chave necessária
  • Além do FFmpeg, também aborda ferramentas como ripping de CDDA, ImageMagick e flac, podendo ser usado como uma coletânea de comandos práticos para fluxos de trabalho de preservação digital

O que o ffmprovisr oferece

  • O ffmprovisr fornece comandos de exemplo por tarefa e explicações das opções, reduzindo a carga de ter que montar comandos do FFmpeg manualmente
  • O usuário clica no botão da tarefa para ir a um único comando ou a uma lista de comandos relacionados e, então, verifica o comando de exemplo e o comportamento de cada flag
  • A própria página não tem função de busca, e orienta a abrir todas as receitas e usar ctrl+f ou cmd+f para pesquisar no navegador
  • Como materiais de referência básicos, ele aponta para o site oficial do FFmpeg, as installation instructions de Reto Kromer, o Command Line Crash Course e o explainshell.com
  • A licença é a Creative Commons Attribution 4.0 International License

Forma básica de ler comandos do FFmpeg

  • Depois de instalado, o FFmpeg é chamado digitando ffmpeg no prompt de comando
  • Os comandos normalmente são compostos por pares de flag e valor
    • Em -i input_file.ext, -i é a flag que especifica o arquivo de entrada, e input_file.ext é o arquivo de destino
    • Em -c:v prores, -c:v especifica a codificação do stream de vídeo, e prores é o codec a ser usado
  • O nome do arquivo de saída vem no fim do comando e é especificado pelo nome do arquivo, sem uma flag de saída separada
  • O ffmpeg salva o vídeo, enquanto o ffplay pode reproduzir o vídeo gerado sem salvá-lo
    • Um exemplo de gravação de barras SMPTE é ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file
    • Um exemplo de reprodução de barras SMPTE é ffplay -f lavfi smptebars=size=640x480
    • O exemplo com FFmpeg precisa de -i, do tempo de gravação -t 5 e do arquivo de saída, mas o exemplo com FFplay não precisa de -i

Pontos de verificação para reduzir erros

  • É preciso verificar se o arquivo de saída abre, é reproduzido e parece e soa como o esperado
  • A extensão de saída deve corresponder ao codec pretendido, e algumas extensões levam o FFmpeg a usar determinados codecs por padrão
    • Por exemplo, .mp4 pode ser configurado por padrão para codificação H.264
  • "Error: No such file or directory" pode ocorrer por diretório incorreto, erro de digitação, espaço faltando ou flags coladas de forma errada
    • No macOS, para ir à pasta Downloads, usa-se cd $HOME/Downloads
    • Mesmo que um comando copiado e colado pareça correto, se houver erro, recomenda-se redigitá-lo manualmente na linha de comando
  • "Could not find tag for codec" pode ocorrer ao tentar remuxar um arquivo com codecs de áudio ou vídeo incompatíveis com a extensão de saída
    • É possível primeiro transcodificar para um codec apropriado ou remover -c copy quando se tiver certeza de que a extensão fará a codificação automática com o codec correto
  • "Killed" pode aparecer quando o arquivo excede a capacidade de memória do servidor
    • Em servidores remotos, isso pode ser resolvido aumentando a capacidade de memória
    • Em servidores locais, é melhor manter a versão do FFmpeg atualizada e evitar executá-lo ao mesmo tempo que outros programas que consomem muita memória
  • Se durante o uso de filtros aparecer "Error splitting argument list: option not found", é preciso verificar o uso de aspas e o formato do filtergraph
  • Filtros exigem reencodificação do stream, então pode haver problema ao usá-los junto com -c copy, que copia diretamente os streams do arquivo

Filtergraph, mapeamento de streams e codecs padrão

  • Ao executar tarefas em lote do FFmpeg dentro de loops, é possível colocar -nostdin antes da entrada para sobrescrever o comportamento padrão de interação via entrada padrão
    • Exemplo: ffmpeg -nostdin -i input_file ...
  • O FFmpeg define automaticamente codecs e parâmetros padrão de codec de acordo com o formato do arquivo de saída
    • .avi: áudio mp3, vídeo mpeg4
    • .mkv: áudio ac3, vídeo H.264
    • .mov: áudio AAC, vídeo H.264
    • .mp4: áudio AAC, vídeo H.264
    • .mpg: áudio mp2, vídeo mpeg1video
    • .mxf: áudio pcm_s16le, vídeo mpeg2video
    • .wav: áudio pcm_s16le
  • Um filtergraph é uma combinação de nome de filtro e opções que vem depois de -vf ou -af
    • -vf é um alias de -filter:v
    • Um exemplo de filtro de vídeo é hflip, e um exemplo de filtro de áudio é amerge
    • Vários filtros são ligados por vírgulas, e várias cadeias de filtros são separadas por ponto e vírgula
    • -vf "fieldmatch,yadif,decimate" é uma única cadeia de filtros usada para processamento de inverse telecine
    • Se houver mais de uma entrada ou saída, deve-se usar -filter_complex em vez de -vf
    • Devem ser usadas aspas retas, e aspas curvas devem ser evitadas
  • O mapeamento de streams define quais streams de vídeo, áudio, legenda, dados e anexos do arquivo de entrada serão incluídos na saída
    • O FFmpeg reconhece os tipos de stream a, v, s, d e t
    • -map 0:v seleciona todos os streams de vídeo do primeiro arquivo de entrada
    • -map 0:3 seleciona o quarto stream do primeiro arquivo de entrada
    • -map 0:a:2 seleciona o terceiro stream de áudio do primeiro arquivo de entrada
    • Se nenhum mapeamento for especificado, o padrão para arquivos de vídeo é levar para a saída apenas um stream de vídeo e um de áudio
    • Para mapear todos os streams, usa-se -map 0
    • Ao adicionar ?, como em -map 0:a?, é possível processar em lote arquivos sem áudio sem gerar erro

Mudança de contêiner e transcodificação

  • O reempacotamento de arquivo é feito com ffmpeg -i input_file.ext -c copy -map 0 output_file.ext
    • Move os dados internos de vídeo, áudio e legenda para outro formato de contêiner sem alterá-los
    • O reempacotamento também é chamado de remuxing ou re-multiplexing
    • É preciso usar -map 0 para preservar todos os fluxos, como várias trilhas de áudio
    • Alguns contêineres só aceitam determinadas codificações de fluxo, então o reempacotamento sem recodificação pode não ser possível
  • A criação de Broadcast WAV grava o chunk BEXT e os metadados relacionados com -write_bext 1 e -metadata field_name='Content'
    • Campos usados com frequência são description, originator, originator_reference, origination_date, origination_time, coding_history e IARL
    • Os campos de metadados BWF têm limite de caracteres, e OriginatorReference tem no máximo 32 caracteres
  • Ao reempacotar vídeo com codec DV em um arquivo .dv, use -f rawvideo -c:v copy para evitar que os metadados de origem dentro do fluxo DV sejam removidos sem querer
  • Um exemplo de transcodificação para Apple ProRes LT é -c:v prores -profile:v 1 -vf yadif -c:a pcm_s16le
    • Os perfis ProRes 422 são divididos em 0 Proxy, 1 LT, 2 Standard e 3 HQ
    • Os contêineres ProRes com suporte no FFmpeg são QuickTime .mov, Matroska .mkv e MXF .mxf
  • Um exemplo de transcodificação para H.264 é -c:v libx264 -pix_fmt yuv420p -c:a aac
    • O padrão do libx264 é o preset medium e CRF 23
    • -pix_fmt yuv420p define subamostragem de croma 4:2:0 para compatibilidade com o QuickTime e com a maioria dos players que não são baseados em FFmpeg
    • Para otimização de streaming, adiciona-se -movflags +faststart
    • Um exemplo de qualidade mais alta é -preset veryslow -crf 18, e CRF 18 costuma ser considerado “visualmente sem perdas”
  • A codificação H.264/H.265 baseada em GPU Nvidia usa h264_nvenc ou hevc_nvenc
    • O hardware dedicado da Nvidia pode ter desempenho 10 vezes maior que a codificação por CPU, mas otimizar a qualidade em bitrates baixos exige mais parâmetros
    • O HEVC é descrito como um codec mais eficiente, com suporte em GPUs aproximadamente desde 2015
  • A transcodificação para H.265/HEVC usa -c:v libx265 -pix_fmt yuv420p -c:a copy
    • O padrão do libx265 é o preset medium e CRF 28
    • O CRF 28 do H.265 corresponde ao CRF 23 do H.264, e o tamanho do arquivo pode cair para cerca da metade
  • Um exemplo sem perdas para preservação usa FFV1 Version 3 em um contêiner Matroska e gera junto um framemd5 da entrada
    • -map 0 mapeia todos os fluxos
    • -dn exclui fluxos de dados que o Matroska não permite
    • -slicecrc 1 adiciona informações de CRC para que o decodificador possa detectar slices corrompidos
    • -f framemd5 -an gera checksums MD5 por frame de vídeo

Mudança de propriedades de vídeo e áudio

  • A receita para mudar a proporção de tela usa o filtro de padding
    • Para transformar 4:3 em 16:9, aplica-se pillarbox
    • Para transformar 16:9 em 4:3, aplica-se letterbox
    • Vídeos sem áudio podem usar -an no lugar de -c:a copy
  • Um exemplo de conversão de SD para HD usa três filtros: colormatrix=bt601:bt709, scale=1440:1080:flags=lanczos e pad=1920:1080:240:0
    • Muda os coeficientes de luma de Rec. 601 para Rec. 709
    • O redimensionamento Lanczos é mais lento que o bilinear padrão, mas oferece resultados melhores
    • Para fontes entrelaçadas, recomenda-se aplicar deinterlace com yadif antes do redimensionamento
  • A proporção de exibição pode ser alterada no nível do contêiner com opções como -aspect 4:3
    • Se usado com -c:v copy, isso afeta a proporção armazenada no contêiner, e não a proporção dentro dos frames codificados
  • A conversão de espaço de cor usa o filtro colormatrix=src:dst
    • Os valores aceitos incluem bt601, smpte170m, bt470bg, bt709 e bt2020
    • A incorporação de metadados de espaço de cor usa -color_primaries, -color_trc e -colorspace
    • Também é possível marcar um arquivo Rec.601 real com uma tag Rec.709, então é preciso ter cuidado
    • As tags de metadados são gravadas por libx264 ou libx265, então não é possível adicioná-las sem recodificação
  • A mudança de velocidade usa setpts e atempo em conjunto
    • O exemplo é uma cópia de acesso pelo método PAL, mudando de 24fps para 25fps e mantendo o pitch do áudio
  • Para fade, usam-se os filtros fade e afade, e como há uso de filtro, é preciso recodificar vídeo e áudio
  • A extração de áudio usa -c:a copy -vn para extrair sem perdas o fluxo de áudio sem o vídeo
  • A combinação de duas trilhas de áudio usa amerge e -filter_complex
    • Isso pode ser útil para processos posteriores que esperam uma única trilha de áudio, como legendas automáticas do YouTube
    • Para confirmar a trilha desejada, recomenda-se executar ffprobe antes de escrever o script
  • A análise e normalização de volume usam o filtro loudnorm
    • A saída JSON pode ser usada como valor de entrada para normalização em 2 passes
    • Os valores padrão são descritos como bem alinhados ao volume-alvo recomendado pela PBS
    • O modo de 1 pass é mais rápido, mas menos preciso que o de 2 passes
  • Também estão incluídas receitas para pre-emphasis de CD, equalização RIAA, reamostragem de áudio e interpretação forçada de WAV de 192kHz como 96kHz

Cortar, juntar e segmentar

  • Ao juntar arquivos com as mesmas especificações técnicas, usa-se o concat demuxer
    • ffmpeg -f concat -i mylist.txt -c copy output_file
    • Os arquivos a serem unidos precisam ter o mesmo codec e as mesmas especificações técnicas, e o arquivo resultante deve ser sempre pré-visualizado
    • Para usar caminhos absolutos, adicione -safe 0
  • Ao juntar arquivos com formatos ou codecs diferentes, usam-se o filtro concat e -filter_complex
    • Os arquivos de entrada podem diferir em contêiner, codec, subamostragem de croma, frame rate etc.
    • O exemplo básico só funciona corretamente quando a resolução é a mesma
    • Se o frame rate for diferente, a saída pode ter frame rate variável
    • Se a resolução for diferente, ajuste antes com scale, e ao juntar SD com HD, o SD pode receber pillarbox
  • A divisão de arquivos é feita com o segment muxer
    • -segment_time 60 cria segmentos de no máximo 60 segundos
    • %03d cria nomes de arquivo numéricos com 3 dígitos e preenchimento com zero
  • O trimming sem recodificação usa -ss, -to, -t, -c copy e -map 0
    • Codecs interframe como H.264 podem começar no ponto mais próximo baseado em i-frame
    • -sseof -5 copia a partir de 5 segundos antes do fim do arquivo
  • A remoção de silêncio no início de um arquivo de áudio usa silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1
    • -57dB é apresentado como um nível adequado para levar em conta hiss analógico
    • Como há uso de filtro, o áudio é recodificado
  • A remoção de silêncio no fim de um arquivo de áudio é feita na sequência areverse, silenceremove, areverse
    • Como silenceremove é mais adequado para remover silêncio do início, o áudio é invertido e depois revertido novamente

Processamento de vídeo entrelaçado

  • Ao criar um arquivo de acesso HD H.264 a partir de uma fonte SD NTSC, usa-se yadif, scale, pad e format=yuv420p em conjunto
    • yadif é um filtro de desentrelaçamento
    • scale=1440:1080:flags=lanczos ajusta a imagem para 1440x1080
    • pad=1920:1080:(ow-iw)/2:(oh-ih)/2 adiciona padding para encaixar uma entrada 4:3 em um frame de saída 16:9
  • Um exemplo geral de desentrelaçamento é -vf "yadif,format=yuv420p"
    • format=yuv420p especifica subamostragem de croma 4:2:0 para compatibilidade de reprodução em H.264
    • Além de yadif, o FFmpeg também tem os desentrelaçadores bwdif, w3fdif, kerndeint e nnedi
  • Para desentrelaçamento que separa campos em frames, use idet,bwdif,format=yuv420p
    • É preferido para preservar a cadência visual da fonte em vídeos entrelaçados com muito movimento
    • idet detecta a ordem dos campos
    • bwdif por padrão gera um frame para cada campo
  • Para inverse telecine, use fieldmatch,yadif,decimate
    • Isso reverte o pulldown 3:2 para restaurar um vídeo entrelaçado de 29.97fps à taxa de quadros original de 24fps da fonte em filme
    • Ao aplicar a um arquivo 29.97i, a taxa de quadros de saída será na prática 23.976fps
  • Para mudar a ordem dos campos, use setfield=tff ou setfield=bff
    • Como um filtro de vídeo é usado, -c copy não pode ser utilizado e é necessário recodificar
  • Para verificar o padrão de entrelaçamento, analise sem arquivo de saída com ffmpeg -i input_file -filter:v idet -f null -

Marca d'água, legendas, miniaturas, GIF

  • Uma marca d'água de texto é criada com o filtro drawtext
    • Defina as opções fontfile, fontsize, text, fontcolor, alpha, x e y
    • x=(w-text_w)/2:y=(h-text_h)/2 posiciona no centro independentemente do tamanho do vídeo
  • Uma marca d'água de imagem pode ser posicionada no canto superior direito com overlay=main_w-overlay_w-5:5
  • Timecode queimado na imagem usa as opções timecode, box, boxcolor e rate do drawtext
    • O timecode inicial tem o formato hh:mm:ss[:;.]ff
  • Para incorporar um arquivo de legendas, use -i subtitles_file -c copy -c:s mov_text
    • mov_text funciona em contêineres MP4 e MOV
    • Os formatos aceitos no contêiner MKV são ASS, SRT e SSA
  • Uma miniatura única é extraída com -ss 00:00:20 -vframes 1 thumb.png
  • Para criar miniaturas a cada 1 minuto, use -vf fps=1/60 out%d.png
  • Ao criar um GIF a partir de uma sequência de imagens, use image2, -framerate, -pattern_type glob e scale
  • GIFs de alta qualidade são gerados em duas etapas
    • O primeiro comando cria uma paleta personalizada com palettegen
    • O segundo comando aplica a paleta com paletteuse
    • Um método mais simples é usar -vf "fps=10,scale=500:-1", mas o dithering fica mais visível e o tamanho do arquivo é menor

Sequência de imagens, scopes, OCR

  • Para criar um vídeo não comprimido de 10-bit a partir de uma sequência de imagens, use -f image2 -framerate 24 -i input_file_%06d.ext -c:v v210
    • A taxa de quadros padrão do demuxer image2 é 25fps
    • %06d lê nomes de arquivo numéricos de seis dígitos em ordem crescente
  • Para criar um vídeo combinando arquivos de imagem e áudio, use -loop 1, -shortest e -vf scale=1280:720
    • Isso pode ser útil quando quiser enviar um arquivo de áudio para plataformas como o YouTube
  • Usando ffplay -f lavfi e filtros, é possível visualizar profundidade de bits de áudio, gráfico em decibéis, pixels fora da faixa de broadcast e vectorscope
  • tblend=all_mode=difference128 e hstack mostram lado a lado as diferenças temporais entre dois vídeos de entrada
  • xstack é usado para criar uma janela de saída que empilha várias fontes de vídeo na vertical ou na horizontal, sendo útil para o mesmo tipo de janela de saída usado no vrecord
  • Um exemplo de OCR usa o filtro ocr e drawtext para exibir sobre o vídeo o texto reconhecido
  • A saída de dados de OCR é exibida na tela no formato ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=input_file,ocr"

Metadados, checksums, trabalho de preservação

  • A extração de metadados técnicos é feita com ffprobe -i input_file -show_format -show_streams -show_data -print_format xml
    • Além de XML, os formatos de saída podem ser JSON e flat
  • Para remover metadados, use -map_metadata -1 -c:v copy -c:a copy
    • O vídeo e o áudio são copiados, mas os metadados não
  • O processamento em lote no Bash é feito com um arquivo .sh e um loop for
    • Exemplo: for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done
    • O arquivo .sh e os arquivos .mxf a serem processados devem estar no mesmo diretório, e a execução deve ocorrer nesse diretório
    • Para processamento recursivo, pode-se usar find input_directory -iname "*.mxf" -exec ffmpeg -i {} -map 0 -c copy {}.mov \;
  • No Windows, o processamento em lote é feito com um script PowerShell .ps1
    • O exemplo cria uma lista de arquivos .mp4 e remultiplexa cada um trocando a extensão para .mkv
    • Para chamar ffmpeg sem o caminho completo, ele precisa estar configurado corretamente
  • Para verificar erros do decodificador, decodifique sem arquivo de saída com ffmpeg -i input_file -f null - e veja os erros na tela
  • A verificação de fixity do FFV1 Version 3 usa -report -i input_file -f null - para procurar CRC checksum mismatch
    • O Frame CRC é ativado por padrão no FFV1 Version 3
  • Um MD5 de vídeo por frame é gerado com -f framemd5 -an
  • Um MD5 por grupo de amostras de áudio é gerado com asetnsamples=n=48000 -f framemd5 -vn
    • É apresentado como boa prática alinhar a quantidade de grupos de amostras à sample rate da mídia
    • Por padrão, o áudio é transcodificado para PCM 16-bit ao gerar o framemd5
  • Um MD5 de stream pode ser criado para os streams de vídeo e áudio separadamente usando -map e -c copy -f md5
    • Isso é usado para verificar a integridade das informações A/V independentemente de mudanças nos metadados do contêiner
  • streamhash gera hashes por stream para todos os streams
    • É útil para fazer hash de materiais born-digital mistos sem precisar saber quantos streams existem
  • Um relatório do QCTools gera .qctools.xml.gz usando ffprobe -f lavfi com signalstats, cropdetect, idet, psnr, ssim, ebur128, astats e outros
    • Há comandos separados para arquivos com áudio e sem áudio
  • A extração de closed captions EIA-608 da Line 21 usa o filtro readeia608 e ffprobe para gerar valores hex em CSV

Arquivos de teste e outros exemplos de FFmpeg

  • Vídeos de teste podem ser criados ou reproduzidos com entradas lavfi como mandelbrot, smptebars, testsrc e smptehdbars
    • O exemplo de Mandelbrot gera saída H.264 em 1280x720, 25fps, por 10 segundos
    • O exemplo de SMPTE bars gera saída ProRes em 720x576, 25fps, por 10 segundos
    • A reprodução de HD SMPTE bars é feita com ffplay -f lavfi -i smptehdbars=size=1920x1080
    • A reprodução de VGA SMPTE bars é feita com ffplay -f lavfi -i smptebars=size=640x480
  • O áudio de teste em onda senoidal gera um arquivo WAV com sine=frequency=1000:sample_rate=48000:duration=5 e pcm_s16le
  • Um vídeo de teste que combina SMPTE bars e uma onda senoidal de 1kHz usa duas entradas lavfi e -c:v ffv1, -c:a pcm_s16le
  • Arquivos de teste corrompidos usam -bsf noise=1 -c copy para corromper intencionalmente o conteúdo dos pacotes sem corromper o contêiner
  • Conway's Game of Life pode ser simulado com ffplay -f lavfi life=..., e com ffmpeg e -t 5 é possível salvar um trecho
  • A comparação de similaridade perceptual entre dois vídeos usa o filtro signature=detectmode=full:nb_inputs=2
  • O hash perceptual de um vídeo de entrada gera um arquivo XML com signature=format=xml:filename="output.xml"
  • Sequências de imagens podem ser reproduzidas diretamente com ffplay -framerate 5 input_file_%06d.ext sem criar um vídeo antes
  • A separação de faixas de áudio e vídeo usa -map 0:v:0 e -map 0:a:0
  • A mesclagem de faixas de áudio e vídeo usa -map 0:v -map 1:a -c copy para combinar o vídeo do primeiro arquivo com o áudio do segundo
  • Arquivos MPEG para criar uma ISO para acesso em DVD são gerados com -aspect 4:3 -target ntsc-dvd output_file.mpg, e exigem a instalação do dvdauthor
  • O CSV para detecção de cena baseada em YDIF imprime os valores lavfi.signalstats.YDIF do ffprobe e de signalstats
  • O head switching noise pode ser ocultado desenhando uma caixa preta na parte inferior do frame com drawbox=w=iw:h=7:y=ih-h:t=max
  • Para fazer streaming ao vivo para um destino RTMP e gravar um MP4 local ao mesmo tempo, usa-se o muxer tee
    • A entrada é redimensionada para largura de 1280px e o stream é encerrado após o tempo especificado
    • O exemplo inclui a observação de que isso foi usado diariamente por cerca de 4 anos em transmissões ao vivo reais de programas de TV
  • Informações sobre um decoder, encoder, demuxer, muxer ou filtro específico podem ser consultadas com ffmpeg -h type=name
    • Os exemplos são encoder=libx264, decoder=mp3, muxer=matroska, demuxer=mov, filter=crop

Ferramentas relacionadas apresentadas junto com FFmpeg

  • Ferramentas de ripping de CDDA tratam da verificação do offset da unidade de CD e do ripping preciso de CDs de áudio
    • Diferentes modelos de unidade de CD começam a leitura em posições diferentes, então a correção de offset é necessária para validar checksums do mesmo conteúdo
    • A identificação da unidade pode ser verificada com cdda2wav -scanbus, cdda2wav, cdparanoia -vsQ
    • O offset pode ser encontrado em Accurate Rip CD drive offset list
    • Como ferramenta GUI para macOS, é apresentado o XLD
  • O ripping com CD Paranoia usa cdparanoia -L -B -O [Drive Offset] [Starting Track Number]-[Ending Track Number] output_file.wav
    • -B é o modo batch que divide automaticamente as faixas em arquivos separados
  • Cdda2wav é uma ferramenta que usa a Paranoia library para ripar CDs de áudio com precisão
    • O comando de instalação via Homebrew é brew install cdrtools
    • O comando de exemplo ripa o CD inteiro em um único WAV, consulta o CDDB e gera um cue sheet
    • No macOS, é preciso desmontar o CD antes de executar o comando
  • CD emphasis é descrito como um método de redução de ruído que pode afetar alguns CDs do começo dos anos 1980 e CDs prensados no Japão
    • A verificação de presença é feita com cdda2wav -J ou cdparanoia -Q
    • Para corrigir durante o ripping com Cdda2wav, adicione a flag -T
  • ImageMagick é um conjunto de softwares livres e de código aberto para exibir, converter e editar arquivos de imagem raster e vetorial
    • Os comandos são chamados individualmente, como convert, montage e mogrify
    • A comparação de imagens usa compare -metric ae image1.ext image2.ext null: para retornar o número de pixels diferentes
    • A geração de miniaturas usa mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg
    • Grades de imagens são criadas com montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpg
    • A remoção de EXIF usa mogrify -path ./stripped/ -strip *.jpg
  • A ferramenta flac é um utilitário de transcodificação FLAC e manipulação de metadados criado pelo projeto FLAC
    • Ela tem a vantagem de poder embutir foreign metadata como BWF em comparação com outras ferramentas
    • Para converter de WAV para FLAC mantendo os metadados BWF, use flac --best --keep-foreign-metadata --preserve-modtime --verify input.wav
    • Para reconstruir o BWF original a partir de um FLAC, use --best em vez de --decode

1 comentários

 
GN⁺ 2023-07-31
Opiniões no Hacker News
  • Fugindo um pouco do assunto, mas considero o ffmpeg um dos melhores softwares já criados
    Engenheiros talentosos como Fabrice Bellard são um grande presente para a comunidade FOSS, e até em um unicórnio avaliado em cerca de US$ 2 bilhões onde trabalhei antes, uma grande parte do produto dependia do ffmpeg

    • Então vocês devem ter doado uma boa quantia, né?
      https://ffmpeg.org/donations.html
    • Não é “Fabian Fabrice”, é Fabrice Bellard
      Ele também criou QEMU, TCC, QuickJS e outros
    • Não há ninguém como ele. Ninguém está na mesma liga que Fabrice Bellard; na verdade, nem parece haver alguém jogando o mesmo jogo :-)
      Falando sério, a quantidade de dispositivos que estão rodando código escrito por ele em qualquer dado momento é simplesmente absurda
    • Para constar, o “FF” de “FFmpeg” significa “fast forward”
    • Gosto do ffmpeg, mas a performance em ARM precisa melhorar
  • A linha de comando do ffmpeg ainda faz a gente arrancar os cabelos mesmo com bons guias, então eu recomendaria o VapourSynth
    https://www.vapoursynth.com/
    É uma ferramenta otimizada de filtragem de vídeo em estilo Python, mas é muito mais do que isso: https://vsdb.top/
    E o StaxRip aproveita muito bem ffmpeg, VapourSynth e dezenas de encoders e ferramentas; é por causa dele que eu reinicio do Linux para o Windows: https://github.com/staxrip/staxrip

    • Só um wrapper do ffmpeg com uma interface de linha de comando melhor já seria ótimo
      Ele é desnecessariamente complicado e, de certa perspectiva, talvez toda a estrutura faça sentido, mas é inadequado ter que conhecer opções que parecem palavras mágicas para fazer tarefas muito comuns
      Deve haver dezenas de aliases bash que reduzem comandos ffmpeg de 150 caracteres para duas palavras
      O ffprobe também não faz sentido: em 99% dos casos, a ideia é executá-lo sem argumentos para ver rapidamente duração, resolução, frame rate e número de faixas de áudio, mas 99% da saída é conteúdo totalmente irrelevante, como opções de compilação
  • Materiais que valem ver junto:
    https://ffmpeg.guide/ — criar grafos de filtros complexos do FFmpeg de forma rápida e precisa
    https://www.hadet.dev/ffmpeg-cheatsheet/ — cortar, adicionar fade in/out, redimensionar, concatenar etc.

    • Na minha experiência, o comando de corte do segundo link não foi ideal
      Por algum motivo desconhecido, o ffmpeg se comporta de forma diferente dependendo de você colocar as flags -ss e -t/-to antes ou depois de -i, e no meu caso funcionou melhor colocá-las antes
      O texto original tem o mesmo problema
    • O ffmpeg.guide parece excelente, mas sinto que deveria haver algo melhor no próprio ffmpeg
      É estranho forçar um grafo não linear a caber em uma linha de comando plana e linear
      Só uma configuração em JSON mais detalhada já seria muito melhor
    • O ffmpeg.guide é realmente bom. Existe algo parecido para o ImageMagick?
    • É só usar ffmpeg-python
  • Muito útil
    Comecei a usar o ChatGPT para montar comandos ffmpeg, e ficou muito mais rápido e fácil encontrar o que preciso
    Também criei uma pequena ferramenta para fazer isso direto na linha de comando: https://github.com/alexkrkn/help-cli
    Também fiz um vídeo relacionado: https://www.youtube.com/watch?v=pOda6TDBqcY

  • Recentemente, enquanto procurava uma UI para ffmpeg, encontrei o Shutter Encoder, que é open source, suporta Mac/Windows e é um software muito bom
    Finalmente comecei a comprimir minha coleção pessoal de vídeos de 15 anos, com 300 GB
    https://www.shutterencoder.com/
    Estou comprimindo tudo em H.265, e às vezes o tamanho dos vídeos cai para 1/10. Há algum motivo para não fazer isso? Li que é preciso mais poder de processamento para reproduzir vídeos comprimidos assim, mas não sei se isso será um grande problema no futuro

    • Testei aplicar automaticamente em uma grande coleção de vídeos e, embora parecesse bom nos vídeos de teste, a configuração de CRF estava fraca e a qualidade ficou abaixo do esperado
      Tome isso como um aviso para verificar vários vídeos antes de apagar os originais
      Mas, se são 300 GB, armazenamento é barato o suficiente para simplesmente guardar os originais
    • Um dos motivos para ainda escolher H.264 é que hardwares antigos ou de baixo custo muitas vezes não têm decodificação H.265 por hardware
      Além disso, para usar no Plex sem transcodificação, isso também é mais fácil no meu homelab
  • Este guia recomenda yadif como filtro de desentrelaçamento, mas, aos meus olhos, w3fdif parece melhor
    Ele não faz rastreamento de movimento como o yadif, então é bem rápido, e evita os artefatos incômodos que o rastreamento de movimento às vezes cria
    Acho melhor ter resultados consistentemente medianos do que resultados às vezes excelentes e às vezes ruins
    Porém, ao contrário do yadif, que olha para dois campos, o w3fdif considera três campos de cada vez, escondendo melhor os artefatos de entrelaçamento

    • Existe uma versão estendida dele: https://github.com/HomeOfVapourSynthEvolution/VapourSynth-Bw...
      Se você vai reencodar de qualquer forma, é melhor já usar QTGMC
    • Como mencionado acima, o w3fdif foi em grande parte substituído pelo bwdif
      O w3fdif pode criar cintilação, enquanto o yadif não; então o bwdif se comporta como o yadif, mas usa o melhor field matching do w3fdif
    • bwdif é um híbrido de yadif e w3fdif
  • A maior barreira para a adoção do ffmpeg provavelmente são as ferramentas offline premium freemium e os front-ends web
    Sites otimizam suas buscas para frases que as pessoas costumam digitar no Google, como “avi to mp4” e “mp3 to wav”
    Levei mais tempo do que imaginava para aceitar um app de linha de comando, porque o mundo Windows nos ensinou que tudo precisa ter uma GUI

    • Eu achava que a maioria desses sites de conversão de arquivos tinha uma estrutura com ffmpeg rodando em cima de algo como nginx
  • As pessoas dizem que o ffmpeg é complexo, mas ele não fica muito mais fácil só por receber uma GUI bonita. O que é complexo é a compressão de vídeo em si
    A menos que seja uma interface de cliques, como o HandBrake, que tome decisões por você, acho que nenhum software consegue tornar isso mais fácil
    Não tenho certeza, mas imagino que, depois de aprender codificação e compressão de vídeo digital em detalhes suficientes, o que fazer no ffmpeg também passe a parecer bem intuitivo. Alguém já fez isso de fato?

    • Uns 17 anos atrás, escrevi filtros DirectShow para WindowsMobile, então entendo razoavelmente bem codecs e contêineres
      Na época não existiam formatos como mkv nem codecs como HEVC, mas o conceito de manipular áudio/vídeo por meio de vários filtros é excelente, e é assim que a maioria dos softwares de conversão A/V funciona
      Quando comecei a olhar as páginas de manual do FFmpeg, as conexões ficaram claras e, depois de mexer por cerca de um dia, consegui usá-lo
      Talvez o fato de eu gostar de linha de comando e ter o hábito de ler páginas man tenha ajudado
  • O ffmpeg é poderoso e uso com frequência, mas a estrutura da API não entra na minha cabeça. Seria bom ter um front-end com LLM

  • Boa ideia. Fazer o FFmpeg executar exatamente o que você quer é sempre intimidador
    O ChatGPT ajudou, mas não foi perfeito

    • O ChatGPT tornou muito mais fácil usar argumentos e opções de muitas ferramentas de linha de comando
      Sempre achei difícil memorizar opções e argumentos do OpenSSL, mas agora simplesmente uso o GPT
    • O ChatGPT tornou o ffmpeg realmente muito mais acessível
      Ainda assim, pequenas diferenças entre sistemas operacionais continuam sendo um probleminha