nlve/build.sh

289 lines
11 KiB
Bash
Raw Normal View History

Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
#!/bin/bash
#
# Сборка nlve.
#
# ./build.sh редактор под эту систему
# ./build.sh current то же самое
# ./build.sh windows редактор под Windows (кросс-сборка)
# ./build.sh tool консольный инструмент проверок
# ./build.sh macos две сборки под macOS: nlve_intel и nlve_arm
Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
# ./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"
Показатель работы внизу: ход, участок на монтаже, переключатель журнала Полоска выполнения теперь показывает всё, что делается в стороне от окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она знала только про звук и миниатюры, а самое долгое — пересборку участков с прозрачностью — не показывала вовсе. Как она растёт. Настоящая доля известна только вехами: вставка готова, файл разобран. Между вехами не происходит ничего видимого, и полоска, стоящая на месте, выглядит как зависшая программа. Поэтому между вехами она ползёт сама — к следующей вехе, но никогда её не достигая: каждый шаг покрывает малую долю оставшегося расстояния. Работа идёт как задумано — веха приходит быстро и полоска прыгает к ней; затянулась — шаги мельчают, и заполнение само собой замедляется. Назад не идёт никогда, полной без настоящего конца не становится. Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его можно было прогнать числами, и прогоняется: проверки в tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути десять шагов таймера, до трёх четвертей — ещё десять. Участок монтажа, который сейчас пересобирается, помечается косой штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а рамка на узком участке была бы неразличима; штрих наклонный, чтобы его не спутать с курсором и границами клипов — те все вертикальные. Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями, состояние переживает перезапуск. Системный TStatusBar не взят намеренно: его рисует система, и под Windows он остался бы светлой полосой — ровно та беда, из-за которой уже переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей нижней панели, теми же средствами.
2026-08-22 00:52:09 +03:00
# Компилятор нужен напрямую для консольных проверок без формы.
FPC="$FPCUP/fpc/bin/x86_64-linux/fpc.sh"
Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
# Собранный виджетсет только один — 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"
}
Наложение в предпросмотре сводится заранее; номер сборки в заголовке Клип, не заполняющий кадр, стал уходить плееру отдельной дорожкой, и весь показ пошёл через цепочку фильтров. Цепочка работает всё время показа и считается процессором: на кадре 2688x1512 видео начало отставать от звука. Теперь плееру достаются только прозрачные клипы и клипы с ключом — ради них это оправдано, их участки бывают длинными, и пересобирать минуты материала дорого. Клип, который просто не заполняет кадр, сводится заранее вместе с тем, что под ним: предпросмотр играет обычный файл и показывает ровно то, что даст сборка. Попутно, из разбора того же случая: — заполнитель до первого наложения нарезается по длине файла. Одной записью mpv её обрезает («entry 0 uses 7082.687000 seconds, but file has only 15.021000»), дорожка оказывается короче монтажа и не совмещается с ним по времени; — появление заготовки вызывает перезагрузку списка: строка списка при этом не меняется, и без признака готовности плеер так и оставался без дорожки наложения; — в журнал пишется, сколько окон наложения и готовы ли файлы, а также собранная цепочка показа и неудача video-add. Без этого «картинки нет» нечем объяснить. В заголовке окна теперь номер сборки: nlve 42 — фильм.nlve. Он растёт на единицу при каждой сборке. По нему сразу видно, та ли это сборка, где правка уже есть, — сегодня время ушло на то, что проверяли старым двоичным файлом. Счётчик в build.number, в репозиторий не входит. Проверено на монтаже с картинкой на 300-й секунде: в окне она лежит поверх видео, цепочки показа нет.
2026-10-16 17:19:57 +03:00
# Номер сборки. Растёт на единицу при каждой сборке редактора и попадает
# в заголовок окна.
#
# Зачем: по заголовку сразу видно, та ли это сборка, где правка уже есть.
# Без него человек проверяет старым двоичным файлом и видит прежнее
# поведение — так уже случалось, и время ушло на выяснение, у кого что
# не работает.
#
# Счётчик лежит рядом с исходниками, но в репозиторий не входит: он про
# эту машину, а не про историю проекта.
bump_version() {
local file="$HERE/build.number" n
n=0
[ -f "$file" ] && n=$(cat "$file" 2>/dev/null || echo 0)
case "$n" in
''|*[!0-9]*) n=0 ;;
esac
n=$((n + 1))
echo "$n" > "$file"
cat > "$HERE/src/uBuildInfo.inc" <<EOF
{ Создаётся build.sh при каждой сборке. В репозиторий не входит. }
const
BuildNumber = $n;
BuildStamp = '$(date '+%d.%m.%Y %H:%M')';
EOF
echo "сборка номер $n"
}
Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
build_current() {
check_toolchain
Наложение в предпросмотре сводится заранее; номер сборки в заголовке Клип, не заполняющий кадр, стал уходить плееру отдельной дорожкой, и весь показ пошёл через цепочку фильтров. Цепочка работает всё время показа и считается процессором: на кадре 2688x1512 видео начало отставать от звука. Теперь плееру достаются только прозрачные клипы и клипы с ключом — ради них это оправдано, их участки бывают длинными, и пересобирать минуты материала дорого. Клип, который просто не заполняет кадр, сводится заранее вместе с тем, что под ним: предпросмотр играет обычный файл и показывает ровно то, что даст сборка. Попутно, из разбора того же случая: — заполнитель до первого наложения нарезается по длине файла. Одной записью mpv её обрезает («entry 0 uses 7082.687000 seconds, but file has only 15.021000»), дорожка оказывается короче монтажа и не совмещается с ним по времени; — появление заготовки вызывает перезагрузку списка: строка списка при этом не меняется, и без признака готовности плеер так и оставался без дорожки наложения; — в журнал пишется, сколько окон наложения и готовы ли файлы, а также собранная цепочка показа и неудача video-add. Без этого «картинки нет» нечем объяснить. В заголовке окна теперь номер сборки: nlve 42 — фильм.nlve. Он растёт на единицу при каждой сборке. По нему сразу видно, та ли это сборка, где правка уже есть, — сегодня время ушло на то, что проверяли старым двоичным файлом. Счётчик в build.number, в репозиторий не входит. Проверено на монтаже с картинкой на 300-й секунде: в окне она лежит поверх видео, цепочки показа нет.
2026-10-16 17:19:57 +03:00
bump_version
Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
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_macos() {
check_toolchain
# Сборка под macOS кладёт файл туда же, куда и сборка под Linux, и
# затирает её: имя цели в проекте одно на все системы. Поэтому каждый
# файл переименовывается сразу, а линуксовая сборка в конце делается
# заново.
if run_lazbuild "Редактор под macOS (Intel)" \
--cpu=x86_64 --os=darwin --ws=cocoa "$HERE/nlve.lpi"; then
mv -f "$HERE/nlve" "$HERE/nlve_intel"
echo "готово: $HERE/nlve_intel"
file "$HERE/nlve_intel" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
else
echo "не собралось" >&2
status=1
fi
if run_lazbuild "Редактор под macOS (Apple Silicon)" \
--cpu=aarch64 --os=darwin --ws=cocoa "$HERE/nlve.lpi"; then
mv -f "$HERE/nlve" "$HERE/nlve_arm"
echo "готово: $HERE/nlve_arm"
file "$HERE/nlve_arm" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
else
echo "не собралось" >&2
status=1
fi
# Обёртку .app делает lazbuild, и внутри неё ссылка на файл с именем
# nlve, которого после переименования уже нет. Обманчивая пустышка не
# нужна.
rm -rf "$HERE/nlve.app"
# Модули под darwin лежат отдельно, но сборку под Linux мы затёрли —
# возвращаем её на место.
note "Возвращаю сборку под эту систему"
build_current
echo
echo "ВНИМАНИЕ: под macOS предпросмотра не будет — встраивание mpv"
echo "написано под X11 и Windows. Подробности в BACKLOG.md."
}
Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
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
Показатель работы внизу: ход, участок на монтаже, переключатель журнала Полоска выполнения теперь показывает всё, что делается в стороне от окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она знала только про звук и миниатюры, а самое долгое — пересборку участков с прозрачностью — не показывала вовсе. Как она растёт. Настоящая доля известна только вехами: вставка готова, файл разобран. Между вехами не происходит ничего видимого, и полоска, стоящая на месте, выглядит как зависшая программа. Поэтому между вехами она ползёт сама — к следующей вехе, но никогда её не достигая: каждый шаг покрывает малую долю оставшегося расстояния. Работа идёт как задумано — веха приходит быстро и полоска прыгает к ней; затянулась — шаги мельчают, и заполнение само собой замедляется. Назад не идёт никогда, полной без настоящего конца не становится. Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его можно было прогнать числами, и прогоняется: проверки в tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути десять шагов таймера, до трёх четвертей — ещё десять. Участок монтажа, который сейчас пересобирается, помечается косой штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а рамка на узком участке была бы неразличима; штрих наклонный, чтобы его не спутать с курсором и границами клипов — те все вертикальные. Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями, состояние переживает перезапуск. Системный TStatusBar не взят намеренно: его рисует система, и под Windows он остался бы светлой полосой — ровно та беда, из-за которой уже переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей нижней панели, теми же средствами.
2026-08-22 00:52:09 +03:00
Квадратные кнопки со значками, журнал перестал уезжать из-под курсора Двойной щелчок по кнопке журнала. Причина оказалась не в кнопке: журнал лежал ниже полосы состояния. Спрятали журнал — полоса уехала вниз на сто тридцать пикселей, кнопка ушла из-под курсора, и следующий щелчок в то же место попадал уже мимо. Порядок исправлен: полоса состояния теперь самая нижняя, журнал над ней, и при переключении ничего не движется. Прилипание, схлопывание и журнал стали квадратными кнопками со значками и собраны в один набор. Надписи переехали в подсказки — целиком, вместе с состоянием: у значка нет другого способа рассказать о себе. Подсказка всплывает через десятую долю секунды и держится пятнадцать. Значки рисуются кодом, а не берутся из файла: программа не должна зависеть от того, лежит ли рядом с ней картинка. Рисунки придуманы в icons/*.svg — оттуда их можно перегнать в png чем угодно, проверено командой convert. Свойства из файлов форм теперь проверяются отдельной программой по сведениям о типах. Файл формы разбирается при запуске, а не при сборке: опечатка в имени свойства или в значении перечисления даёт не ошибку компиляции, а падение окна на старте. Проверка включена в build.sh.
2026-08-22 01:08:58 +03:00
# Свойства, записанные в файлах форм, проверяются по сведениям о типах.
# Файл формы разбирается при запуске, а не при сборке: опечатка в имени
# свойства даёт не ошибку компиляции, а падение окна на старте.
note "Проверка свойств из файлов форм"
if "$LAZBUILD" --primary-config-path="$LAZCONF" \
"$HERE/tests/lfmcheck/lfmcheck.lpi" >/dev/null 2>&1; then
if "$HERE/tests/lfmcheck/lfmcheck"; then
:
else
status=1
fi
Цветовой ключ и живое наложение в предпросмотре Клипу задаётся цвет, который при сборке становится прозрачным. Окно ключа показывает кадр: цвет берётся щелчком по нему, выбитое показано клеткой, допуск и смягчение края — ползунками. Открывается из окна кадрирования и из меню «Правка», на монтаже клип помечен квадратиком выбиваемого цвета. Предпросмотр перестал сводить такие участки в файлы. Плеер играет две дорожки одна поверх другой: оверлей во весь ролик больше не заставляет пересобирать весь фильм после каждой правки. Замерено: наложение стоит 0.4 с на 10 с материала 2688x1512, вчетверо быстрее реального времени. Починено в сборке: уменьшенный клип обкладывался чёрными полями, и они закрывали собой нижнее видео — оставалась видна только дырка, выбитая ключом. Теперь верхний слой кладётся по координатам, тем же, по которым его показывает предпросмотр. Смещение по горизонтали и вертикали работает и там, где картинка меньше кадра проекта: раньше уменьшенный клип нельзя было сдвинуть в угол. Проверки форм теперь создают каждое окно из файла формы: элемент, забытый в классе, вскрывается на сборке, а не при открытии окна.
2026-08-31 00:10:28 +03:00
# Окно зависимостей при создании записывает рядом с собой список
# пакетов по умолчанию. Проверке это не мешает, а в дереве исходников
# такому файлу не место.
rm -f "$HERE/tests/lfmcheck/deps-linux.json"
Квадратные кнопки со значками, журнал перестал уезжать из-под курсора Двойной щелчок по кнопке журнала. Причина оказалась не в кнопке: журнал лежал ниже полосы состояния. Спрятали журнал — полоса уехала вниз на сто тридцать пикселей, кнопка ушла из-под курсора, и следующий щелчок в то же место попадал уже мимо. Порядок исправлен: полоса состояния теперь самая нижняя, журнал над ней, и при переключении ничего не движется. Прилипание, схлопывание и журнал стали квадратными кнопками со значками и собраны в один набор. Надписи переехали в подсказки — целиком, вместе с состоянием: у значка нет другого способа рассказать о себе. Подсказка всплывает через десятую долю секунды и держится пятнадцать. Значки рисуются кодом, а не берутся из файла: программа не должна зависеть от того, лежит ли рядом с ней картинка. Рисунки придуманы в icons/*.svg — оттуда их можно перегнать в png чем угодно, проверено командой convert. Свойства из файлов форм теперь проверяются отдельной программой по сведениям о типах. Файл формы разбирается при запуске, а не при сборке: опечатка в имени свойства или в значении перечисления даёт не ошибку компиляции, а падение окна на старте. Проверка включена в build.sh.
2026-08-22 01:08:58 +03:00
else
echo "не собралось" >&2
status=1
fi
Показатель работы внизу: ход, участок на монтаже, переключатель журнала Полоска выполнения теперь показывает всё, что делается в стороне от окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она знала только про звук и миниатюры, а самое долгое — пересборку участков с прозрачностью — не показывала вовсе. Как она растёт. Настоящая доля известна только вехами: вставка готова, файл разобран. Между вехами не происходит ничего видимого, и полоска, стоящая на месте, выглядит как зависшая программа. Поэтому между вехами она ползёт сама — к следующей вехе, но никогда её не достигая: каждый шаг покрывает малую долю оставшегося расстояния. Работа идёт как задумано — веха приходит быстро и полоска прыгает к ней; затянулась — шаги мельчают, и заполнение само собой замедляется. Назад не идёт никогда, полной без настоящего конца не становится. Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его можно было прогнать числами, и прогоняется: проверки в tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути десять шагов таймера, до трёх четвертей — ещё десять. Участок монтажа, который сейчас пересобирается, помечается косой штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а рамка на узком участке была бы неразличима; штрих наклонный, чтобы его не спутать с курсором и границами клипов — те все вертикальные. Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями, состояние переживает перезапуск. Системный TStatusBar не взят намеренно: его рисует система, и под Windows он остался бы светлой полосой — ровно та беда, из-за которой уже переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей нижней панели, теми же средствами.
2026-08-22 00:52:09 +03:00
# Ход полоски выполнения проверяется отдельной программой: расчёт вынесен
# в uAppTypes именно затем, чтобы его можно было прогнать числами.
note "Проверка хода полоски выполнения"
if "$FPC" -Fu"$HERE/src" -FE"$HERE/tests/progress" \
-o"$HERE/tests/progress/progtest" \
"$HERE/tests/progress/progtest.lpr" >/dev/null 2>&1; then
if "$HERE/tests/progress/progtest"; then
:
else
status=1
fi
else
echo "не собралось" >&2
status=1
fi
Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
}
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
;;
macos|mac|darwin)
build_macos
;;
Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
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, macos, tool, test, all, run, clean"
Нелинейный видеоредактор без перекодирования Куски видео вырезаются и склеиваются копированием потока: сборка ролика занимает время копирования файла, а не время рендера. Композитинга нет принципиально — при перекрытии побеждает клип с верхней дорожки целиком, и картинкой, и звуком. Именно это ограничение и делает сборку копированием возможной. Что внутри: - монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание, схлопывание, громкость на клипе; - предпросмотр прямо с монтажа через libmpv и виртуальный список кусков, без промежуточных файлов; - сборка через ffmpeg с точными резами: перекодируется только огрызок от реза до ближайшего опорного кадра, остальное копируется; - разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее опроса ffprobe; - перепаковка контейнеров, кадрирование и поворот, сведения о проекте; - свои цвета всего окна: системные элементы под Windows цвет не берут, поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами; - окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с официальных источников; - кросс-сборка под Windows и работа под Wine. Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
;;
esac
echo
if [ "$status" -eq 0 ]; then
echo "ИТОГ: без ошибок"
else
echo "ИТОГ: были ошибки"
fi
exit "$status"