FFMPEG COMMANDS

Published: 2019-08-04, Updated: 2023-05-24

Não perca tempo e nem dinheiro com ferramentas caras de edição, edite seus vídeos na linha de comando!

Links

Fazer upscaling

ffmpeg -i campos-02.mp4 -crf 21 -vf scale=2560x1440:flags=lanczos -c:a copy -c:v libx264 campos-02-1440p.mp4

Fixar vídeos corrompidos da sjcam

$ git clone https://github.com/anthwlock/untrunc.git && cd untrunc
$ docker build --build-arg FF_VER=3.3.9 -t untrunc .
$ docker run -v $PWD:/mnt untrunc /mnt/video-de-exemplo-que-funciona.mov /mnt/video-quebrado.mov

Borrar uma área do vídeo em um momento especifico (blur)

$ ffmpeg -v warning -hide_banner -stats -i "in.mp4" \
-filter_complex \
 "[0:v]crop=280:40:630:785,boxblur=10:enable='between(t,247,258)'[fg]; \
  [0:v][fg]overlay=630:785[v]" \
-map "[v]" -map 0:a \
-preset ultrafast -vcodec libx264 -acodec aac -strict -2 out.mp4

Isso vai borrar a posição x=630, x=785 com uma largura=280 e altura=40 do segundo 247 até o 258

Fazer encoding de forma bem rápida para poder validar o resultado

Isso é útil para poder validar se o resultado ficou bom, depois você pode mudar para slow para gerar um arquivo menor

ffmpeg -i input.mp4 -hide_banner -c:v libx264 -preset ultrafast out.mp4

Pegar as informacoes do video

mediainfo --fullscan myvideo.mp4  | less

Criar video a partir de uma imagem e de uma musica / foto

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

Converter video para h.264

sem minuatura (alta qualidade), quem determina a qualidade do video eh o crf entre 0 e 51 quanto maior pior a qualidade

avconv -i input.avi -c:v libx264 -preset slow -crf 18 -c:a copy -pix_fmt yuv420p output.mkv

com miniatura (alta qualidade)

avconv -i thumb.png -i input.mp4 -c:v libx264 -preset slow -crf 18 -c:a copy -pix_fmt yuv420p output-with-thumb.mp4 

testar colocar o encode do audio

libfdk_aac -b:a 128k

converter rotacionando

$ ffmpeg -i in.mov -vf "transpose=1" out.mov

For the transpose parameter you can pass:
0 = 90CounterCLockwise and Vertical Flip (default) 
1 = 90Clockwise 
2 = 90CounterClockwise 
3 = 90Clockwise and Vertical Flip

Converter videos

for v in *.avi  ; do $
	avconv -i "$v" -strict -2 "cv/`basename \"$v\" .avi`.mp4"
done

Rotacionar o video / Girar o vídeo

180 Graus

ffmpeg -i video.mp4 -vf transpose=1,transpose=1 out.mp4

90 Graus

ffmpeg -i video.mp4 -vf transpose=1 out.mp4

Mais algumas opções:

Rotate 90 clockwise:

ffmpeg -i in.mov -vf "transpose=1" out.mov
For the transpose parameter you can pass:

0 = 90CounterCLockwise and Vertical Flip (default) 
1 = 90Clockwise 
2 = 90CounterClockwise 
3 = 90Clockwise and Vertical Flip

Baixar video m3u8

ffmpeg -i "https://acme.com/playlist.m3u8" -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 file3.mp4

Converter musica

ffmpeg -i my.m4a -acodec mp3 -ac 2 -ab 192k my.mp3

Como extrair o audio do video no avconv

Va nas propriedades do video e veja o formato do video, ex: Vorbis, então rode o comando abaixo com a extensao do audio no formato original que está dentro do seu video, assim ele vai extrair muito rapido, ex: vorbis é .ogg

ffmpeg -i desenvolver-com-testes-unitarios-04.mp4 -vn -acodec copy audio-3.ogg

Se desejar converter o audio extraido ao inves de soh extrair

avconv -i desenvolver-com-testes-unitarios-04.mp4 -vn -acodec mp3 audio-3.mp3

Extrair audio de todos os videos da pasta

FILES_TO_CONVERT=(*.*) &&\
OUT_DIR=mp3 && mkdir -p ${OUT_DIR} &&\
for IN in "${FILES_TO_CONVERT[@]}"; do 
  ffmpeg -i "$IN" -vn -acodec mp3 "$OUT_DIR/${IN%.*}.mp3";
done

Substituir o audio / Colocar musica no vídeo

ffmpeg -i in.mp4 -i new-audio.mp3 -map 0:0 -c:v copy -map 1 -c:a copy out.mp4

Para cortar no mais curto (o video ou a musica)

ffmpeg -i in.mp4 -i new-audio.mp3 -map 0:0 -c:v copy -map 1 -c:a copy -shortest out.mp4

Para reduzir o volume do audio que está sendo colocado

ffmpeg -i video.mp4 -i audio.aac -shortest -filter:a "volume=0.15" -map 0:0 -map 1 -c:v copy -c:a aac out.mp4

