LINUX.ORG.RU

Non-monotonic DTS

 , , ,


0

1

Здравствуйте. Готовлю небольшой фильм, когда сцен стало слишком много и ждать сборки всего за раз стало долго, решил сделать инкрементальную сборку сцен на основе 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 это не устраняет



Последнее исправление: kvpfs_2 (всего исправлений: 2)
Ответ на: комментарий от Bfgeshka

Спасибо, я, конечно, попробую, но вначале хотелось бы понять причины. Я не на свалке нашел видики, всё генерил ffmpeg со своими энкодерами/muxer’ами, в итоге он жалуется на свой же выхлоп на предыдущем шаге. Даже если и какая-то волшебная опция поможет, для меня это просто наугад пока

kvpfs_2
() автор топика

Разобрался. В двух сценах было по 1 одному фрейму, оставил как фон для наложения cgi чуть в будущем. Сейчас доделал эти сцены, ушла ошибка DTS и с фпс всё норм стало. Похоже ffmpeg не работает корректно при количестве фреймов ниже некоторого порога. Хз, но вообще похоже на баг

kvpfs_2
() автор топика