Убрана заглушка звука, из-за которой пропал звук вообще

Вчерашняя правка глушила звук, когда перебор дорожек не находил внешнюю.
Задумывалось как защита: играть звук из картинки вместо отдельной дорожки
монтажа нельзя. Вышло наоборот — звука не стало нигде.

Перебор может не сработать по причинам, до которых из программы не
дознаться, а mpv и сам предпочитает внешний список, когда тот открылся.
Поэтому выбор оставлен ему, а в журнал пишется, что произошло: если звук
окажется не тот, будет с чего начинать.

Проверено на точном списке кусков, который строит предпросмотр: картинка
2..8 с, звук сдвинут на 4..10 с. Воспроизведение дало тишину до четвёртой
секунды и тон после — ровно то, что на монтаже.
This commit is contained in:
chaiman 2026-08-20 11:27:55 +03:00
commit d0dc22630e
2 changed files with 28 additions and 3 deletions

View file

@ -80,6 +80,7 @@ type
FLastLoadedEdl: string;
FLastLoadedAudioEdl: string;
FLastHwdec: string;
FLastAudioNote: string;
FLogFilePath: string;
FLogFileStarted: Boolean;
FLogFileBroken: Boolean;
@ -2018,6 +2019,15 @@ begin
end
else
Log('Декодирование видео: ' + Hw);
{ Откуда взялся звук. Строка меняется редко, поэтому пишется только при
изменении — иначе журнал забился бы повторами. }
if FPlayer.AudioTrackNote <> FLastAudioNote then
begin
FLastAudioNote := FPlayer.AudioTrackNote;
if FLastAudioNote <> '' then
Log(FLastAudioNote);
end;
end;
procedure TMainForm.PlayerPauseChange(Sender: TObject);

View file

@ -58,6 +58,9 @@ type
FVideoFilter: string;
FHwdec: string;
FAudioSource: string;
{ Что произошло с выбором звуковой дорожки. Читается окном для
журнала: без этого понять, откуда взялся звук, нечем. }
FAudioTrackNote: string;
{ Работаем ли под Wine. Там свои правила вывода картинки, и узнать об
этом надо до создания плеера. }
FUnderWine: Boolean;
@ -163,6 +166,7 @@ type
property HasTimePos: Boolean read FHasTimePos;
property Initialized: Boolean read FInitialized;
property UnderWine: Boolean read FUnderWine;
property AudioTrackNote: string read FAudioTrackNote;
property TimePos: Double read FTimePos;
property Duration: Double read FDuration;
property Paused: Boolean read FPaused;
@ -767,13 +771,24 @@ begin
Continue;
Id := GetPropString(Format('track-list/%d/id', [I]));
if Id <> '' then
begin
mpv_set_property_string(FHandle, 'aid', PAnsiChar(Id));
FAudioTrackNote := 'Звук: отдельная дорожка монтажа (' + Id + ').';
end;
Exit;
end;
{ Внешней дорожки не нашлось — значит наш список кусков не открылся.
Играть вместо него звук из картинки нельзя: на монтаже его там нет. }
mpv_set_property_string(FHandle, 'aid', 'no');
{ Внешней дорожки не нашлось.
Глушить звук здесь нельзя, и это проверено дорого: такая попытка
привела к тому, что звука не стало вовсе. Перебор дорожек может не
сработать по причинам, до которых отсюда не дознаться, а mpv и сам
предпочитает внешний список, когда тот открылся.
Поэтому оставляем выбор ему, но записываем в журнал: если звук вдруг
окажется не тот, будет с чего начинать. }
FAudioTrackNote := 'Звук: внешняя дорожка не найдена среди ' +
IntToStr(Count) + ', выбор оставлен плееру.';
end;
procedure TMpvPlayer.HandleLogMessage(AMsg: Pmpv_event_log_message);