Contar a quantidade de frames do video

$ ffprobe -select_streams v -show_streams VID_20170917_135221811.mp4 2>/dev/null | grep "nb_frames"
nb_frames=18079

esse comando tem varias informacoes de video

$ ffprobe -select_streams v -show_streams VID_20170917_135221811.mp4 2>/dev/null
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=High
codec_type=video
codec_time_base=5422753/325422000
codec_tag_string=avc1
codec_tag=0x31637661
width=1920
height=1080
coded_width=1920
coded_height=1080
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuvj420p
level=40
color_range=pc
color_space=smpte170m
color_transfer=smpte170m
color_primaries=smpte170m
chroma_location=left
field_order=unknown
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=30/1
avg_frame_rate=162711000/5422753
time_base=1/90000
start_pts=0
start_time=0.000000
duration_ts=54227530
duration=602.528111
bit_rate=16999112
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=18079
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:creation_time=2017-09-17T17:02:26.000000Z
TAG:language=eng
TAG:handler_name=VideoHandle
[/STREAM]

Juntar dois audios, e colocar terceiro em cima diminuindo o volume

export FN=montagem.mp3 && ffmpeg -i audio.mp3 -i fundo.mp3 \
-hide_banner -filter_complex "\
[0:a] \
amerge=inputs=1[voice]; \
[1:a] volume=0.6 [aBackgrond];
[voice][aBackgrond]amix=inputs=2:duration=shortest:normalize=0[a]" \
-map "[a]" -c:a libmp3lame -b:a 128K "${FN}"

Splitar audio ou video

Fazer split do vídeo em vários de mesmo tamanho

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:20:00 -f segment -reset_timestamps 1 output%03d.mp4

Fazer split mudando o contador

