From 0ba3bd40a624d36281042ce390795a9921fb797d Mon Sep 17 00:00:00 2001 From: 4aiman Date: Wed, 30 Sep 2026 00:55:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B3=D1=80=D1=8B=D0=B7=D0=BA=D0=B0?= =?UTF-8?q?=D0=BC=20=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B7=D0=B0=D1=85=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D1=91=D1=82=D1=81=D1=8F=20=D0=B1=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=B9=D1=82=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перекодированный кусочек от точки реза до опорного кадра шёл без ключа битрейта, и NVENC брал своё умолчание. Замерено в готовом ролике пользователя: 5.7-6.8 Мбит/с в огрызке против 54-60 в скопированном материале рядом — мутное пятно на полсекунды. Раньше это задевало только редкие точные резы, а теперь точны все: в том ролике 98 кусков, то есть 98 таких пятен. После правки на том же материале: огрызок 86.8 Мбит/с (потолок в полтора битрейта проекта, для куска в 0.7 с с опорным кадром это нормально), соседний скопированный 61.6. Сверка кадров и звука проходит. --- src/uExport.pas | 2 +- src/uFfmpegCmd.pas | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/uExport.pas b/src/uExport.pas index b13c9c7..3fd14b7 100644 --- a/src/uExport.pas +++ b/src/uExport.pas @@ -909,7 +909,7 @@ begin FMaster.FpsNum, FMaster.FpsDen, FMaster.VideoCodec, FMaster.PixFmt, FMaster.AudioCodec, FMaster.SampleRate, FMaster.Channels, FIntermediateFormat, - HeadFrames, WithAudio), + HeadFrames, WithAudio, FMaster.VideoBitrate), 'Перекодирование стыка куска ' + IntToStr(I + 1)) then Exit; diff --git a/src/uFfmpegCmd.pas b/src/uFfmpegCmd.pas index 7d05609..617a290 100644 --- a/src/uFfmpegCmd.pas +++ b/src/uFfmpegCmd.pas @@ -87,7 +87,8 @@ function ArgsEncodeFragment(const ASrc, ADst: string; AStart, AEnd: Double; AFpsNum, AFpsDen: Integer; const AVideoCodec, APixFmt, AAudioCodec: string; ASampleRate, AChannels: Integer; const AFormat: string; - AFrames: Integer = 0; AWithAudio: Boolean = True): TArgs; + AFrames: Integer = 0; AWithAudio: Boolean = True; + ABitrate: Int64 = 0): TArgs; { Пересобрать кусок в параметры проекта. @@ -655,7 +656,7 @@ function ArgsEncodeFragment(const ASrc, ADst: string; AStart, AEnd: Double; AFpsNum, AFpsDen: Integer; const AVideoCodec, APixFmt, AAudioCodec: string; ASampleRate, AChannels: Integer; const AFormat: string; - AFrames: Integer; AWithAudio: Boolean): TArgs; + AFrames: Integer; AWithAudio: Boolean; ABitrate: Int64): TArgs; var HalfFrame, StopAt: Double; begin @@ -691,8 +692,13 @@ begin из того же файла, что и соседние куски, так что менять ему нечего. Хуже того: принудительная частота включает пересчёт кадров, и на пробе это добавило один лишний кадр на стыке — 601 вместо 600. } + { Битрейт обязателен. Без него кодировщик берёт своё умолчание, а у + NVENC оно около двух мегабит: замерено в готовом ролике 5.7 Мбит/с в + огрызке против 54-60 в скопированном материале рядом. Раньше это + задевало редкие точные резы, а теперь точны все — и мутный огрызок + появлялся на каждом. } Result := Concat(Result, MasterOutputArgs(0, 0, 0, 0, - AVideoCodec, APixFmt, AAudioCodec, ASampleRate, AChannels)); + AVideoCodec, APixFmt, AAudioCodec, ASampleRate, AChannels, ABitrate)); Result := Concat(Result, NoBFramesArgs); { Столько кадров, сколько просили: огрызок стыкуется с копией кадр в кадр, и лишнему взяться неоткуда. }