zhangyong 1 miesiąc temu
rodzic
commit
15309415ca
3 zmienionych plików z 70 dodań i 4 usunięć
  1. 6 3
      utils/feishu_form.py
  2. 54 0
      utils/ffmpeg.py
  3. 10 1
      workers/consumption_work.py

+ 6 - 3
utils/feishu_form.py

@@ -36,9 +36,11 @@ class Material():
                 video_share = row[12] # 片中分享
                 trailer_share = row[13]  # 片尾分享
                 trailer_share_audio = row[14]  # 片尾分享声音
-                video_clipping = row[15]  # 剪裁
-                video_clipping_time = row[16]  # 秒数剪裁
-                title_transform = row[17]  # 标题改造
+                trailer_share_bgm = row[15]  # 片尾分享bgm
+
+                video_clipping = row[16]  # 剪裁
+                video_clipping_time = row[17]  # 秒数剪裁
+                title_transform = row[18]  # 标题改造
                 number_dict = {
                     "channel_mark": channel_mark,
                     "name":NAME,
@@ -58,6 +60,7 @@ class Material():
                     "video_clipping": video_clipping,
                     "video_clipping_time": video_clipping_time,
                     "title_transform": title_transform,
+                    "trailer_share_bgm": str(trailer_share_bgm),
                     "dt":dt
                 }
                 processed_list.append(json.dumps(number_dict, ensure_ascii=False))

+ 54 - 0
utils/ffmpeg.py

@@ -153,6 +153,60 @@ class FFmpeg():
         except Exception as e:
             return pw_mp3_path
 
+    @classmethod
+    def get_pw_video_mp3(cls, video_file, video_path_url):
+        bgm_pw_path_mp3 = video_file + 'bgm_pw.mp3'
+        try:
+            cls.asyncio_run_subprocess([
+                'ffmpeg',
+                '-i', video_path_url,      # 输入的视频文件路径
+                '-q:a', '0',           # 设置音频质量为最佳
+                '-map', 'a',
+                '-y',
+                bgm_pw_path_mp3
+            ], timeout=120)
+            time.sleep(1)
+            return bgm_pw_path_mp3
+        except Exception as e:
+            return bgm_pw_path_mp3
+
+
+    """
+    片尾增加bgm
+    """
+    @classmethod
+    def video_add_bgm(cls, video_file, bgm_path, video_path_url):
+        bgm_pw_path = video_path_url + 'bgm_pw.mp4'
+        pw_duration = cls.get_video_duration(video_file)
+
+        try:
+            pw_path_txt = video_path_url + 'bgm_pw_video.txt'
+            with open(pw_path_txt, 'w') as f:
+                f.write(f"file '{video_file}'\n")
+            cls.asyncio_run_subprocess([
+                "ffmpeg",
+                "-f", "concat",
+                "-safe", "0",
+                "-i", f"{pw_path_txt}",  # 视频序列输入的文本文件
+                "-i", bgm_path,  # 音频文件
+                "-c:v", "libx264",  # 视频编码格式
+                "-t", str(pw_duration),  # 输出视频的持续时间
+                '-c:a', 'aac',           # 音频编码格式
+                '-b:v', '260k',          # 视频比特率
+                '-b:a', '96k',           # 音频比特率
+                '-threads', '2',         # 线程数
+                # '-vf', f'{background_cmd},{subtitle_cmd}',  # 视频过滤器(背景和字幕)
+                "-filter_complex", "[1:a]volume=0.6[a1];[0:a][a1]amerge=inputs=2[aout]",  # 混合音频流
+                "-map", "0:v:0",  # 映射视频流来自第一个输入文件(视频)
+                "-map", "[aout]",  # 映射混合后的音频流
+                '-y',                    # 强制覆盖输出文件
+                bgm_pw_path              # 输出文件路径
+            ], timeout=500)
+            time.sleep(1)
+            return bgm_pw_path
+        except Exception as e:
+            return bgm_pw_path
+
     """横屏视频改为竖屏"""
     @classmethod
     def update_video_h_w(cls, video_path, file_path):

+ 10 - 1
workers/consumption_work.py

@@ -383,6 +383,15 @@ class ConsumptionRecommend(object):
                         return
 
                     logger.info(f"[处理] 数据合并开始拼接")
+                    trailer_share_bgm = data['trailer_share_bgm']
+                    # trailer_share_bgm = '48594759'
+                    if trailer_share_bgm:
+                        logger.info(f"[处理] 获取bgm")
+                        rg_bgm_list = PQ.get_pq_oss([trailer_share_bgm])
+                        rg_bgm_url = DownLoad.download_pq_video(file_path, rg_bgm_list)
+                        bgm_mp3_path = FFmpeg.get_pw_video_mp3(file_path, rg_bgm_url[0])
+                        pw_path = FFmpeg.video_add_bgm(pw_path, bgm_mp3_path, file_path)
+                        logger.info(f"[处理] 片尾bgm添加成功")
                     video_path = FFmpeg.h_b_video(video_path, pw_path, file_path)
                     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:
@@ -438,7 +447,7 @@ class ConsumptionRecommend(object):
         file_path = os.path.join(CACHE_DIR, uid)
         logger.info(f"[处理] 开始获取redis数据")
         fs_data = os.getenv("FS_DATA")
-        # fs_data = '邓锋,DEpi6V,task:carry_data_redis_df'
+        # fs_data = '周仙琴,2WIcBU,task:carry_data_redis_zxq'
         fs_data_list = fs_data.split(',')
         redis_name = fs_data_list[2]
         data = RedisHelper().get_client().rpop(name=redis_name)