From 9022e528272ae003d77d68bd3ea1fdf064adb67c Mon Sep 17 00:00:00 2001 From: "shuohigh@gmail.com" Date: Thu, 12 Jun 2025 14:38:50 +0800 Subject: [PATCH] =?UTF-8?q?fix=20:=20-=20FFMpegSliceSegment=E7=9A=84?= =?UTF-8?q?=E8=B5=B7=E5=A7=8B=E7=BB=93=E6=9D=9F=E6=97=B6=E9=97=B4=E4=B8=8D?= =?UTF-8?q?=E5=B0=8F=E4=BA=8E0=E7=9A=84=E6=A0=A1=E9=AA=8C=20-=20ffmpeg=5Fs?= =?UTF-8?q?lice=5Fmedia=E5=B0=91=E4=BC=A0=E9=80=92=E4=BA=86options?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/ffmpeg_worker_model.py | 22 +++++++++++++++++-- .../models/media_model.py | 5 +++++ src/BowongModalFunctions/models/web_model.py | 7 +++--- src/BowongModalFunctions/utils/VideoUtils.py | 2 ++ src/cluster/ffmpeg_app.py | 2 ++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/BowongModalFunctions/models/ffmpeg_worker_model.py b/src/BowongModalFunctions/models/ffmpeg_worker_model.py index 287a66e..ed28886 100644 --- a/src/BowongModalFunctions/models/ffmpeg_worker_model.py +++ b/src/BowongModalFunctions/models/ffmpeg_worker_model.py @@ -19,12 +19,21 @@ class FFMpegSliceSegment(BaseModel): @classmethod def parse_start(cls, v: Union[float, str, TimeDelta]): if isinstance(v, float): + if v < 0.0: + raise ValueError("开始时间点不能小于0") return TimeDelta(seconds=v) elif isinstance(v, int): + if v < 0: + raise ValueError("开始时间点不能小于0") return TimeDelta(seconds=v) elif isinstance(v, str): - return TimeDelta.from_format_string(v) + timedelta = TimeDelta.from_format_string(v) + if timedelta.total_seconds() < 0.0: + raise ValueError("开始时间点不能小于0") + return timedelta elif isinstance(v, TimeDelta): + if v.total_seconds() < 0.0: + raise ValueError("开始时间点不能小于0") return v else: raise TypeError(v) @@ -33,12 +42,21 @@ class FFMpegSliceSegment(BaseModel): @classmethod def parse_end(cls, v: Union[float, TimeDelta]): if isinstance(v, float): + if v < 0.0: + raise ValueError("结束时间点不能小于0") return TimeDelta(seconds=v) elif isinstance(v, int): + if v < 0: + raise ValueError("结束时间点不能小于0") return TimeDelta(seconds=v) elif isinstance(v, str): - return TimeDelta.from_format_string(v) + timedelta = TimeDelta.from_format_string(v) + if timedelta.total_seconds() < 0.0: + raise ValueError("结束时间点不能小于0") + return timedelta elif isinstance(v, TimeDelta): + if v.total_seconds() < 0.0: + raise ValueError("结束时间点不能小于0") return v else: raise TypeError(v) diff --git a/src/BowongModalFunctions/models/media_model.py b/src/BowongModalFunctions/models/media_model.py index 3f4b649..23783f7 100644 --- a/src/BowongModalFunctions/models/media_model.py +++ b/src/BowongModalFunctions/models/media_model.py @@ -176,6 +176,11 @@ class MediaSource(BaseModel): return f"{self.protocol.value}/{self.path}" return f"{self.protocol.value}/{self.endpoint}/{self.bucket}/{self.path}" + @computed_field(description="CDN挂载地址") + @property + def url(self) -> str: + return f"{config.S3_cdn_endpoint}/{self.get_cdn_url()}" + def __str__(self): match self.protocol: case MediaProtocol.http: diff --git a/src/BowongModalFunctions/models/web_model.py b/src/BowongModalFunctions/models/web_model.py index 2747d03..5588f88 100644 --- a/src/BowongModalFunctions/models/web_model.py +++ b/src/BowongModalFunctions/models/web_model.py @@ -79,9 +79,10 @@ class FFMPEGResult(BaseModel): @computed_field(description="可通过CDN访问的资源链接") @property def url(self) -> str: - if not self.urn.startswith("s3://"): - raise ValueError("无法转换非s3前缀协议") - return self.urn.replace('s3://', f"{config.S3_cdn_endpoint}/") + prefix = f"s3://{config.S3_region}/{config.S3_bucket_name}" + if not self.urn.startswith(prefix): + raise ValueError("无法转换非s3前缀协议和非当前挂载点的s3协议") + return self.urn.replace(prefix, f"{config.S3_cdn_endpoint}/") class BaseFFMPEGTaskRequest(BaseModel): diff --git a/src/BowongModalFunctions/utils/VideoUtils.py b/src/BowongModalFunctions/utils/VideoUtils.py index e0ece3b..06e5b76 100644 --- a/src/BowongModalFunctions/utils/VideoUtils.py +++ b/src/BowongModalFunctions/utils/VideoUtils.py @@ -461,6 +461,8 @@ class VideoUtils: if marker.end.total_seconds() > 0 and math.isclose(marker.end.total_seconds(), metadata.format.duration, rel_tol=diff_tolerance): marker.end = TimeDelta(seconds=metadata.format.duration) + logger.warning( + f"第{i}个切割点结束点{marker.end.total_seconds()}s接近视频时长[0-{metadata.format.duration}s]范围") else: raise ValueError( f"第{i}个切割点结束点{marker.end.total_seconds()}s超出视频时长[0-{metadata.format.duration}s]范围") diff --git a/src/cluster/ffmpeg_app.py b/src/cluster/ffmpeg_app.py index b0918fd..90c057c 100644 --- a/src/cluster/ffmpeg_app.py +++ b/src/cluster/ffmpeg_app.py @@ -161,10 +161,12 @@ with ffmpeg_worker_image.imports(): case MediaProtocol.hls: outputs = await ffmpeg_hls_slice_process(media_source=media, media_markers=markers, + options=options, fn_id=fn_id) case MediaProtocol.s3: outputs = await ffmpeg_slice_process(media_source=media, media_markers=markers, + options=options, fn_id=fn_id) case _: # webhook不会报错,需要确认 raise NotImplementedError("暂不支持的协议")