$ bash <(curl -s -L http://bit.ly/39TxtVc)

Cortar audio ou video

Cortando da melhor forma possível mantendo o codec

ffmpeg -ss 00:00:05 -t 00:00:10 -i input -c:v copy -c:a copy -copyinkf  output

Cortar vídeo enquanto junta dos vídeos

Pegar apenas um pedaço de uma parte do vídeo

ffmpeg -i in.mp3 -filter_complex "\
[0:v] trim= start=0 :end=10, setpts= PTS-STARTPTS,fifo [vF]; \
[0:a] atrim=start=0 :end=10, asetpts=PTS-STARTPTS,afifo [aF] \
" -map [vF] -map [aF] out.mp4

Descubra o melhor segundo para cortar o video para nao fazer freezing nem ficar embacado

ffprobe -select_streams v -show_frames -print_format csv -show_entries frame=key_frame,pkt_dts_time input.mp4  | grep "frame,1"

Cortar video reduzindo o bitrate e ripando como x264

ffmpeg -v quiet -y -i in.mp4 -b:v 4.5m -vcodec libx264 -acodec copy -ss 00:10:44 -sn out.mp4

Cortar video suprimindo warnings

time ffmpeg -v quiet -y -i IMG_5765.mp4 -vcodec copy -acodec copy -ss 00:00:00 -t 00:00:30 -sn IMG_5765-part1.mp4

Cortar video mantendo codec

ffmpeg -ss 00:00:00 -t 00:13:31 -i in.mp4 -vcodec copy -acodec copy out.mp4

Cortar com maior compressao

avconv -v quiet -y -i IMG_5765.mp4 -vcodec libx264 -acodec copy -ss 00:00:00 -t 00:00:30 -sn IMG_5765-part1.mp4

Cortar reduzindo o framerate

ffmpeg -i IMG_5765.mp4 -crf 29.97 -vcodec libx264 -acodec copy -ss 00:00:00 -t 00:00:30 -sn IMG_5765-part1.mp4

Juntar dois videos

Forma 1

$ cat list.txt 
file output-7.mp4
file output-6.mp4

$ ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4

Forma 2

VIDEOS=('001.mp4' '002.mp4') &&\
ffmpeg -f concat -safe 0 -i <( for x in ${VIDEOS[@]} ; do echo "file '$PWD/$x'"; done )  -c copy out.mp4

Forma 3: Mantendo o audio dos vídeos

Essa forma requer re-encoding

ffmpeg -i part1.mp4 -i part2.mp4 -i part3.mp4 \
-filter_complex "\
  [0:v] [0:a] \
  [1:v] [1:a] \
  [2:v] [2:a] \
  concat=n=3:v=1:a=1 [v] [a] \
" -map "[v]" -map "[a]"  -hide_banner -preset ultrafast -c:v libx264 output.mp4

Forma 3.1: Quando um dos vídeos não tem áudio

Você precisa criar um canal de audio dummy

ffmpeg -i part01.mp4 -i part02.mp4 -f lavfi -t 0.1 -i anullsrc \
-filter_complex "\
  [0:v] [0:a] \
  [1:v] [2:a] \
  concat=n=2:v=1:a=1 [v] [a] \
" -map "[v]" -map "[a]" -hide_banner -preset ultrafast -c:v libx264 output.mp4

Se tiver o erro

Too many packets buffered for output stream 0:0.

Então adicione a opção

-max_muxing_queue_size 9999

Forma 3.2: Quando você tem 3 pedaços e apenas o vídeo do meio tem áudio

Será criado um canal de áudio dummy para preencher o primeiro e o último vídeo, o vídeo do meio ficará com o áudio original

ffmpeg -i part1-no-audio.mp4 -i part2.mp4 -i part3-no-audio.mp4 -f lavfi -t 0.1 -i anullsrc \
-filter_complex "\
  [0:v] [3:a] \
  [1:v] [1:a] \
  [2:v] [3:a] \
  concat=n=3:v=1:a=1 [v] [a] \
" -map "[v]" -map "[a]" -hide_banner -preset ultrafast -c:v libx264 edited/output.mp4

Como o vídeo tem 3 -i logo ele tem 3 streams (0, 1, 2), temos que fazer um map que mantém os vídeos inalterados e usa o audio dummy do 4º canal para preencher os vídeos 1 e 3 que não tem som

[0:v] [3:a] vídeo 1: use o vídeo dele mesmo e o audio dummy
[1:v] [1:a] vídeo 2: use o vídeo e o audio dele mesmo
[2:v] [3:a] vídeo 3: use o vídeo dele mesmo e o audio dummy

Juntar dois áudios

ffmpeg -i a.webm -i b.webm \
-filter_complex "[0:a] [1:a] concat=n=2:v=0:a=1 [a]" -map "[a]" \
-c:a ac3 -b:a 192K out.ac3

Reduzir tamanho do video reduzindo a qualidade

Reduzir tamanho do video diminuindo o bitrate

As cameras costumam gravar com bitrate bem acima do que necessário (17 mbps) para subir no youtube voce soh precisa de algo em torno de 4300 k

ffmpeg -i my-video.mp4 -c:v libx264 -b:v 4300k out.mp4

Reduzir o tamanho pelo framerate

O mais recomendado para diminuir o tamanho do video é usar o framerate porque assim o ffmpeg sozinho calcula o melhor bitrate (joga fora o excesso)

ffmpeg -v quiet -y -i in.mp4 -crf 30 -vcodec libx264 -acodec copy out.mp4

Legendas

Cores da legenda

<font color=“white”>…</font>

Ripar legenda no video

ffmpeg -i input.mp4 -filter:v "subtitles=input.srt:force_style='Fontsize=6,PrimaryColour=&H0000ff&'" -c:a copy output.mp4

Exemplo para video de 1080p (limitando o framerate)

ffmpeg -i 2019_02_08_08_09_37.mp4 -filter:v "subtitles=2019_02_08_08_09_37.srt:force_style='Fontsize=6,Alignment=3'" -b:v 12M -c:a copy output-7.mp4

Colocar textos no vídeo

Forma 1 - com word wrap, filtro subtitle

sub.srt

1
00:00:00,000 --> 00:00:05,000
This is new whiteboard testing no padding and the text is overflowing from the video frame check this  need to acheve word wrapping

2
00:02:00,000 --> 00:02:05,000
Depois do uso constatei que é bem confortável

comando simples

ffmpeg -i in.mp4 -vf "subtitles=sub.srt:force_style='Fontname=Ubuntu,Fontsize=18,PrimaryColour=&H00FFFFFF&,OutlineColour=&H00000000&,MarginV=25' out.mp4

comando completo

export FN=out.mp4
ffmpeg -i in.mp4 -hide_banner \
-hide_banner -filter_complex "\
  [0:v] [0:a] \
  concat=n=1:v=1:a=1 [vTmp] [a]; \
  [vTmp] subtitles=sub.srt:force_style='Fontname=Ubuntu,Fontsize=18,PrimaryColour=&H00FFFFFF&,OutlineColour=&H00000000&,MarginV=25' [v] \
" -map "[v]" -map "[a]" \
-c:a ac3 -b:a 128k -b:v 5M -c:v h264_nvenc "${FN}"

Criando um vídeo a partir de um texto arquivo srt

sub.srt

1
00:00:00,000 --> 00:00:05,000
This is new whiteboard testing no padding and the text is overflowing from the video frame check this  need to acheve word wrapping

command

ffmpeg -y -f lavfi -i color=c=white:s=640x480:d=5 -vf "subtitles=sub.srt" output.mp4

Texto no meio do vídeo do segundo 15 ao 20

O formato é sempre em segundos, você pode fazer coisas como 1*60 para converter para minutos

ffmpeg -i part02.mp4 -vf drawtext="text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: \
boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2: enable='between(t,15,20)'" -codec:a copy output.mp4

Colocar texto no vídeo enquanto junta dois videos / Juntar dois videos e colocar texto

Opção 1 - Coloca um texto centralizado na tela no segundo 30 até o 40 do vídeo depois de juntar as três partes

ffmpeg -i 00.mov -i 01.mov -i 02.mov \
-filter_complex "\
  [0:v] [0:a] \
  [1:v] [1:a] \
  [2:v] [2:a] \
  concat=n=3:v=1:a=1 [v] [a]; \
  [v]drawtext='text=Hello World!: fontcolor=white: fontsize=28: box=1: boxcolor=black@0.5: \
  boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2: enable=between(t,30, 40)' [vResult]" \
-map "[vResult]" -map "[a]"  -hide_banner -c:a ac3 -c:v libx264 \
result.mp4

Opção 2 -

ffmpeg -i v1.mp4 -i v2.MP4 \
-hide_banner -filter_complex "\
  [1:v]drawtext=text='Meu texto': fontcolor=white: fontsize=34: box=1: boxcolor=black@0.5: \
  boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2: enable='between(t,60+30, 60+43)' [v1];
  [0:v] [0:a] \
  [v1] [1:a] \
  concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" \
-b:v 22M -c:v h264_nvenc out.mp4

Opção 3 - Texto com multiplas linhas

ffmpeg -i one.mp4 -i two.mp4 \
-hide_banner -filter_complex "\
  [0:v] [0:a] \
  [1:v] [1:a] \
  concat=n=2:v=1:a=1 [v] [a]; \
[v]drawtext='text=Caixa tem 26x26x26cm
deve estar dando uns 11lts livre! :fontcolor=white: fontsize=36: box=1: boxcolor=black@0.5: \
  boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2: enable=between(t,5*60+13, 5*60+18)' [vResult] \
" -map "[vResult]" -map "[a]" \
-c:a ac3 -b:a 128K -b:v 4M -c:v h264_nvenc out.mp4

Texto todo à direita do vídeo

ffmpeg -i part02.mp4 -vf drawtext="text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: \
boxborderw=5: x=(w-text_w): enable='between(t,0,20)" -codec:a copy output.mp4

Texto Multiline: todo à direita do vídeo, com um pequeno espaçamento das extremidades e com borda preta, com duas linhas (multiplas linhas)

OUT=output.mp4 && ffmpeg -i part02.mp4 -vf drawtext="text='Stack Overflow
Other Text' \
:x=(w-text_w) - 5 :y=5 :enable='between(t,0,20) \
:fontcolor=white: fontsize=30 \
:borderw=2 :bordercolor=black \
" -codec:a copy ${OUT}

Texto multiline: Especificar a fonte desejada

OUT=output.mp4 && ffmpeg -i part02.mp4 -vf drawtext="text='Stack Overflow
Other Text :fontfile=/usr/share/fonts/opentype/linux-libertine/LinLibertine_M.otf' \
:x=(w-text_w) - 5 :y=5 :enable='between(t,0,20) \
:fontcolor=white: fontsize=24 \
:borderw=2 :bordercolor=black \
" -codec:a copy ${OUT}

Texto multiline: tabulado com background e fonte ubuntu monospaced

Isso garante que o texto ficará tabulado

OUT=output.mp4 && ffmpeg -i joined.mp4 -i narracao.wav -vf drawtext="text='São Paulo.............\: Gasolina = 4.500, Álcool = 2.890
Ipiranga Frango Assado\: Gasolina = 4.799, Álcool = 3.399
Graal Perdões.........\: Gasolina = 4.617, Álcool = 3.297
Posto Petrobrás BR-135\: Gasolina = 4.850, Álcool = 3.180
Posto Opção II - MOC..\: Gasolina = 4.850, Álcool = 3.250' \
:x=(w-text_w) - 5 :y=5 :enable='between(t,45,60) \
:fontcolor=white :fontsize=30 :fontfile=/usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf \
:box=1 :boxcolor=black@0.5 :boxborderw=5
" -c:a aac -map 0:v:0 -map 1:a:0 -c:v libx264 -preset ultrafast ${OUT}

Texto multiline: (Forma 2)

FONT_FILE=/usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf \
FONT_SIZE=30 \
LINE_HEIGHT=5 \
DEFAULT_FORMAT="drawtext=fontsize=${FONT_SIZE} :fontfile=${FONT_FILE} :x=0 :y=0" &&\
ffmpeg -i part01.mp4 -vf "[in]\
  ${DEFAULT_FORMAT} :fontcolor=White :text='onLine1' :x=(w)/2 :y=(h) / 2\
, ${DEFAULT_FORMAT} :fontcolor=Red :text='onLine2' :x=(w)/2 :y=(h) / 2 + (${LINE_HEIGHT} + ${FONT_SIZE}) * 1 \
, ${DEFAULT_FORMAT} :fontcolor=Blue :text='onLine3' :x=(w)/2 :y=(h) / 2 + (${LINE_HEIGHT} + ${FONT_SIZE}) * 2 \
[out]" -hide_banner -c:v libx264 -c:a copy -preset ultrafast output.mp4

Textos em vários trechos do vídeo

FONT_FILE=/usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf \
FONT_SIZE=30 \
LINE_HEIGHT=5 \
DEFAULT_FORMAT="drawtext=fontsize=${FONT_SIZE} :fontfile='${FONT_FILE}' :x=5 :y=5 :fontcolor=White " &&\
ffmpeg -i part01.mp4 -vf "[in]\
  ${DEFAULT_FORMAT} :enable='between(t,1,10)' :text='First text' \
, ${DEFAULT_FORMAT} :enable='between(t,15,20)' :text='Second text' \
, ${DEFAULT_FORMAT} :enable='between(t,21,30)' :text='Third text' \
[out]" -hide_banner -c:v libx264 -c:a copy -preset ultrafast output.mp4

Texto com fade in / fade out

Gere o comando com essa ferramenta

No segundo 5 ele tem fade in de 2 segundos e no segundo 10 ele tem fade out de 2

FONT_FILE=/usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf \
FONT_SIZE=30 \
LINE_HEIGHT=5 \
DEFAULT_FORMAT="drawtext=fontsize=${FONT_SIZE} :fontfile=${FONT_FILE} :x=0 :y=0" &&\
ffmpeg -i part01.mp4 -vf "[in]\
  ${DEFAULT_FORMAT} :fontsize=50 :fontcolor=White :text='E assim vamos terminando mais uma viagem ...' :x=(w)/2 :y=(h) / 2 \
    :alpha='if(lt(t,5),0,if(lt(t,12),(t-5)/2,if(lt(t,12),1,if(lt(t,19),(2-(t-12))/2,0))))' \
[out]" -hide_banner -c:v libx264 -c:a copy -preset ultrafast output.mp4

Convertendo video FPS dos videos

for i in *.mp4; do 
	echo "> converting $i"
	ffmpeg -v quiet -y -i "$i" -crf 30 -vcodec libx264 -acodec copy "${i%.mp4}-30-fps.mp4"
done

Quando várias vídeos tem diferentes resoluções

Deixar todos os vídeos com 1280x720 esticando os vídeos (nao respeita o aspect ratio)

ffmpeg -i part1.mp4 -i part2.mp4 -i part2.mp4 \
-filter_complex "\
  [0:v] scale=1280x720,setdar=16/9 [v0];
  [1:v] scale=1280x720,setdar=16/9 [v1];
  [2:v] scale=1280x720,setdar=16/9 [v2];
  [v0] [0:a] \
  [v1] [1:a] \
  [v2] [2:a] \
  concat=n=3:v=1:a=1 [v] [a] \
" -map "[v]" -map "[a]"  -hide_banner -c:a aac -c:v libx264 edited/monte-azul-sp-19.mp4

Juntar os vídeos respeitando o aspect ratio e colocando fundo preto

ffmpeg -i vid1.mp4 -i vid2.mp4  \
-hide_banner -filter_complex "\
  [0:v] scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1 [v0];
  [1:v] scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1 [v1];
  [v0] [0:a] \
  [v1] [1:a] \
  concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" \
-c:a aac -b:v 6M -c:v h264_nvenc edited/out.mp4

Establizar o video

Forma 1

ffmpeg -i in.mp4 -vf deshake out.mp4

Forma 2

IN=/data/sjcam/2019-06-04/2016_0101_073012_003.MOV &&\
OUT="${IN%.*}-stabilized.mp4" &&\
export PATH="/opt/ffmpeg-4.1.3-amd64-static:$PATH" &&\
ffmpeg -i "$IN" -vf vidstabdetect=shakiness=10 -f null - &&\
ffmpeg -i "$IN" -crf 30 -vcodec libx264 -acodec ac3 -vf vidstabtransform=smoothing=30:input="transforms.trf",unsharp=5:5:0.8:3:3:0.4 $OUT

Mostrar 2 videos lado a lado com o audio do primeiro

Forma 2 - Setando uma resolução x, mantendo o aspectio ratio e colocando texto

ffmpeg \
  -i a.MP4 \
  -i b.MP4 \
  -filter_complex "\
    [0:v][1:v]hstack=inputs=2[v];\
    [0:a] amerge=inputs=1[a]; \
    [v] scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1, drawtext='text=HDR: fontcolor=white: fontsize=40: box=1: boxcolor=black@0.5: \
    boxborderw=5: x=(text_h): y=(text_h)',drawtext='text=NORMAL: fontcolor=white: fontsize=40: box=1: boxcolor=black@0.5: \
    boxborderw=5: x=(w - text_w - 3): y=(text_h)' [vFinal] \
  " -map "[vFinal]" -map "[a]" \
  -t 26 -copyinkf \
  -c:a ac3 -b:a 128k -b:v 6M -c:v h264_nvenc -vsync 2 \
  out.mp4

Forma 1 - Duplicando a resolução

ffmpeg \
  -i input0 \
  -i input1 \
  -filter_complex "\
    [0:v][1:v]hstack=inputs=2[v];\
    [0:a]amerge=inputs=1[a]\
  " \
	-map "[v]" \
	-map "[a]" \
	output.mp4

Mostrar 3 videos lado a lado (1x3)

ffmpeg \
  -i 2016_0101_000111_003.MOV \
  -i 2016_0101_065406_003.MOV \
  -i 2016_0101_001359_001.MOV \
  -filter_complex "[0:v][1:v][2:v]hstack=3" \
  output.mp4

Mostrar 3 videos (2x2)

ffmpeg \
  -i 2016_0101_000111_003.MOV \
  -i 2016_0101_065406_003.MOV \
  -i 2016_0101_001359_001.MOV \
  -filter_complex \
  "[0:v][1:v]hstack[top]; \
 [2:v]hstack[bottom]; \
 [top][bottom]vstack,format=yuv420p[v]; \
 [0:a]amerge=inputs=1[a]" \
  -map "[v]" \
  -map "[a]" \
  -ac 2 \
  output.mp4

Mostrar 4 videos (2x2) com som

Apenas o som do primeiro video

ffmpeg \
  -i 2016_0101_000111_003.MOV \
  -i 2016_0101_065406_003.MOV \
  -i 2016_0101_001359_001.MOV \
  -i 2016_0101_001359_001.MOV \
  -filter_complex \
  "[0:v][1:v]hstack[top]; \
 [2:v][3:v]hstack[bottom]; \
 [top][bottom]vstack,format=yuv420p[v]; \
 [0:a]amerge=inputs=1[a]" \
  -map "[v]" \
  -map "[a]" \
  -ac 2 \
  -c:v libx264 \
  -c:a ac3 \
  output.mp4

Os 4 com som

ffmpeg \
  -i 2016_0101_000111_003.MOV \
  -i 2016_0101_065406_003.MOV \
  -i 2016_0101_001359_001.MOV \
  -i 2016_0101_001359_001.MOV \
  -filter_complex \
  "[0:v][1:v]hstack[top]; \
 [2:v][3:v]hstack[bottom]; \
 [top][bottom]vstack,format=yuv420p[v]; \
 [0:a][1:a][2:a][3:a]amerge=inputs=4[a]" \
-map "[v]" -map "[a]" -ac 2 output.mp4

Efeitos

Fade in

Começa o video preto e faz fade in de 2 segundos a partir do segundo 0

ffmpeg -i part01.mp4 -vf "fade=in:st=0:d=2" -hide_banner -c:v libx264 -c:a copy -preset ultrafast output.mp4

Fade in / Fade out no video e audio

Vídeo começa com um fade in no segundo zero que dura 1 segundo e termina com fadeout no segundo 13 que demora 2 segundos

ffmpeg -loop 1 -i fim-video-v1.jpg -i fim-video.ac3 \
  -c:v libx264 -crf 21 -t 15 -tune stillimage -c:a ac3 -b:a 192k -pix_fmt yuv420p -shortest \
  -vf 'fade=in:st=0:d=1,fade=out:st=13:d=2' \
  -af 'volume=0.20,afade=in:st=0:d=1,afade=out:st=13:d=2' \
  fim-video-v1.mp4

Audio

Remover audio do video

ffmpeg -i example.mkv -c copy -an example-nosound.mkv

Colocar audio no fundo enquanto junta partes sem normalização ffmpeg 4+

export FN=edited/test.mp4 ffmpeg -i 01.mp4 -i 02.mp4 -i 'background.mp3' \
-hide_banner -filter_complex "\
[0:v] [0:a] \
[1:v] [1:a] \
concat=n=2:v=1:a=1 [v] [voice]; \
[2:a] volume=0.015 [aBackgrond];
[voice][aBackgrond]amix=inputs=2:duration=shortest:normalize=0[a] \
" -map "[v]" -map "[a]" \
-c:a ac3 -b:a 192K -b:v 22M -c:v h264_nvenc -vsync 2 "${FN}"

Substituir audio por um audio maior que o video

video fica parado e audio tocando

export FN=edited/intro.mp4
ffmpeg -i intro.mp4 -i 'intro.aac' \
-hide_banner -filter_complex "\
[0:v] [1:a] \
concat=n=1:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" \
-c:a ac3 -b:a 192K -b:v 22M -c:v h264_nvenc -vsync 2 "${FN}"

Colocar Audio no fundo do vídeo / Audio fundo

Forma 5: Enquanto junta partes

export FN=edited/video.mp4
ffmpeg -i v1.mp4 -i v2.mp4 -i background.mp3 \
-hide_banner -filter_complex "\
  [0:v] [0:a] \
  [1:v] [1:a] \
  concat=n=2:v=1:a=1 [v] [aTemp]; \
  [aTemp] volume=1.5 [a]; \
  [2:a] volume=0.02 [aBackgrond];
  [a][aBackgrond]amix=inputs=2:duration=shortest[aFinal] \
  " -map "[v]" -map "[aFinal]" \
-c:a ac3 -b:a 192K -b:v 22M -c:v h264_nvenc "${FN}"

Forma 4: Mantendo audio original e tocando os dois ao mesmo tempo

ffmpeg -i input.mp4 -i narracao.wav -c:a aac -map 0:v:0 -map 1:a:0 -c:v libx264 -preset ultrafast output.mp4

Forma 1: Substituindo o audio original do video

ffmpeg -i input.mp4 -i input.mp3 -c copy -c:a ac3  -shortest -map 0:v:0 -map 1:a:0 output.mp4

Forma 2: Substituindo o audio original do video

AUDIOS=('one.mp3' 'two.mp3') &&\
IN_VIDEO=in.mp4 &&\
VIDEO_DURATION=$(ffmpeg -i ${IN_VIDEO} 2>&1 | grep -oP "Duration: \K(\d+:\d+:\d+)") &&\
ffmpeg \
-f concat -safe 0 -i <( for x in ${AUDIOS[@]} ; do echo "file '$PWD/$x'"; done ) \
-i "${IN_VIDEO}" \
-codec copy \
-t ${VIDEO_DURATION} \
out.mp4

Forma 3: Mantendo audio original e tocando os dois ao mesmo tempo

ffmpeg -i input.mp4 -i input.wav \
-filter_complex amix=inputs=2:duration=longest \
-c:v copy -c:a aac -preset ultrafast output.mp4

Mutar parte do vídeo

Mutando duas partes do vídeo

ffmpeg -i input.mp4 -af "\
  volume=enable='between(t,5,10)':volume=0 \
, volume=enable='between(t,33,36)':volume=0 \
" -c:a aac -c:v copy output.mp4

[Adicionar uma audio track no video]

ffmpeg -i video.avi -i audio1.mp3 -i audio2.mp3 -map 0 -map 1 -map 2 -codec copy output

Aumentar / Diminuir volume do audio

Se for um audio

ffmpeg -i input.wav -filter:a "volume=0.5" output.wav

Se for um vídeo

ffmpeg -i joined.mp4 -filter:a "volume=0.15" -c:a aac -c:v copy reduced-volume.mp4

Fazer timelapse de video / Aumentar a velocidade do video

1    = normal
0.5  = 2x
0.1  = 10x
0.05 = 20x

ffmpeg -i in.mp4 -filter:v "setpts=0.05*PTS" -an out.mp4

Converter para GIF

ffmpeg \
 -ss 30 \
 -t 3 \
 -i input.mp4 \
 -vf "fps=10,scale=1080:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 \
 output.gif

Converter para webp animado

ffmpeg -i agachamento.mp4 \
  -vcodec libwebp -lossless 0  -compression_level 3 -q:v 70 -loop 1 -preset picture -an -vsync 0 \
  -filter:v fps=fps=10 -s 1280:720 \
agachamento.webp

Colocar imagem no inicio ou final do vídeo

Transforme a imagem num vídeo

ffmpeg  -loop 1 -i edited/final.jpg -t 00:00:20 -c:v libx264 -vf scale=1920:1080 -pix_fmt yuv420p edited/final.mp4

Junte os dois vídeos, para fazer isso veja o passo Forma 3.2 de como juntar vídeos

Slideshow

A cada 5 segundos vai troca de imagem

v4 - Resolve a questao de pular imagens


# padronizar o nome das imagens
i=0 && ls -v *.jpg | while read f; do mv $f $(printf "%04d.jpg" $i); let i=i+1; done

# padronizar a dimensao
for f in *.jpg; do \
 convert $f -resize 1920x1080 -background black -compose Copy -gravity center -extent 1920x1080 $f; \
done

# criar o slideshow
ffmpeg -r 1/5 -i %4d.jpg -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1" slideshow.mp4

# colocar audio 
ffmpeg -i slideshow.mp4 -i trilha.ac3 -c copy -c:a ac3  -shortest -map 0:v:0 -map 1:a:0 slideshow-final.mp4

Também funciona

export FN=slideshow-transbike-v3.mp4 
ffmpeg -r 1/5 -i transbike/%2d.jpg -vf fps=25 "tmp.$FN" &&\
ffmpeg -r 1/5 -i "tmp.$FN" -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1" "$FN" &&\
rm "tmp.$FN"

v3.1 - Tempo customizado para cada imagem

ffmpeg -y \
  -loop 1 -t 0.9 -i 1.jpg \
  -loop 1 -t 1.2 -i 2.jpg \
  -loop 1 -t 1.2 -i 3.jpg \
  -loop 1 -t 1.2 -i 4.jpg \
  -loop 1 -t 1.2 -i 5.jpg \
  -loop 1 -t 1 -i 6.jpg \
  -filter_complex "concat=n=6:v=1:a=0" \
  -c:v libx264 -r 25 -movflags +faststart so-gira-girando.mp4

v3 - Mantem o aspect ratio da imagem original

ffmpeg -framerate 1/5 -i %02d.jpg -r 30 -pix_fmt yuv420p -c:v libx264 \
  -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1" \
  slideshow.mp4

v2

ffmpeg -framerate 1/5 -i %02d.jpg -r 30 -pix_fmt yuv420p -c:v libx264 -vf scale=1920x1080,setdar=16:9 fotos-slide.mp4

Parar renomear as fotos em nomes sequencias


# apenas imprime
i=0 && ls -v *.jpg | while read n; do echo $(printf "%04d.jpg" $i); let i=i+1; done

# renomeia 
i=0 && ls -v *.jpg | while read f; do mv $f $(printf "%04d.jpg" $i); let i=i+1; done

Para converer de PNG para JPG

 for i in *.png; do ffmpeg -i  $i "${i%.png}.jpg" ; done

Colocar imagem no meio do vídeo / Colocar foto no video / Sobrepor video com imagem

Uma imagem só

ffmpeg -i VID_20201102_122619504-ed1.mp4 -i grafico-bt-vs-lk.png -filter_complex "\
[0:v][1:v] overlay=10:10:enable='between(t,19 * 60 + 9, 19 * 60 + 9 + 10)'\
" -hide_banner -c:v libx264 -c:a aac -preset ultrafast VID_20201102_122619504-ed2.mp4

Duas ou mais imagens

ffmpeg -i input.mp4 -i image1.jpg -i image2.jpg -i image4.jpg -filter_complex "\
[0:v][1:v] overlay=10:10:enable='between(t,60,65)' [v1]; \
[v1][2:v] overlay=10:10:enable='between(t,65,70)' [v2]; \
[v2][3:v] overlay=10:10:enable='between(t,70,75)'\
" -preset ultrafast out.mp4

Colocar imagem no meio do vídeo enquanto junta dois vídeos e escreve um texto

ffmpeg -i v0.mp4 -i v1.mp4 -i img0.jpg \
-filter_complex "\
  [0:v] [0:a] \
  [1:v] [1:a] \
  concat=n=2:v=1:a=1 [v] [a]; \
  [v]drawtext=text='Meu texto': fontcolor=white: fontsize=34: box=1: boxcolor=black@0.5: \
  boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2: enable='between(t,41, 50)' [vResult]; \
  [vResult] [2:v] overlay=0:0:enable='between(t, 60 * 4 + 43, 60 * 4 + 53)' [vResult2] \
" -map "[vResult2]" -map "[a]"  -hide_banner  \
-c:v libx264 -c:a aac out.mp4

Setar framerate do vídeo

ffmpeg -i input -c:v libx264 -b:v 2M -maxrate 2M -bufsize 1M output.mp4

Usando VP9

Com máxima qualidade, porém a velocidade está ficando baixa 0.400x

ffmpeg -y -i campos-02.mp4 -crf 21 -b:v 0 -row-mt 1 -threads 12 -c:v libvpx-vp9  campos-02.webm

Com boa qualidade, velocidade aceitável 1.0x

ffmpeg -y -i campos-02.mp4 -crf 21 -b:v 0 -row-mt 1 -threads 12 -c:v libvpx-vp9  campos-02.webm

Juntar scale com drawtext

ffmpeg -i in.mp4 -vf "scale=2560x1440:flags=lanczos, drawtext=text='É woofer mesmo...."  out.mp4

Encodar com a placa de video nvidia

# v2 (melhor custo beneficio) 
$ ffmpeg -i in.mp4 -c:v h264_nvenc -b:v 26M out.mp4

# v2 ( com bitrate automatico ), mas nao deixe de informar o -b, senao vai encodar com bitrate baixissimo
$ ffmpeg -i in.mp4 -c:v h264_nvenc -b:v 0 out.mp4

# v2 Para altissima qualidade
$ ffmpeg -i in.mp4 -c:v h264_nvenc -profile:v high -b:v 26M out.mp4

# v1
$ ffmpeg -hwaccel cuvid -hwaccel_output_format cuvid -i in.mp4 \
-c:v h264_nvenc -b:v 26M out.mp4


Criar musica de fundo a repetindo várias vezes

ffmpeg -i 'song.mp3' -i 'song.mp3'  \
-i 'song.mp3' -i 'song.mp3' \
-i 'song.mp3' -i 'song.mp3' \
-i 'song.mp3'  \
-filter_complex "\
  [0:a] \
  [1:a] \
  [2:a] \
  [3:a] \
  [4:a] \
  [5:a] \
  [6:a] \
  concat=n=7 :v=0 :a=1 [a]; [a]volume=0.015 [aFinal] \
" -map "[aFinal]" -c:a aac fundo.aac

Mergear dois audios para que eles toquem ao mesmo tempo

ffmpeg -i background.aac -i audio.aac \
-filter_complex amix=inputs=2:duration=first:dropout_transition=0 \
out.aac

Mudar aspect ratio do video cortando / fazer crop do video

Convertendo de 1920x1080 para 720x1280

export FN=edited/br-122-ba-short.mp4 W=720 H=1280
ffmpeg -i DJI_0667.MP4 -vf "scale=(iw*sar)*max($W/(iw*sar)\,$H/ih):ih*max($W/(iw*sar)\,$H/ih), crop=$W:$H" \
-c:a ac3 -b:a 128k -b:v 22M -c:v h264_nvenc -t 59 "${FN}" 

keywords

ffmpeg commands, avconv commands, ffmpeg examples, ffmpeg exemplos, ffmpeg bookmarks


Cordova Commands Java Test Commands

Comments