nlve/build.sh
chaiman b59cdb1352 Нелинейный видеоредактор без перекодирования
Куски видео вырезаются и склеиваются копированием потока: сборка ролика
занимает время копирования файла, а не время рендера. Композитинга нет
принципиально — при перекрытии побеждает клип с верхней дорожки целиком,
и картинкой, и звуком. Именно это ограничение и делает сборку копированием
возможной.

Что внутри:

- монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание,
  схлопывание, громкость на клипе;
- предпросмотр прямо с монтажа через libmpv и виртуальный список кусков,
  без промежуточных файлов;
- сборка через ffmpeg с точными резами: перекодируется только огрызок от
  реза до ближайшего опорного кадра, остальное копируется;
- разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее
  опроса ffprobe;
- перепаковка контейнеров, кадрирование и поворот, сведения о проекте;
- свои цвета всего окна: системные элементы под Windows цвет не берут,
  поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами;
- окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с
  официальных источников;
- кросс-сборка под Windows и работа под Wine.

Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00

176 lines
5.7 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#
# Сборка nlve.
#
# ./build.sh редактор под эту систему
# ./build.sh current то же самое
# ./build.sh windows редактор под Windows (кросс-сборка)
# ./build.sh tool консольный инструмент проверок
# ./build.sh test инструмент плюс прогон проверок
# ./build.sh all всё перечисленное
# ./build.sh run собрать под эту систему и запустить
# ./build.sh clean убрать промежуточные файлы сборки
#
# Тулчейн берётся из fpcupdeluxe, а не из системы. Это не придирка:
# системный Lazarus другой версии, и собранные им модули LCL с нашими
# несовместимы — сборка падает на ровном месте.
set -u
HERE=$(cd "$(dirname "$0")" && pwd)
FPCUP=${FPCUP:-/home/chaiman/fpcupdeluxe}
LAZBUILD="$FPCUP/lazarus/lazbuild"
LAZCONF="$FPCUP/config_lazarus"
# Собранный виджетсет только один — gtk2. Ни qt5, ни gtk3 в этом
# тулчейне нет, подставлять их бессмысленно.
LCL_LINUX=gtk2
# Под Windows виджетсет называется win32 и работает в том числе на 64 битах:
# это имя интерфейса, а не разрядности.
LCL_WINDOWS=win32
status=0
fail() {
echo "ОШИБКА: $*" >&2
exit 1
}
note() {
echo
echo "=== $* ==="
}
check_toolchain() {
[ -x "$LAZBUILD" ] || fail "не найден lazbuild: $LAZBUILD
Задайте другой корень через переменную FPCUP, например:
FPCUP=/путь/к/fpcupdeluxe ./build.sh"
}
# Из вывода lazbuild интересны только ошибки и итог. Подсказок о
# неиспользованных параметрах там сотни, и за ними не видно главного.
run_lazbuild() {
local title=$1
local rc
shift
note "$title"
"$LAZBUILD" --primary-config-path="$LAZCONF" "$@" 2>&1 \
| grep -viE "^Hint: \(lazbuild\)|^Hint: \(lazarus\)|Start of reading config|End of reading config" \
| grep -iE "error|fatal|warning|Linking|lines compiled|Compiling package"
# Код возврата берём у lazbuild, а не у grep: grep возвращает 1 просто
# потому, что ничего не нашёл, и это не ошибка сборки.
#
# PIPESTATUS читается сразу же и в переменную. Любая следующая команда
# его затирает — даже двоеточие. На этом скрипт уже один раз соврал:
# сборка падала, а он докладывал «готово».
rc=${PIPESTATUS[0]}
return "$rc"
}
build_current() {
check_toolchain
if run_lazbuild "Редактор под эту систему ($LCL_LINUX)" \
--ws="$LCL_LINUX" "$HERE/nlve.lpi"; then
echo "готово: $HERE/nlve"
else
echo "не собралось" >&2
status=1
fi
}
build_windows() {
check_toolchain
if run_lazbuild "Редактор под Windows (x86_64)" \
--cpu=x86_64 --os=win64 --ws="$LCL_WINDOWS" "$HERE/nlve.lpi"; then
echo "готово: $HERE/nlve.exe"
# Печатаем, что именно получилось: перепутать разрядность легко, а
# заметить это без запуска под Windows нечем.
file "$HERE/nlve.exe" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
else
echo "не собралось" >&2
status=1
fi
# Кросс-сборка оставляет модули для Windows в том же каталоге, что и
# родные. Следующая сборка под Linux их не тронет и возьмёт как свои,
# после чего компоновщик выдаст непонятную ошибку. Поэтому чистим.
rm -rf "$HERE/lib/x86_64-win64"
}
build_tool() {
note "Консольный инструмент проверок"
if "$HERE/tests/build.sh"; then
:
else
echo "не собралось" >&2
status=1
fi
}
run_tests() {
build_tool
[ "$status" -eq 0 ] || return
note "Проверки уплощения монтажа"
if "$HERE/tests/nlvetool" flattest; then
echo "проверки пройдены"
else
echo "проверки не пройдены" >&2
status=1
fi
}
do_clean() {
note "Уборка"
rm -rf "$HERE/lib" "$HERE/tests/lib"
rm -f "$HERE/nlve.dbg"
echo "убраны промежуточные файлы сборки"
echo "готовые двоичные файлы (nlve, nlve.exe, tests/nlvetool) оставлены"
}
case "${1:-current}" in
current|linux|"")
build_current
;;
windows|win|win64)
build_windows
;;
tool)
build_tool
;;
test|tests)
run_tests
;;
all)
build_current
build_windows
run_tests
;;
run)
build_current
[ "$status" -eq 0 ] || exit 1
note "Запуск"
exec "$HERE/nlve"
;;
clean)
do_clean
;;
-h|--help|help)
# Печатаем шапку файла до первой строки, которая уже не комментарий.
awk 'NR>2 { if ($0 !~ /^#/) exit; sub(/^# ?/, ""); print }' "$0"
;;
*)
fail "неизвестная цель: $1
Доступны: current, windows, tool, test, all, run, clean"
;;
esac
echo
if [ "$status" -eq 0 ]; then
echo "ИТОГ: без ошибок"
else
echo "ИТОГ: были ошибки"
fi
exit "$status"