From 79fe091fbb4f117c666cb5992e74fa04c32bf172 Mon Sep 17 00:00:00 2001 From: chaiman Date: Thu, 20 Aug 2026 11:58:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B2=D1=83=D0=BA=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BE=D0=B9,=20?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Найдена настоящая причина обеих жалоб на звук. Свойство audio-files, заданное перед загрузкой, не подключает внешний список кусков вовсе: проверено на живом mpv через его канал управления — после установки свойства дорожек по-прежнему две, обе не внешние. Играл звук, встроенный в саму картинку. Отсюда обе стороны: звук был слышен там, где на монтаже его нет (шёл из видеофайла), и не был слышен там, где есть (в этом месте картинкой была чёрная вставка, а она молчит). Правильный способ — команда audio-add с признаком select после загрузки. Проверено: дорожек становится четыре, внешняя звуковая выбрана, внутренняя снята с выбора. Если подключить не удалось, в журнал пишется предупреждение. Глушить звук на этот случай нельзя — прошлая попытка так сделать оставила без звука весь монтаж. --- README.md | 16 ++++++++++++++++ src/uMpvPlayer.pas | 26 +++++++++++++++++--------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c5aeca2..c844ace 100644 --- a/README.md +++ b/README.md @@ -421,6 +421,22 @@ mpv сам выбрал `nvdec-copy`, всё работало, и ошибки «Invalid floating point operation», и предпросмотр не запускался. Лечится `SetExceptionMask` после загрузки библиотеки. +**Внешняя звуковая дорожка не подключается свойством.** Задать +`audio-files` перед загрузкой недостаточно: список дорожек после +загрузки остаётся прежним, внешний файл не подключается вовсе, и играет +звук, встроенный в саму картинку. Проверено на живом mpv через его канал +управления: после установки свойства дорожек по-прежнему две, обе не +внешние. + +Из-за этого звук был слышен там, где на монтаже его нет. Попытка +защититься, отключая звук при ненайденной внешней дорожке, сделала +хуже — звука не стало нигде. + +Правильный способ — команда `audio-add` с признаком `select` после +загрузки: она добавляет дорожку, выбирает её и снимает выбор с +внутренней. Проверено: дорожек становится четыре, внутренняя звуковая +помечается невыбранной. + **Аргументы loadfile.** В mpv 0.38 у команды появился четвёртый аргумент — номер позиции в списке, и настройки файла сдвинулись на пятое место. Прежний вызов стал ошибкой «The loadfile option must be an integer», и под diff --git a/src/uMpvPlayer.pas b/src/uMpvPlayer.pas index c49fa53..73c67b2 100644 --- a/src/uMpvPlayer.pas +++ b/src/uMpvPlayer.pas @@ -658,14 +658,9 @@ end; procedure TMpvPlayer.SetAudioSource(const AUrl: string); begin - if FHandle = nil then - Exit; - if AUrl = FAudioSource then - Exit; + { Здесь только запоминаем. Подключается звук после загрузки картинки, + командой audio-add — см. AttachAudioSource. } FAudioSource := AUrl; - { Свойство действует на следующий loadfile, поэтому задавать его надо - до загрузки, а не после. } - mpv_set_property_string(FHandle, 'audio-files', PAnsiChar(AUrl)); end; procedure TMpvPlayer.SetHwdec(const AMode: string); @@ -760,6 +755,19 @@ begin if FAudioSource = '' then Exit; + { Подключаем свой список кусков как отдельную звуковую дорожку и сразу + выбираем её. + + Через свойство audio-files это не работает: проверено на живом mpv — + список дорожек после загрузки остаётся прежним, внешний файл не + подключается вовсе, и играет звук, встроенный в саму картинку. Из-за + этого звук был слышен там, где на монтаже его нет, а после попытки + заглушить — пропал совсем. + + Команда audio-add с признаком select делает ровно то, что нужно: + добавляет дорожку, выбирает её и снимает выбор с внутренней. } + Command(['audio-add', FAudioSource, 'select']); + Count := StrToIntDef(GetPropString('track-list/count'), 0); for I := 0 to Count - 1 do begin @@ -787,8 +795,8 @@ begin Поэтому оставляем выбор ему, но записываем в журнал: если звук вдруг окажется не тот, будет с чего начинать. } - FAudioTrackNote := 'Звук: внешняя дорожка не найдена среди ' + - IntToStr(Count) + ', выбор оставлен плееру.'; + FAudioTrackNote := 'ВНИМАНИЕ: внешняя звуковая дорожка не подключилась ' + + '(дорожек: ' + IntToStr(Count) + '). Звук может идти не с монтажа.'; end; procedure TMpvPlayer.HandleLogMessage(AMsg: Pmpv_event_log_message);