给切分结尾的数值添加了1毫秒的容忍值以应对浮点数精确问题

This commit is contained in:
shuohigh@gmail.com 2025-06-11 16:36:04 +08:00
parent 93353c4c36
commit 86bf94fe0c
3 changed files with 14 additions and 16 deletions

View File

@ -3,4 +3,4 @@ modal_app_name=bowong-ai-video
S3_mount_dir=/mntS3
S3_bucket_name=modal-media-cache
S3_region=ap-northeast-2
S3_cdn_endpoint=https://d2nj71io21vkj2.cloudfront.net
S3_cdn_endpoint=https://cdn.roasmax.cn

View File

@ -424,15 +424,7 @@ class VideoUtils:
if not output_path:
output_path = FileUtils.file_path_extend(media_path, "slice")
os.makedirs(os.path.dirname(output_path), exist_ok=True)
# if media_path.endswith(".m3u8"):
# metadata = VideoUtils.ffprobe_media_metadata(media_path)
# video_metadata = metadata.streams[0]
# playlist = m3u8.loads(media_path)
# duration = sum(segment.duration for segment in playlist.segments)
# logger.info(f"HLS duration: {duration}")
# video_metadata.duration = duration if duration > 0 else 3600 * 12
# else:
# video_metadata = VideoUtils.ffprobe_video_format(media_path=media_path)
metadata = VideoUtils.ffprobe_media_metadata(media_path)
for index, marker in enumerate(media_markers):
filter_complex.extend(
@ -443,13 +435,19 @@ class VideoUtils:
)
ffmpeg_cmd.option('filter_complex', ';'.join(filter_complex))
diff_tolerance = 0.001
for i, marker in enumerate(media_markers):
if marker.start.total_seconds() > metadata.format.duration or marker.start.total_seconds() < 0:
raise ValueError(
f"{i}个切割点起始点{marker.start.total_seconds()}s超出视频时长[0-{metadata.format.duration}s]范围")
if marker.end.total_seconds() > metadata.format.duration or marker.end.total_seconds() < 0:
raise ValueError(
f"{i}个切割点结束点{marker.end.total_seconds()}s超出视频时长[0-{metadata.format.duration}s]范围")
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)
else:
raise ValueError(
f"{i}个切割点结束点{marker.end.total_seconds()}s超出视频时长[0-{metadata.format.duration}s]范围")
segment_output_path = FileUtils.file_path_extend(output_path, str(i))
ffmpeg_cmd.output(segment_output_path,
map=[f"[cut{i}]", f"[acut{i}]"],

View File

@ -164,10 +164,10 @@ with ffmpeg_worker_image.imports():
outputs = await ffmpeg_hls_slice_process(media_source=media,
media_markers=markers,
fn_id=fn_id)
# case MediaProtocol.s3:
# outputs = await ffmpeg_slice_process(media_source=media,
# media_markers=markers,
# fn_id=fn_id)
case MediaProtocol.s3:
outputs = await ffmpeg_slice_process(media_source=media,
media_markers=markers,
fn_id=fn_id)
case _: # webhook不会报错需要确认
raise NotImplementedError("暂不支持的协议")