Estou tentando concatenar partes do mesmo vídeo de entrada, mas uma delas está acelerada em 20x. O código que estou usando é este:
ffmpeg -i 7.mp4 -filter_complex "[0:v]select='between(t,0,9)',setpts=PTS-STARTPTS[vn];[0:a]aselect='between(t,0,9)',asetpts=PTS-STARTPTS[an];[0:v]select='between(t,191,1174)',setpts=(1/20)*(PTS-STARTPTS)[vr];[0:a]aselect='between(t,191,1174)',atempo=20,asetpts=PTS-STARTPTS[ar];[vn][an][vr][ar]concat=n=2:v=1:a=1[vid]" -map [vid] -c:v libx265 -tag:v hvc1 -crf 23 -preset slow "output5.mp4"
Alguma idéia do que estou fazendo de errado, sobre a parte de não conseguir alocar memória, tenho 16 GB de memória e estou executando apenas o ffmpeg ....
Erros:
[h264 @ 00000181d923ccc0] get_buffer() failed
[h264 @ 00000181d923ccc0] thread_get_buffer() failed
[h264 @ 00000181d923ccc0] decode_slice_header error
[h264 @ 00000181d923ccc0] no frame!
[fc#0 @ 00000181d91dbdc0] Task finished with error code: -12 (Cannot allocate memory)peed=0.0342x
[fc#0 @ 00000181d91dbdc0] Terminating thread with return code -12 (Cannot allocate memory)
[vist#0:0/h264 @ 00000181db1bbcc0] [dec:h264 @ 00000181d91e4680] Error submitting packet to decoder: Invalid data found when processing input
Parece um bug no FFmpeg, relacionado à concatenação de um vídeo consigo mesmo.
A solução possível é usar o mesmo arquivo de entrada duas vezes (como se fossem dois arquivos de entrada):
ffmpeg -i 7.mp4 -i 7.mp4 -filter_complex "[0:v]select='between(t,0,9)',setpts=PTS-STARTPTS[vn];[0:a]aselect='between(t,0,9)',asetpts=PTS-STARTPTS[an];[1:v]select='between(t,191,1174)',setpts=(1/20)*(PTS-STARTPTS)[vr];[1:a]aselect='between(t,191,1174)',atempo=20,asetpts=PTS-STARTPTS[ar];[vn][an][vr][ar]concat=n=2:v=1:a=1[vid]" -map [vid] -c:v libx265 -tag:v hvc1 -crf 23 -preset slow "output5.mp4"
A seguinte expiação é apenas um palpite:
Ao concatenar duas partes da mesma entrada, acho que há casos em que o FFmpeg armazena muitos quadros decodificados na memória (armazenamento em buffer de quadros). O objetivo do buffer é evitar a decodificação dos mesmos quadros várias vezes. Ao usar a mesma entrada duas vezes, cada entrada é decodificada separadamente (evite buffer). Não tenho certeza sobre o mecanismo de buffer, mas isso pode explicar o erro “Não é possível alocar memória”.