у меня очень очень очень уродливый скрипт для объединения нескольких файлов моих футбольных игр (у меня 10 камер на игру), и теперь я начинаю делать основные моменты каждой игры. Но некоторые камеры имеют разную частоту кадров и используют разные кодеки. Так что теперь я совершенно не понимаю, как заставить их работать в Linux. Я был бы в порядке с графическим интерфейсом или другим программным обеспечением для редактирования видео, если бы это потребовалось.
Уродливый сценарий (для контекста)
#!/бин/баш
#списокфайлов=""
#для файла в $(ls -1v *.MP4);do #выводит список файлов с четными номерами
# filesList="${filesList}${file}|"
#сделано
#filesList=${filesList%?} # удаляет конечную вертикальную черту
#ffmpeg -i "concat:$filesList" -c копировать ../$(дата +%Y%m%d_%H%M%S)_merged.mp4
# настроить по своему усмотрению.
простая копия () {
printf "Хотели бы вы иметь миниатюру:\n"
выберите ответ в Да Нет Mkv
делать
сломать;
сделано
}
проверить папки () {
d=$(zenity --file-selection --title="Выберите каталог и объедините все файлы .MP4 внутри папки" --directory)
}
простойКопировать
checkFolders
компакт-диск "$d"
эхо $(пароль)
какManyFolders=$(ls -l -tr "$(pwd)" | grep -c ^d)
если [ $howManyFolders -gt 1 ]
тогда
checkFolders
фи
currentDate=$(дата +'%m.%d.%Y_%H.%M')
safeVideoName="${d/ /_}"
safeVideoName="${safeVideoName////}"
echo "safeVideoName: ${safeVideoName}"
videoName="../${safeVideoName}_${currentDate}_merged"
если [ "$ ответ" = "Да" ]
тогда
количествовидео = 0
видеофильтр=""
Список файлов=""
для файла в $(ls -1v | grep -i mp4); сделать
filesList="${filesList} -i ${file}"
videoFilter="${videoFilter}[${numberOfVideos}:v][${numberOfVideos}:a]"
пусть "количествовидео=количествовидео+1"
сделано
echo "видеофильтр: ${videoFilter}"
ffmpeg $filesList -vf "transpose=2,transpose=2,transpose=2" -filter_complex "${videoFilter}concat=n=${numberOfVideos}:v=1:a=1[vv][a];[vv ]overlay=main_w-overlay_w-5:main_h-overlay_h-5[v]:" -map "[v]" -map "[a]" ${videoName%/}.mp4
Элиф [ "$ ответ" = "Mkv" ]
тогда
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*.MP4' -printf "file '$PWD/%p'\n" | sort) -c copy ${videoName%/}. мкв
еще
лс-1в-тр | grep -i mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c копировать "${videoName%/}.mp4"
фи
Когда я объединяю файлы, файлы H.265 воспроизводятся нормально, но когда они доходят до MP4, у них есть только последний кадр из файлов H.265 и звук из MP4.
ошибка наблюдается при объединении
// cmd - echo ls -1v -tr | grep -i mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c копировать "${videoName%/}.mp4"
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f528e4d3c0] Автоматическая вставка фильтра битового потока h264_mp4toannexb
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:1; предыдущий: 655360, текущий: 626560; изменение на 655361. Это может привести к неверным временным меткам в выходном файле.
[concat @ 0x55f528e436c0] DTS 1116270 < 1167534 не по порядку
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:0; предыдущий: 1226574, текущий: 1175310; меняется на 1226575. Это может привести к неправильным отметкам времени в выходном файле.
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:1; предыдущий: 655361, текущий: 627584; изменяется на 655362. Это может привести к неправильным отметкам времени в выходном файле.
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:0; предыдущий: 1226575, текущий: 1178313; меняется на 1226576. Это может привести к неправильным отметкам времени в выходном файле.
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:1; предыдущий: 655362, текущий: 628608; изменяется на 655363. Это может привести к неправильным отметкам времени в выходном файле.
При необходимости могу предоставить примеры клипов :)