Browse Source

增加画面裁剪,指定视频时长功能

zhangyong 11 months ago
parent
commit
9638c250dc
2 changed files with 57 additions and 5 deletions
  1. 50 0
      common/ffmpeg.py
  2. 7 5
      video_rewriting/video_prep.py

+ 50 - 0
common/ffmpeg.py

@@ -82,6 +82,56 @@ class FFmpeg():
         except Exception as e:
             return None
 
+    """
+    视频裁剪
+    """
+    @classmethod
+    def video_crop(cls, new_video_path, video_path_url, pw_random_id):
+        crop_url = video_path_url + str(pw_random_id) + 'crop.mp4'
+
+        # 获取视频的原始宽高信息
+        ffprobe_cmd = f"ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 {new_video_path}"
+        ffprobe_process = subprocess.Popen(ffprobe_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+        output, _ = ffprobe_process.communicate()
+        width, height = map(int, output.decode().strip().split(','))
+
+        # 计算裁剪后的高度
+        new_height = int(height * 0.8)
+
+        # 构建 FFmpeg 命令,裁剪视频高度为原始高度的70%,并将宽度缩放为320x480
+        ffmpeg_cmd = [
+            "ffmpeg",
+            "-i", new_video_path,
+            "-vf", f"crop={width}:{new_height},scale=320:480",
+            "-c:v", "libx264",
+            "-c:a", "aac",
+            "-y",
+            crop_url
+        ]
+        subprocess.run(ffmpeg_cmd)
+        return crop_url
+
+    """
+    视频裁剪
+    """
+    @classmethod
+    def video_ggduration(cls, new_video_path, video_path_url, pw_random_id, gg_duration_total):
+        gg_duration_url = video_path_url + str(pw_random_id) + 'gg_duration.mp4'
+        # 获取视频时长
+        total_duration = cls.get_video_duration(new_video_path)
+        duration = int(total_duration) - int(gg_duration_total)
+        ffmpeg_cmd = [
+            "ffmpeg",
+            "-i", new_video_path,
+            "-c:v", "libx264",
+            "-c:a", "aac",
+            "-t", str(duration),
+            "-y",
+            gg_duration_url
+        ]
+        subprocess.run(ffmpeg_cmd)
+        return gg_duration_url
+
     """
      截取原视频最后一帧
     """

+ 7 - 5
video_rewriting/video_prep.py

@@ -121,20 +121,21 @@ class getVideo:
                         cover = video["cover"]
                         video_url = video["video_url"]
                         time.sleep(1)
+                        pw_random_id = cls.random_id()
                         new_video_path = PQ.download_video(video_url, video_path_url, v_id)  # 下载视频地址
                         if new_video_path == '':
                             Common.logger("log").info(f"{task_mark}下的视频ID{id},{new_video_path}视频下载失败")
                             cls.remove_files(video_path_url)
                             continue
-                        # if crop_total and crop_total != 'None':  # 判断是否需要裁剪
-                        #     pass
-                        # if gg_duration_total and gg_duration_total != 'None':  # 判断是否需要指定视频时长
-                        #     pass
+                        if crop_total and crop_total != 'None':  # 判断是否需要裁剪
+                            new_video_path = FFmpeg.video_crop(new_video_path, video_path_url, pw_random_id)
+                        if gg_duration_total and gg_duration_total != 'None':  # 判断是否需要指定视频时长
+                            new_video_path = FFmpeg.video_ggduration(new_video_path, video_path_url, pw_random_id, gg_duration_total)
                         if video_ending and video_ending != 'None':
                             pw_id = pws["pw_id"]
                             pw_srt = pws["pw_srt"]
                             pw_url = PQ.get_pw_url(pw_id)
-                            pw_random_id = cls.random_id()
+
                             jpg_path = None
                             pw_path = None
                             for attempt in range(3):
@@ -196,4 +197,5 @@ class getVideo:
             except Exception as e:
                 cls.remove_files(video_path_url)
                 Common.logger("warning").warning(f"{name}的{task_mark}任务处理失败:{e}\n")
+        Feishu.bot(mark, '机器自动改造消息通知', f'你的任务全部完成,请关注!!!!!', name)
         return mark