From 70416302d6d5b2472c32e97eff695c37b653681b Mon Sep 17 00:00:00 2001 From: poususer <852281867@qq.com> Date: Wed, 26 Mar 2025 09:51:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9F=BA=E4=BA=8EFFMPEG?= =?UTF-8?q?=E7=9A=84=E8=87=AA=E5=AE=9A=E4=B9=89=E5=8F=82=E6=95=B0=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E5=8F=AF=E5=9C=A8config.py=E5=88=86=E5=88=AB?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=9F=B3=E8=A7=86=E9=A2=91=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/config.py | 19 ++++++++++++++++++- backend/main.py | 48 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/backend/config.py b/backend/config.py index f366f8c..10b55c6 100644 --- a/backend/config.py +++ b/backend/config.py @@ -65,7 +65,7 @@ class InpaintMode(Enum): # ×××××××××××××××××××× [可以改] start ×××××××××××××××××××× # 是否使用h264编码,如果需要安卓手机分享生成的视频,请打开该选项 -USE_H264 = True +# USE_H264 = True # ×××××××××× 通用设置 start ×××××××××× """ @@ -130,4 +130,21 @@ PROPAINTER_MAX_LOAD_NUM = 70 # 是否开启极速模式,开启后不保证inpaint效果,仅仅对包含文本的区域文本进行去除 LAMA_SUPER_FAST = False # ×××××××××× InpaintMode.LAMA算法设置 end ×××××××××× + +# ×××××××××× FFmpeg参数设置 start ×××××××××× +# 自定义 FFmpeg 音频参数,可以根据需要自行修改 +FFMPEG_AUDIO_PARAMS = "-c:a copy " # 指定音频编码参数 +# 自定义 FFmpeg 视频参数,可以根据需要自行修改 +FFMPEG_VIDEO_PARAMS = ( + "-f mp4 " # 指定输出格式 + "-c:v libx264 " # 指定视频编码器 + "-crf 17 " # 视频质量 + "-profile:v high " # 编码规格 + "-preset veryslow " # 编码速度 + "-sn " # 禁用字幕流 + # "-map_metadata -1 " # 删除元数据 + # "-map_chapters -1 " # 删除章节信息 + "-pix_fmt yuv420p" # 指定像素格式,不能修改 +) +# ×××××××××× FFmpeg参数设置 end ×××××××××× # ×××××××××××××××××××× [可以改] end ×××××××××××××××××××× diff --git a/backend/main.py b/backend/main.py index 3aa0a23..f9e4b7c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -27,7 +27,40 @@ from tqdm import tqdm from tools.infer import utility from tools.infer.predict_det import TextDetector - +# 新增用FFmpeg合并视频类 +class FFmpegVideoWriter: + def __init__(self, size, fps, output_file, ffmpeg_params=config.FFMPEG_VIDEO_PARAMS): + # size 格式为 (width, height) + self.size = size + self.fps = fps + self.output_file = output_file + ffmpeg_cmd = [ + "ffmpeg", + "-y", # 覆盖输出文件 + "-f", "rawvideo", # 输入为原始视频流 + "-pixel_format", "bgr24", # OpenCV 默认格式 bgr24 + "-video_size", f"{size[0]}x{size[1]}", # 视频尺寸:宽x高 + "-framerate", str(fps), # 帧率 + "-i", "-" # 从标准输入读取数据 + ] + # 添加自定义参数,拆分成列表 + ffmpeg_cmd.extend(ffmpeg_params.split()) + # 最后追加输出文件名 + ffmpeg_cmd.append(output_file) + print("FFmpeg参数:", " ".join(ffmpeg_cmd)) + self.process = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE) + + def write(self, frame): + try: + self.process.stdin.write(frame.tobytes()) + except BrokenPipeError: + print("FFmpeg 进程意外关闭。") + + def release(self): + if self.process: + self.process.stdin.close() + self.process.wait() + self.process = None class SubtitleDetect: """ 文本框检测类,用于检测视频帧中是否存在文本框 @@ -541,7 +574,9 @@ class SubtitleRemover: # 创建视频临时对象,windows下delete=True会有permission denied的报错 self.video_temp_file = tempfile.NamedTemporaryFile(suffix='.mp4', delete=False) # 创建视频写对象 - self.video_writer = cv2.VideoWriter(self.video_temp_file.name, cv2.VideoWriter_fourcc(*'mp4v'), self.fps, self.size) + # self.video_writer = cv2.VideoWriter(self.video_temp_file.name, cv2.VideoWriter_fourcc(*'mp4v'), self.fps, self.size) + # 使用FFmpeg生成视频 + self.video_writer = FFmpegVideoWriter(self.size, self.fps, self.video_temp_file.name) self.video_out_name = os.path.join(os.path.dirname(self.video_path), f'{self.vd_name}_no_sub.mp4') self.video_inpaint = None self.lama_inpaint = None @@ -881,9 +916,14 @@ class SubtitleRemover: audio_merge_command = [config.FFMPEG_PATH, "-y", "-i", self.video_temp_file.name, "-i", temp.name, - "-vcodec", "libx264" if config.USE_H264 else "copy", - "-acodec", "copy", + "-vcodec", "copy", + # "-vcodec", "libx264" if config.USE_H264 else "copy", + # "-acodec", "copy", "-loglevel", "error", self.video_out_name] + # 新增自定义音频参数 + audio_params = config.FFMPEG_AUDIO_PARAMS.replace("\n", " ").split() + # 将音频参数追加到合并命令中 + audio_merge_command.extend(audio_params) try: subprocess.check_output(audio_merge_command, stdin=open(os.devnull), shell=use_shell) except Exception: