![Parâmetros ideais para FFMPEG manter o tamanho do arquivo](https://rvso.com/image/1400009/Par%C3%A2metros%20ideais%20para%20FFMPEG%20manter%20o%20tamanho%20do%20arquivo.png)
então a ideia é: quero converter todos os vídeos que tenho em uma unidade de 1 terabyte para um formato que meu Chromecast possa reproduzir (https://developers.google.com/cast/docs/media) e ficarei feliz em deixar meu PC não tão novo funcionando por alguns dias (semanas?) para fazer isso. Ótimo, FFMPEG para a salvação.
algumas informações básicas: sou um desenvolvedor Android/Java (muito ativo no StackOverflow) e sei que em algum momento só precisarei codificar algum script em lote ou uma linha de comando java rápida (porque estou mais confortável com Java ) para fazer o trabalho, mas ainda não tenho certeza sobre quais argumentos usar na linha de comando do FFMPEG.
Então, minhas necessidades são: - codec de vídeo: H.264 High Profile Level 5 - codec de áudio: qualquer HE-AAC, LC-AAC, MP3 (sinceramente, não sei a diferença, talvez algum AAC seja melhor? ) mantenha o mesmo - certamente quero usar o lento ou mais lento (para melhor qualidade) - certamente quero usar o 2-pass com taxa de bits variável (para melhor qualidade)
tudo isso eu vi nos tutoriais e manuais como fazer, agora a parte que realmente não tenho certeza de como fazer:
Quero que o tamanho do arquivo final seja aproximadamente igual ao original. Isso ocorre porque a unidade está cerca de 80% cheia e não quero enchê-la simplesmente convertendo coisas. No script, recodificarei o arquivo e excluirei o original para que as coisas continuem funcionando sem problemas.
então, como faço para passar do tamanho do arquivo para video_bitrate e audio_bitrate para colocar no script?
ps.: Fico igualmente feliz em usar o freio de mão se alguém souber fazer o mesmo trabalho.
Obrigado antecipadamente pela ajuda.
Responder1
O comando ffmpeg que você precisa é algo como:
ffmpeg -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -an -pass 1 output.bar;
ffmpeg -y -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -b:a $audiobitrate -pass 2 output.bar
libx264 é o codificador h264, e todas as opções são passadas do ffmpeg para ele, elas são bastante autoexplicativas. A primeira passagem não precisa de áudio, daí o -an. Você pode canalizar a saída para /dev/null se quiser, mas tanto faz. Eu apenas uso a opção -y na segunda passagem para substituir o arquivo temporário sem perguntar. O codec de áudio por padrão é aac, portanto você não precisa especificá-lo.
ffprobepode ajudá-lo a obter o valor de $videobitrate e $audiobitrate (estou assumindo um ambiente posix, caso contrário será% videobitrate% e% audiobitrate%). Você terá que fazer algum voodoo sed, awk ou perl para colocar os valores em um formato que você possa usar. Aqui está a saída do ffprobe em um mp4 aleatório na minha máquina:
ffprobe version 2.1.3 Copyright (c) 2007-2013 the FFmpeg developers
built on Feb 12 2014 22:10:38 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-openssl --enable-libopus --enable-frei0r --enable-libcaca --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5 '
libavutil 52. 48.101 / 52. 48.101
libavcodec 55. 39.101 / 55. 39.101
libavformat 55. 19.104 / 55. 19.104
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 90.100 / 3. 90.100
libavresample 1. 1. 0 / 1. 1. 0
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'loop.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.19.104
Duration: 00:00:19.56, start: 0.000000, bitrate: 201 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 400x226 [SAR 226:225 DAR 16:9], 129 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 75 kb/s (default)
Metadata:
handler_name : SoundHandler
irritantemente, o ffprobe despeja tudo no stderr, então você precisa redirecioná-lo para o stdout. Não vou te dizer como chupar ovos, o seu sed-fu pode ser melhor que o meu, mas porAqueles que chegaram tarde, para obter a taxa de bits de toda a coisa no exemplo acima, você poderia fazer algo como:
videobitrate=$(ffprobe input.foo 2>&1|grep bitrate |sed "s/.*bitrate: \([0-9]*\) \([km]*\).*/\1\2/")
e para o áudio:
audiobitrate=$(ffprobe input.foo 2>&1|grep Audio|sed "s/.* \([0-9]*\) \([km]*\)b\/s.*/\1\2/")
não sei por que a taxa de bits do áudio foi especificada, mas não a do vídeo, pode ser porque geralmente comprimo com um fator de taxa constante (qualidade constante em vez de taxa de bits constante). Você terá que verificar a saída do ffprobe em seus filmes. A partir daí cabe a você transformar isso nas variáveis que você precisa. Observe que o ffmpeg analisará números como 100k ou 3m.