Здравствуйте. Готовлю небольшой фильм, когда сцен стало слишком много и ждать сборки всего за раз стало долго, решил сделать инкрементальную сборку сцен на основе Makefile’а. Во всех исходниках сцен png фреймы, фпс везде == 30
define scenes_nl
scene_98
scene_99
scene_100
scene_101
scene_102
scene_103
scene_104
scene_105
scene_106
scene_107
scene_108
scene_109
scene_110
scene_111
scene_112
scene_113
scene_114
scene_115
scene_116
scene_117
scene_118
scene_119
scene_120
scene_121
scene_122
scene_123
scene_124
scene_125
scene_126
scene_127
scene_128
scene_129
scene_130
scene_131
scene_132
scene_133
scene_134
scene_135
scene_136
scene_137
endef
ffmpeg_options := -c:v libx264 -crf 18 -preset veryfast -c:a aac -b:a 128k -movflags +faststart -pix_fmt yuv420p -shortest
define NL
endef
scenes := $(subst ${NL}, ,${scenes_nl})
parts = $(addsuffix .mp4, $(addprefix parts/,${scenes}))
output.mp4 : ${parts}
if [[ -e list_tmp.txt ]]; then rm list_tmp.txt; fi
for f in ${parts}; do echo "file '$${f}'" >> list_tmp.txt; done
ffmpeg -y -f concat -i list_tmp.txt -c copy $@
parts/%.mp4 : %
if ! [[ -e $?/audio.m4a ]]; then cp -i empty.m4a $?/audio.m4a; fi
ffmpeg -y -framerate 30 -i $?/%04d.png -i $?/audio.m4a -map 0:0 -map 1:0 ${ffmpeg_options} $@
clean:
#-for s in ${scenes}; do rm $${s}/audio.m4a; done
-rm parts/*
-rm list_tmp.txt
Суть элементарная - сперва клепаю mp4 из каждой сцены (ffmpeg -y -framerate 30 -i $?/%04d.png -i $?/audio.m4a -map 0:0 -map 1:0 ${ffmpeg_options} $@), затем сливаю всё в один контейнер без перекодировки (ffmpeg -y -f concat -i list_tmp.txt -c copy $@).
Но появилась проблема - в выхлопе на втором шаге появились сообщения «Non-monotonic DTS; previous: 3803896, current: 3803875; changing to 3803897. This may result in incorrect timestamps in the output file» + если фпс в начале был 30, то у выходного файла он в районе 29.64. Что происходит? Как получить желаемое? Может на первом шаге mp4 неподходящий контейнер?
Заметил, что если аудио поток не шить в видики на первом шаге, то фпс у видика на вотором шаге == ожидаемым 30, но сообщения о DTS это не устраняет