zhangyong 5 bulan lalu
induk
melakukan
f7c84c492e
2 mengubah file dengan 55 tambahan dan 12 penghapusan
  1. 17 2
      carry_video/carry_video.py
  2. 38 10
      common/ffmpeg.py

+ 17 - 2
carry_video/carry_video.py

@@ -185,7 +185,22 @@ class CarryViode:
 
 
         elif data["transform_rule"] == "仅改造":
+            logger.info(f"[+] {REDIS_NAME}的{data}视频更改分辨率处理")
             video_path = FFmpeg.video_640(video_path, file_path)
+            if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
+                logger.error(f"[+] {REDIS_NAME}的{data}视频更改分辨率失败")
+                AliyunLogger.logging(data["name"], "效率工具", data["tag_transport_channel"], data["video_url"],
+                                     "改造失败,片尾拼接失败", "3001", str(data))
+                text = (
+                    f"**负责人**: {data['name']}\n"
+                    f"**内容**: {data}\n"
+                    f"**失败信息**: 视频更改分辨率失败\n"
+                )
+                Feishu.finish_bot(text,
+                                  "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
+                                  "【 搬运&改造效率工具失败通知 】")
+                return
+            logger.info(f"[+] {REDIS_NAME}的{data}视频更改分辨率处理成功")
             if data["video_clipping"]:  # 判断是否需要裁剪
                 video_path = FFmpeg.video_crop(video_path, file_path)
             if data["video_clipping_time"]:  # 判断是否需要指定视频时长
@@ -264,9 +279,9 @@ class CarryViode:
                                       "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
                                       "【 搬运&改造效率工具失败通知 】")
                     return
-                video_paths = [video_path, pw_path]
                 logger.info(f"[+] {REDIS_NAME}的{data}数据合并开始拼接")
-                video_path = FFmpeg.single_video(video_paths, file_path, data["video_share"])
+                video_path = FFmpeg.h_b_video(video_path, pw_path, file_path, data["video_share"])
+                # video_path = FFmpeg.single_video(video_path, file_path, data["video_share"])
                 if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
                     logger.error(f"[+] {REDIS_NAME}的{data}数据添加片中字幕失败")
                     AliyunLogger.logging(data["name"], "效率工具",data["tag_transport_channel"], data["video_url"],

+ 38 - 10
common/ffmpeg.py

@@ -196,7 +196,39 @@ class FFmpeg():
     @classmethod
     def video_640(cls, video_path, file_path):
         video_url = file_path + 'pixelvideo.mp4'
-        ffmpeg_cmd = f"ffmpeg -i {video_path} -vf 'scale=640:trunc(ih*640/iw/2)*2' {video_url}"
+        ffmpeg_cmd = f"ffmpeg -i {video_path} -vf 'scale=360:640' {video_url}"
+        subprocess.run(ffmpeg_cmd, shell=True)
+        return video_url
+
+    """视频拼接到一起"""
+    @classmethod
+    def h_b_video(cls, video_path, pw_path, file_path, zm):
+        video_url = file_path + 'hbvideo.mp4'
+        single_video_srt = file_path + 'single_video.srt'
+        # 获取时长
+        duration = cls.get_video_duration(video_path)
+        pw_duration = cls.get_video_duration(pw_path)
+
+        if duration == 0 or pw_duration == 0:
+            return video_url
+        duration = pw_duration + duration
+        start_time = cls.seconds_to_srt_time(2)
+        end_time = cls.seconds_to_srt_time(duration)
+        single_video_txt = file_path + 'single_video.txt'
+        with open(single_video_txt, 'w') as f:
+            f.write(f"file '{video_path}'\n")
+        if zm:
+            # 如果有 zm,则写入字幕文件
+            with open(single_video_srt, 'w') as f:
+                f.write(f"1\n{start_time} --> {end_time}\n<font color=\"red\">\u2764\uFE0F</font>{zm}\n\n")
+            # 字幕命令,包含字幕文件路径
+            subtitle_cmd = f"subtitles={single_video_srt}:force_style='Fontsize=14,Fontname=wqy-zenhei,Outline=2,PrimaryColour=&H00FFFF,SecondaryColour=&H000000,Bold=1,MarginV=20'"
+        else:
+            # 如果没有 zm,则不使用字幕文件,直接使用样式
+            subtitle_cmd = f"force_style='Fontsize=14,Fontname=wqy-zenhei,Outline=2,PrimaryColour=&H00FFFF,SecondaryColour=&H000000,Bold=1,MarginV=20'"
+
+        # 最终的ffmpeg命令,加入字幕命令
+        ffmpeg_cmd = f"ffmpeg -i {video_path} -i {pw_path} -filter_complex '[0:v]scale=360:640[v1]; [1:v]scale=360:640[v2]; [v1][0:a][v2][1:a]concat=n=2:v=1:a=1[outv][outa]' -map '[outv]' -map '[outa]' {subtitle_cmd} {video_url}"
         subprocess.run(ffmpeg_cmd, shell=True)
         return video_url
 
@@ -330,22 +362,18 @@ class FFmpeg():
     单个视频拼接
     """
     @classmethod
-    def single_video(cls, video_paths, file_path, zm):
+    def single_video(cls, video_path, file_path, zm):
         single_video_url = file_path + 'single_video.mp4'
         single_video_srt = file_path + 'single_video.srt'
         # 获取时长
-        durations = 0
-        for video in video_paths:
-            duration = cls.get_video_duration(video)
-            durations += duration  # 累加时长
-        if durations == 0:
+        duration = cls.get_video_duration(video_path)
+        if duration == 0:
             return single_video_url
         start_time = cls.seconds_to_srt_time(2)
-        end_time = cls.seconds_to_srt_time(durations)
+        end_time = cls.seconds_to_srt_time(duration)
         single_video_txt = file_path + 'single_video.txt'
         with open(single_video_txt, 'w') as f:
-            for video in video_paths:
-                f.write(f"file '{video}'\n")
+            f.write(f"file '{video_path}'\n")
         if zm:
             with open(single_video_srt, 'w') as f:
                 f.write(f"1\n{start_time} --> {end_time}\n<font color=\"red\">\u2764\uFE0F</font>{zm}\n\n")