RU
Опись прежнего окна (NiceGUI, 2.6.1)
Что окно на NiceGUI делает само, помимо передачи формы движку. Снято 15.10.2026 с кода эталона
E:\TOOLS\Audion Media Tools NiceGUI (system_core\ui_nicegui\app.py 5970 строк, window.py, workbench.py) и с его консольных
меню. Каждая строка при переносе получает отметку в последнем столбце: перенесено, заменено (чем) или убрано, потому что.
Параметры, которые окно отдаёт движку, записаны отдельно и числом: tests\former_window_parameters.json (сценарий
tests\capture_former_window_parameters.py). Тексты окна - подписи и подсказки - снимаются в карту прежнего окна (раздел 10.3 спека).
Куда: модель - system_core\core\operation_model.py (правила формы, одна копия для окна и консоли); движок - служба или
media_cli.cmd; окно - Avalonia; данные - манифест, раскладка, Source\config\i18n.json.
1. Запуск и окно
| Что | Где | Куда | Отметка |
|---|---|---|---|
Окно - браузерная рамка: window.py поднимает сервер app.py (127.0.0.1:8080), ждёт порт, открывает pywebview; PID сервера в logs\gui_server.pid |
window.py |
убрано: окно - один исполняемый файл | убрано: окно - один AudionMediaTools.exe, сервера и порта нет |
Размер 1600 × 900, наименьший 1280 × 720 (из ui манифеста) |
window.py load_ui_defaults |
заменено: 1500 × 880 / 1180 × 700, как у Image Tools | заменено: 1500 × 880, наименьший 1180 × 700; размер помнится в window_settings.json |
Значок окна system_core\icons\app.ico, AppUserModelID Audion.Tools.<папка> |
window.py |
окно | перенесено: тот же app.ico (ApplicationIcon), AppUserModelID в Program.cs |
Сервер отказывается слушать не-loopback адрес без AUDION_ALLOW_REMOTE_GUI=1 |
assert_gui_host_allowed |
убрано: сервера нет | убрано: сервера нет |
| Второй запуск при занятом порте открывает уже работающее окно | main |
окно: один экземпляр на папку | заменено: один экземпляр на папку (Core\OneWindow.cs) - второй запуск поднимает первое окно |
--smoke: страница строится без браузера, перебор 429 состояний форм |
build_ui_once, run_gui_smoke |
заменено: самопроверка окна и тест модели по записи | заменено: --self-test собранного окна (каждая страница и поле) и тест модели по записи прежнего окна |
| Пул процессов NiceGUI отключается, если среда запрещает multiprocessing | tolerate_missing_process_pool |
убрано | убрано: NiceGUI нет |
Выбор файлов и папок - сценариями PowerShell (WinForms) через портативный pwsh, под заданием Windows, по одному диалогу; DPI-осведомлённость в каждом сценарии |
run_picker_script, pick_* |
заменено: диалоги Avalonia | заменено: диалоги Avalonia, без PowerShell |
| При выходе закрывается плеер mpv и задание диалогов | atexit, on_shutdown |
окно: закрытие окна закрывает плеер | перенесено: закрытие окна закрывает mpv (Player.Shared.Close) |
2. Настройки и состояние
| Что | Где | Куда | Отметка |
|---|---|---|---|
config\gui_settings.yaml: язык, тема, emoji, allow_runtime_switching, advanced_open; source_path и destination_path пишутся всегда пустыми |
save_app_settings |
заменено: config\window_settings.json |
заменено: config\window_settings.json - тема, язык, размер, шрифты, папки, формы |
Источник и Назначение при старте - из кэша путей (cached_source_path, cached_output_path), иначе Source и Transcoded |
state, _resolve_workspace_path |
окно (рабочая зона Image Tools), папки input / output |
перенесено: последние папки из window_settings.json, иначе input / output (MainWindow.Io.cs) |
| Смена темы и языка - запись настроек и перезагрузка страницы | set_theme, toggle_language |
окно: без перезапуска | заменено: тема и язык меняются на лету, без перезапуска |
Тем 7 (code_dark по умолчанию, code_graphite, code_light, code_warm, audion_light, audion_dark, asar_dark), токены поверх из config\ui_colors.yaml |
BUILTIN_THEMES, load_ui_colors |
заменено: четыре темы оболочки, Code Dark по умолчанию | заменено: четыре темы оболочки, Code Dark по умолчанию; ui_colors.yaml окном не читается |
| Состояние «Дополнительно» раскрыто или нет - в настройках | save_advanced_open |
окно | убрано, потому что «Дополнительно» всегда раскрыто под своим разделителем (владелец, 10.10.2026) |
Значения полей живут одни на все разделы: поле с тем же id (audio_bitrate, overwrite, input_formats…) переходит из раздела в раздел |
state["field_values"] |
решить: в новом окне - своё на раздел или общее | решено владельцем 15.10.2026 («формы раздельные»): своя форма у каждого режима, общие - только кодер и декодер; формы помнятся в window_settings.json |
История строки команд config\terminal_commands.json: до 200 команд, закреплённые, последняя, оболочка, папка (своя папка проекта хранится относительной) |
load_terminal_cache, save_terminal_cache |
окно | заменено: история строки команды Image Tools (Core\CommandHistory.cs), оболочка - App\AudionPs.exe |
Закреплённые пресеты (pinned_profiles) - идут первыми в списке профиля |
profile_options |
окно | убрано, потому что владелец против закрепления пресетов (15.10.2026) |
Кэш LUT config\lut_cache.json: выбранный, недавние, закреплённые |
core\lut_cache.py |
движок (describe), окно |
перенесено: движок core\lut_cache.py (config\gui_lut_cache.json), окно - закрепление и импорт (Views\Form.Lut.cs) |
3. Рабочая зона путей
| Что | Где | Куда | Отметка |
|---|---|---|---|
| Строки Источника и Назначения, история до 100 путей, закрепление, выбор папки, «один файл» Источником, открыть папку (файл - выделить в Проводнике), «Список» файлов Источника в журнал с номерами | workbench.py, workspace_*_handler, show_input_file_list |
заменено: рабочая зона Image Tools (MainWindow.Io.cs, PathHistory.cs) |
заменено: рабочая зона Image Tools (MainWindow.Io.cs, PathHistory.cs), история - config\path_history.json |
| «Сбросить»: история чистится, закреплённые остаются, оба пути - по умолчанию | reset_workspace_paths_click_handler |
Image Tools | перенесено: ResetPaths рабочей зоны |
Удалить содержимое Источника / Назначения - операциями движка cleanup_source / cleanup_transcoded с подтверждением и путём в нём; «оба» - сначала Источник, Назначение только после успеха |
workspace_delete_*_handler |
заменено: очистка в Корзину (FolderCleaner.cs) |
заменено: очистка в Корзину (FolderCleaner.cs); операции движка cleanup_* окном не зовутся |
| Смена Источника сбрасывает «Сведения» о прежнем | save_workspace_path |
окно | убрано, потому что «Сведения» - прогон в журнал, строки под формой нет: сбрасывать нечего |
| Во время операции пути не меняются («Другая операция уже выполняется») | обработчики рабочей зоны | окно | перенесено: рабочая зона заперта, пока идёт прогон (ApplyIoBusy) |
4. Разделы и формы
| Что | Где | Куда | Отметка |
|---|---|---|---|
| Дерево разделов: группа с одной операцией открывается сразу её формой; «Назад»; заголовок - путь разделов | compact_single_child_command_path, activate_command_node, command_nav_row |
заменено: ленты разделов и ленты внутри | заменено: ленты разделов и режимов (config\window_layout.yaml) |
| Операция без полей запускается по нажатию сразу | activate_command_node |
окно | перенесено: пункт СЕРВИС и СВЕДЕНИЯ запускает сразу |
| Дочерние операции с теми же полями, что у группы, - кнопками в строке над общей формой | can_inline_child_actions |
окно (раскладка данными) | заменено: кнопки у поля (window_layout.yaml, buttons) - ФОРМАТЫ у ссылки, DPAPI у cookies |
Кнопка «Сведения» (source_info) - только в разделах audio, archive, editing, storage, delivery, remux, fps, grading |
SOURCE_INFO_COMMAND_IDS |
данные раскладки | заменено: меню СВЕДЕНИЯ рабочей зоны - во всех разделах (window_layout.yaml, details) |
Поля по блокам: блок = group поля, без него - по таблице ключей (preset, source, codecs, backend, decode, audio, format, options, package, fps, color, encoding, run, иначе parameters) |
field_section_id |
данные: блок у каждого поля в манифесте | перенесено: блок задан у каждого поля в манифесте; ключевая таблица убрана |
Порядок блоков: workflow ставится перед preset, decode - перед backend; блоки mastering и channels - в полширины |
group_fields_by_section, render_field_grid |
данные раскладки | перенесено: порядок и ширина блоков - данными раскладки |
Блок из одного поля encode_backend, decode_backend или audio_mode рисуется без заголовка поля |
should_flatten_single_section_field |
окно | заменено: у блока, где выбор стоит первым, имя поля встаёт на место заголовка блока - один заголовок, не два (Views\Form.cs, TwoColumns) |
«Дополнительно»: поля с advanced, priority: advanced/expert/rare или окончанием _model_override, _chunk_tokens… (наследие LLM-проектов) |
is_advanced_field |
модель: только advanced и priority |
перенесено: модель - только advanced и priority; окончания LLM-проектов убраны |
Поле показано, если visible_if выполнено и hidden_if нет; поле, ещё не нарисованное, в условии читается своим умолчанием |
field_is_visible, _condition_actual_value |
модель | перенесено: модель (operation_model.py), тест по записи |
Условие: равенство без регистра, список - «любое из», not, neq, in, exists, all, any; для списка значений - пересечение |
_value_matches_condition |
модель | перенесено: модель, тест по записи |
Вариант выключен по disabled_if или невыполненному enabled_if; скрыт по visible_if / hidden_if |
option_is_disabled, option_is_visible |
модель | перенесено: модель, тест по записи |
При отрисовке переключатель с выключенным или чужим значением встаёт на первый разрешённый вариант (со связями set_field_value) |
render_field, радио |
модель | перенесено: модель - при открытии и каждом изменении, а не при отрисовке |
| При отрисовке ряд флажков оставляет только разрешённые и в порядке вариантов | render_field, sync_checkboxes |
модель | перенесено: модель, тест по записи |
При отрисовке пресет раздела применяет свои значения, если ещё не применён; профиль-список (youtube_preset) при этом не трогает флажки и списки |
render_field (пресеты, профиль) |
модель | перенесено: модель, тест по записи |
| Выпадающий список не предлагает выключенный вариант, но текущий оставляет | select_options |
модель | перенесено: модель; выпадающих списков в окне нет - кнопки вариантов |
| Нажатие пресета: значения пресета пишутся как есть (без связей), потом id пресета | apply_preset |
модель | перенесено: модель, тест по записи |
Связи на клик: контейнер MXF - звук в PCM 24 (кроме PCM 16/24 и «без звука»), MOV - FLAC меняется на PCM 24; MP3 - 384k меняется на 320k; режим remux - восстанавливает цели mp4 / mka |
set_field_value |
модель | перенесено: модель, тест по записи |
| Цветовой сценарий ставит гамму: пре-экспозиция 1,15, прегамма 0,85 (или из профиля сценария), иначе пусто | color_profile_gamma, set_script_preset_value |
модель | перенесено: модель, тест по записи |
Число целого шага приходит целым (2.0 → 2, запятая как точка) |
normalize_field_value |
модель | перенесено: модель |
▲▼ числа: шаг поля, зажим в min/max |
adjusted_number_value |
окно | заменено: число шагает клавишами ↑↓ с шагом поля, зажим в min / max (Views\Form.cs) |
Отказ до запуска: в ряду флажков меньше min_selected - «Выберите хотя бы один пункт: …» |
validate_pending_fields |
модель (код выхода 2) | перенесено: модель - отказ в строке состояния, в консоли код выхода 2 |
Опасная операция (kind: dangerous) - подтверждение с названием и предупреждением |
start_operation |
окно; из консоли опасное не запускается, как у Image Tools | перенесено: вопрос окна (MayRun); консоль опасное не запускает |
Тон варианта (copy / uncompressed / lossless / lossy) вычисляется по словам значения и подписи для полей форматов и кодеков и перекрывает tone манифеста |
detected_format_tone, FORMAT_TONE_FIELDS, *_FORMAT_TOKENS |
модель (describe отдаёт тон) |
перенесено: модель, describe отдаёт тон |
Варианты из функции (options_source, сейчас - файлы нарезки), кэш 45 с, ошибка - вариантом с текстом ошибки |
load_dynamic_options |
движок | перенесено: движок, форма-сервер |
LUT: список - закреплённые, выбранный, недавние, найденные в LUTs; выбор пишет кэш; импорт файлов или папки копирует в LUTs (папку - подпапкой) |
lut_options, _import_luts |
движок + окно | перенесено: движок (lut_cache.py) + окно (Views\Form.Lut.cs) |
| Образец 18 % серого: куда гамма до LUT переносит серый; для HDR→SDR - отметка tonemap | color_gamma_preview_state, render_color_gamma_preview |
окно, расчёт - модель | перенесено: окно (Views\Form.Colour.cs), расчёт - модель (gamma_preview) |
| Таблицы совместимости remux в окне - мёртвые: поля «исходный формат» нет, исходник определяет и проверяет движок своими таблицами | VIDEO_REMUX_COMPATIBILITY, ensure_remux_target_for_source |
убрано, потому что не вызывается | убрано, потому что не вызывались |
| Подсказка под целями remux: «Source определяется автоматически; несовместимые файлы будут пропущены с записью в лог» - в коде | render_field |
данные | перенесено: подсказка поля цели в манифесте - несовместимый файл пропускается с причиной |
5. Нарезка и плеер
| Что | Где | Куда | Отметка |
|---|---|---|---|
Файл нарезки - бейдж с именем (середина длинного имени вырезана, полное - в подсказке), счётчик n/N, стрелки по кругу; одна запись - стрелки выключены |
render_trim_file_field, trim_short_name |
окно | перенесено: окно (Views\Form.Trim.cs, TakeBar) |
| Смена файла стирает IN, OUT, строки и точки | step |
модель | перенесено: модель («take») |
| Звук или видео - по расширению; от этого зависят поля | trim_media_kind_of |
модель | перенесено: модель |
| Таблица ffprobe файла по кнопке | show_trim_probe |
окно, данные - движок | перенесено: окно, данные - движок (probe) |
Строки вариантов: строка 1 - trim_start / trim_end, дальше trim_rows; длительность куска: для «оставить» с одним IN - до конца файла, «вырезать» - только с обеими точками |
render_trim_variant_rows, trim_piece_seconds |
модель + окно | перенесено: модель + окно (TrimRows) |
«+» горит, когда последняя строка заполнена («оставить» - хотя бы одна точка, «вырезать» - обе), до предела TRIM_MAX_VARIANTS / SPLIT_MAX_POINTS; «+» очищает петлю A-B плеера |
trim_can_add, trim_add_click |
окно | перенесено: окно, пределы 20 вариантов / 30 точек |
| Разделение: точки только вперёд; точка позади - отказ с причиной | trim_split_take, mpv_apply_split_point |
модель | перенесено: модель + окно (отказ с причиной) |
| ▲▼ таймкода: шаг части, где стоит курсор (часы, минуты, секунды, кадр файла или миллисекунда для звука), зажатая кнопка повторяет через 420 мс, потом каждые 110 мс с растущим шагом | TRIM_SPINNER_JS |
окно | перенесено: окно (TimeBox, 420 / 110 мс); набор цифр сам ставит разделители |
| Плеер: «Открыть», «A-B», IN, OUT, «A» (точка разделения), «Точка», «Закрыть»; для разделения - свои кнопки | render_player_transport, mpv_action_handler |
окно (mpv по именованному каналу) | перенесено: окно говорит с mpv по именованному каналу (Core\Player.cs), без Python |
Точки берутся только если плеер показывает выбранный файл (сверка path); иначе - какой файл он показывает |
mpv_shows_chosen_file |
окно | перенесено: окно, сверка path |
| «Отметить здесь» ставит и точку в поле, и границу петли A-B плеера (кусок крутится) | mpv_mark_here |
окно | перенесено: окно, петля A-B плеера |
6. Запуск, журнал, строка команд
| Что | Где | Куда | Отметка |
|---|---|---|---|
| Одна операция за раз; статус «Выполняется: …», «Готово: … [код] N.Nс» | start_operation |
окно | перенесено: окно |
| Строка состояния: точка и полоса по состоянию (ожидание, идёт, готово, ошибка), часы прогона мм:сс, процент; обновление раз в 0,5 с, только изменившееся | build_ui refresh |
заменено: строка состояния Image Tools | заменено: строка состояния Image Tools |
Кнопка отмены в шапке видна во время работы; ставит cancel |
build_ui |
заменено: СТОП (stop.flag, задание Windows) |
заменено: СТОП (stop.flag, задание Windows); недописанный файл FFmpeg не остаётся (раздел 11) |
После операции: путь последнего отчёта, «Сведения» об источнике (строка под формой и в подвале журнала, с пометкой «устарело» при смене Источника), обновление бейджа железа после hardware_capabilities |
start_operation, probe_status_text |
окно | заменено: путь отчёта - строкой журнала; «Сведения» - прогоном в журнал; бейджи компонентов обновляются после установки, кодеры - в SETTINGS |
«Предпросмотр команды» - та же операция с dry_run и youtube_dry_run |
preview_operation_from_pending |
media_cli.cmd run --dry-run, кнопка окна |
перенесено: кнопка КОМАНДА перед ЗАПУСКОМ - у операций, которые умеют сухой прогон; консоль --dry-run прочим отказывает |
| Журнал: до 1500 строк, цвета ANSI → HTML, дописывание без перерисовки, прокрутка вниз - только если пользователь внизу и ничего не выделил | add_log, audionTerminalAppend |
заменено: журнал Image Tools | заменено: журнал Image Tools, цвета ANSI |
| Журнал в большом окне, очистка видимого, кнопки «Логи», «Отчёты» (встроенный список), «Конфиг» | build_ui, reports_view |
окно | перенесено: журнал во всю ширину, очистка, кнопки logs, report, config |
Строка команд: оболочка PowerShell / CMD, история и закреплённые, папка, «Папка» / «Файл» (файл дописывается аргументом в кавычках, папка становится рабочей), Ctrl+Enter; запуск службой sample_service:terminal_command |
terminal_command_bar, start_terminal_command |
заменено: строка команды на App\AudionPs.exe |
заменено: строка команды на App\AudionPs.exe |
Разделитель журнала тянется, ширина в localStorage (по умолчанию 640, левая часть не уже 520, правая 360) |
JS в build_ui |
окно | перенесено: разделитель тянется (GridSplitter), ширина помнится в window_settings.json (JournalWidth); журнал во всю ширину - кнопкой |
7. Диагностика и железо
| Что | Где | Куда | Отметка |
|---|---|---|---|
Бейдж железа в разделе «Диагностика»: процессор и видеоконтроллеры (CIM через powershell.exe), NVIDIA - nvidia-smi (имя, драйвер), версия FFmpeg, итог проверки кодеров из config\hardware_capabilities_cache.json; кэш 5 минут, кнопка обновить |
hardware_badge_data |
заменено: бейдж системы в SETTINGS, данные - движок | заменено: бейджи компонентов в заголовке и карта системы в SETTINGS (движок components), кодеры - из кэша проверки |
| Совет по драйверу NVIDIA: от 570 - «NVENC + свежий BtbN 8.x», от 471.41 - «BtbN 7.1.x», ниже - обновить; для AMD - AMF, Intel - QSV после проверки; RTX 50xx называется отдельно | hardware_badge_data |
движок (components), SETTINGS |
заменено: выбор сборки FFmpeg по драйверу - в установщике (план скачивания называет файл и причину) и в подсказке SETTINGS |
8. Тексты в коде
Полный список - в карте прежнего окна. Здесь - где они живут.
| Что | Где | Куда | Отметка |
|---|---|---|---|
34 подсказки полей, которых нет в манифесте; input_formats подсказки не получает |
FIELD_TOOLTIP_FALLBACKS, TOOLTIP_EXCLUDED_FIELD_IDS |
данные: манифест | перенесено: в манифест |
Подсказка поля - по цепочке tooltip → hint → description → запасная из кода |
field_tooltip |
модель | перенесено: модель |
| Подсказки кнопок журнала и строки команд, кнопок папок (с путём) | audion_terminal_action_tooltip, audion_folder_button_tooltip |
данные: i18n.json |
перенесено: i18n.json |
| Подписи окна RU / EN | LABELS |
данные: i18n.json |
перенесено: i18n.json, 0 без пары (check_i18n.py) |
| Подтверждения, образец серого, бейдж железа, подсказка remux - фразы в коде | по месту | данные | перенесено: данные (i18n.json, манифест) |
| Задержка подсказки 1500 мс, скрытие 100 мс | AUDION_CANONICAL_TOOLTIP_* |
окно (как у Image Tools) | перенесено: как у Image Tools (App.axaml) |
9. Мёртвое и наследие
| Что | Где | Куда | Отметка |
|---|---|---|---|
system_core\ui_nicegui\i18n.py (84 строки) - никем не импортируется |
убрано, потому что не используется | убрано: в окно не переносится; уходит с папкой ui_nicegui (этап 7) |
|
| Таблицы совместимости remux окна (раздел 4) | app.py 944-998, 2931-2987 |
убрано | убрано |
Значки-эмодзи в заголовках (emoji: false) |
em |
убрано | убрано |
_startup_workspace_path и _workspace_setting_for_disk возвращают постоянное, их параметры не читаются |
app.py 246-262 |
убрано | убрано |
| Окончания полей LLM-проектов в «Дополнительно» | ADVANCED_FIELD_SUFFIXES |
убрано | убрано |
10. Консольные меню и обёртки
| Что | Где | Куда | Отметка |
|---|---|---|---|
| Меню проекта на FZF с запасным числовым: YouTube, FPS 23.976, FPS SPEED SELECTOR, звук, LUT, ProRes / DNxHR, remux, x264 / HEVC, сборщик | launcher_project.cmd, cli\launcher-*.cmd |
убрано после описи: те же операции - окно и media_cli.cmd |
убрано на этапе 7: те же операции - окно и media_cli.cmd |
| FPS SPEED SELECTOR: режим (conform / varispeed), исходная частота (25…179,82 → 23,976), выход, PCM и передискретизация - переменными среды для обёртки | cli\launcher-select-fps-speed.cmd |
раздел ЧАСТОТА окна; переменные - в карте обёрток | перенесено: раздел ЧАСТОТА окна; переменные - в config\wrappers.yaml |
| Меню инструментов: проверка окружения, лицензии (сбор, чистка, дубли), архив выпуска, открыть папки | launcher_tools.cmd |
решить: сборщик и Build-стек | решено: проверки - СЕРВИС окна, лицензии и архив выпуска - Build-стек; меню уходит на этапе 7 |
95 обёрток Scripts\*.cmd - профиль того же имени в config\script_profiles.yaml; исполняет свой Scripts\Common\script_runner.py (2030 строк): общие с движком только контракты core\*_contract.py и _fps_output_args, команду FFmpeg он строит сам |
Scripts\ |
остаются; решить: свести их к media_cli.cmd run |
решено владельцем 15.10.2026: обёртки остаются и зовут media_cli.cmd wrapper; script_runner.py в Корзине, 95 из 95 сверены |
Ручки обёрток - около 45 переменных среды AUDION_* (источник, назначение, кодеки, бэкенд, CRF / CQ, звук, LUT, гамма, нарезка, частота…) |
script_runner.py, first_env |
карта обёрток | перенесено: config\wrappers.yaml |
Маркер проекта у cleanup_project.cmd - system_core\ui_nicegui\app.py, файл прежнего окна |
cleanup_project.cmd |
на этапе чистки - маркер system_core\cli.py |
на этапе 7 |
11. Найдено прогонами консольной команды
| Что | Где | Куда | Отметка |
|---|---|---|---|
СТОП посреди кодирования оставляет в Назначении недописанный файл (long.mp4, 2,6 МБ из 30 секунд); прежнее окно вело себя так же. Нарезка свой кусок убирает (аудит 2.6.0) |
encode_targets, run_process |
движок: писать во временное имя и ставить на место только целое, как Image Tools (.writing) |
исправлено 15.10: FFmpeg пишет имя.writing.ext, имя - только целому; СТОП и сбой не оставляют ничего (tests\test_writing_output.py) |
При остановке в журнал идёт трассировка Python RuntimeError: Operation cancelled by user. |
execute_operation |
движок: одна строка «остановлено» | исправлено 15.10: одна строка [STOPPED], без трассировки |
12. Найдено на материале владельца (15.10.2026, input)
| Что | Где | Куда | Отметка |
|---|---|---|---|
ProRes LT 4096×2160 (Ellie Goulding … Fragment.mov): r_frame_rate 24000/1001, avg_frame_rate 7188000/299299 = 24,016 (599 кадров на 24,94 с). Расхождение 0,17 % - ниже порога «плавающей» частоты (1 %), и нарезка берёт за сетку кадров 24,016: к 20-й секунде сетка уходит почти на кадр; «Сведения» пишут 24.016p |
media_service.py 4705-4711, 4077, 4993, 6210 (rate_source), 2191 (_rate_label(avg)) |
движок: при постоянной частоте - r_frame_rate, точная дробь; среднее - только если номинальной нет. Тест на этом файле |
исправлено 15.10: trim_contract.stream_rate во всех местах; «Частота» на этом файле - 23,976 → 23,976, скорость не меняется, итог 24000/1001 ровно |
ARRIRAW в MXF (ARRI_Helen_John_ALEXA_35_ARRIRAW.mxf, 10 ГБ): FFmpeg видит видеопоток без кодека и размеров. Нарезка отказывает внятно (TRIM_UNREADABLE_VIDEO), «Сведения» показывают ? |
_video_stream_is_unreadable, probe_source |
движок: в «Сведениях» - та же внятная фраза: ARRIRAW FFmpeg не декодирует | исправлено 15.10: «camera RAW, FFmpeg has no decoder» и фраза под таблицей |
Файл, который ещё копируется, даёт в «Сведениях» ERROR: … Permission denied и попадает в итоговую строку как видео всей папки |
probe_source |
движок: «файл занят» отдельной строкой, итог - по прочитанным | исправлено 15.10: строка «busy», итог - по прочитанным |
«Сведения» на стеке образцов: 25i (field_order=tt) показан 25p; плавающая частота - 28.875p без пометки VFR; у звукового файла в колонке видео ? вместо -; итог папки берётся с первого файла (24p, A: - у ARRIRAW) |
probe_source, _rate_label |
движок: 25i, VFR 30 (≈28,875), - у звука; итог - по большинству |
исправлено 15.10: 25i, VFR 30 (avg 28.875), - у звука, итог по большинству (tests\test_probe_source.py) |