Ошибка ffmpeg при попытке объединить 2 части с разной скоростью

Ошибка ffmpeg при попытке объединить 2 части с разной скоростью

Я пытаюсь объединить части одного и того же входного видео, но одно из них ускорено в 20 раз. Код, который я использую, следующий:

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"

Есть идеи, что я делаю не так, насчет невозможности выделить память? У меня 16 ГБ памяти и работает только ffmpeg...

Ошибки:

[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

решение1

Похоже, это ошибка в FFmpeg, связанная с объединением видео с самим собой.
Возможный обходной путь — использовать один и тот же входной файл дважды (как будто это два входных файла):

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"


Следующее объяснение — всего лишь предположение:
при конкатенации двух частей одного и того же ввода, я думаю, есть случаи, когда FFmpeg сохраняет много декодированных кадров в памяти (буферизация кадров). Цель буферизации — избежать декодирования одних и тех же кадров несколько раз. При использовании одного и того же ввода дважды каждый вход декодируется отдельно (избегайте буферизации). Я не уверен насчет механизма буферизации, но он может объяснить ошибку «Невозможно выделить память».

Связанный контент