Ver Fonte

分辨率修改为不指定

zhangyong há 11 meses atrás
pai
commit
7ae81a22f1
3 ficheiros alterados com 38 adições e 34 exclusões
  1. 35 31
      common/ffmpeg.py
  2. 1 1
      video_job.py
  3. 2 2
      video_rewriting/video_prep.py

+ 35 - 31
common/ffmpeg.py

@@ -1,17 +1,7 @@
-import configparser
-import glob
-import os
-import random
-import re
+
 import subprocess
-import sys
 import time
-import urllib.parse
-import json
 
-import requests
-from datetime import datetime, timedelta
-from urllib.parse import urlencode
 
 class FFmpeg():
 
@@ -60,12 +50,9 @@ class FFmpeg():
         output_video_path = ''
         try:
             # 获取视频的原始宽高信息
-            ffprobe_cmd = f"ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 {video_url}"
-            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(','))
+            width, height = cls.get_w_h_size(video_url)
             # 计算裁剪后的高度
-            new_height = int(height * 0.7)
+            new_height = int(height * 0.8)
             # 构建 FFmpeg 命令,裁剪视频高度为原始高度的70%,并将宽度缩放为320x480
             ffmpeg_cmd = [
                 "ffmpeg",
@@ -82,13 +69,24 @@ class FFmpeg():
         except Exception as e:
             return None
 
+    """
+    获取视频宽高
+    """
+    @classmethod
+    def get_w_h_size(cls, new_video_path):
+        # 获取视频的原始宽高信息
+        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()
+        height, width = map(int, output.decode().strip().split(','))
+        return width, height
+
     """
     视频裁剪
     """
     @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)
@@ -98,11 +96,11 @@ class FFmpeg():
         # 计算裁剪后的高度
         new_height = int(height * 0.8)
 
-        # 构建 FFmpeg 命令,裁剪视频高度为原始高度的70%,并将宽度缩放为320x480
+        # 构建 FFmpeg 命令,裁剪视频高度为原始高度的80%
         ffmpeg_cmd = [
             "ffmpeg",
             "-i", new_video_path,
-            "-vf", f"crop={width}:{new_height},scale=320:480",
+            "-vf", f"crop={width}:{new_height}",
             "-c:v", "libx264",
             "-c:a", "aac",
             "-y",
@@ -142,6 +140,8 @@ class FFmpeg():
         :param new_video_path: 视频地址
         :return:
         """
+        # 获取视频的原始宽高信息
+        width, height = cls.get_w_h_size(new_video_path)
         jpg_url = video_path_url + str(pw_random_id) + 'png.jpg'
         # 获取视频时长
         total_duration = cls.get_video_duration(new_video_path)
@@ -149,7 +149,7 @@ class FFmpeg():
         # 获取视频最后一秒,生成.jpg
         subprocess.run(
             ['ffmpeg', '-ss', str(time_offset), '-i', new_video_path, '-t', str(total_duration), '-vf', 'fps=1', "-y", jpg_url])
-        return jpg_url
+        return jpg_url, height
 
     """
     获取视频音频
@@ -173,7 +173,7 @@ class FFmpeg():
      生成片尾视频
     """
     @classmethod
-    def pw_video(cls, jpg_url, video_path_url, pw_url, pw_srt, pw_random_id, pw_mp3_path):
+    def pw_video(cls, jpg_url, video_path_url, pw_url, pw_srt, pw_random_id, pw_mp3_path, height):
         # 添加音频到图片
         """
         jpg_url 图片地址
@@ -192,11 +192,10 @@ class FFmpeg():
         pw_url_path = video_path_url + str(pw_random_id) + 'pw_video.mp4'
         # 获取视频时长
         pw_duration = cls.get_video_duration(pw_url)
-
         time.sleep(2)
         # 添加字幕 wqy-zenhei  Hiragino Sans GB
-        subtitle_cmd = f"subtitles={pw_srt_path}:force_style='Fontsize=14,Fontname=wqy-zenhei,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000,Bold=1,MarginV=155'"
-        background_cmd = "drawbox=y=366/2:color=yellow@1.0:width=iw:height=50:t=fill"
+        subtitle_cmd = f"subtitles={pw_srt_path}:force_style='Fontsize=16,Fontname=wqy-zenhei,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000,Bold=1,MarginV=135'"
+        background_cmd = f"drawbox=y=(ih-{int(height)}/2-{int(height)}/2):color=yellow@1.0:width=iw:height={int(height)}/4:t=fill"
         ffmpeg_cmd = [
             'ffmpeg',
             '-loop', '1',
@@ -208,19 +207,20 @@ class FFmpeg():
             '-c:a', 'aac',  # 音频编码格式
             '-strict', 'experimental',  # 使用实验性编码器
             '-shortest',  # 确保输出视频的长度与音频一致
-            '-vf', f"scale=320x480,{background_cmd},{subtitle_cmd}",  # 视频过滤器,设置分辨率和其他过滤器
+            '-vf', f"{background_cmd},{subtitle_cmd}",  # 视频过滤器,设置分辨率和其他过滤器
             pw_url_path  # 输出的视频文件路径
         ]
         subprocess.run(ffmpeg_cmd)
         return pw_url_path
 
-
     """
     设置统一格式拼接视频
     """
     @classmethod
     def concatenate_videos(cls, video_list, video_path_url):
         concatenate_videos_url = video_path_url + 'concatenate_videos.mp4'
+        # 获取视频的原始宽高信息
+        width, height = cls.get_w_h_size(video_list[0])
         # 拼接视频
         VIDEO_COUNTER = 0
         FF_INPUT = ""
@@ -231,7 +231,7 @@ class FFmpeg():
             # 添加输入文件
             FF_INPUT += f" -i {videos}"
             # 为每个视频文件统一长宽,并设置SAR(采样宽高比)
-            FF_SCALE += f"[{VIDEO_COUNTER}:v]scale=320x480,setsar=1[v{VIDEO_COUNTER}];"
+            FF_SCALE += f"[{VIDEO_COUNTER}:v]scale={int(height)}x{int(width)},setsar=1[v{VIDEO_COUNTER}];"
             # 为每个视频文件创建一个输入流,并添加到-filter_complex参数中
             FF_FILTER += f"[v{VIDEO_COUNTER}][{VIDEO_COUNTER}:a]"
             # 增加视频计数器
@@ -260,13 +260,17 @@ class FFmpeg():
             f.write(f"file '{new_video_path}'\n")
         with open(single_video_srt, 'w') as f:
             f.write(f"1\n{start_time} --> {end_time}\n\u2764\uFE0F{zm}\n\n")
-        background_cmd = "drawbox=y=370/1:color=yellow@1.0:width=iw:height=70:t=fill"
+        width, height = cls.get_w_h_size(new_video_path)
+        box_height = int(int(height) / 4)  # 框的高度为视频高度的四分之一
+
+        background_cmd = f"drawbox=y=ih-{70 + box_height}-{int(box_height / 20)}:color=yellow@1.0:width=iw:height={box_height}:t=fill"
+
         if video_share == '有':
             # 添加字幕 wqy-zenhei  Hiragino Sans GB
-            subtitle_cmd = f"subtitles={single_video_srt}:force_style='Fontsize=14,Fontname=wqy-zenhei,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000,Bold=1,MarginV=30'"
+            subtitle_cmd = f"subtitles={single_video_srt}:force_style='Fontsize=14,Fontname=wqy-zenhei,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000,Bold=1,MarginV=20'"
             draw = f"{background_cmd},{subtitle_cmd}"
         else:
-            subtitle_cmd = f"subtitles={single_video_srt}:force_style='Fontsize=14,Fontname=wqy-zenhei,Outline=2,PrimaryColour=&H00FFFF,SecondaryColour=&H000000,Bold=1,MarginV=30'"
+            subtitle_cmd = f"subtitles={single_video_srt}:force_style='Fontsize=14,Fontname=wqy-zenhei,Outline=2,PrimaryColour=&H00FFFF,SecondaryColour=&H000000,Bold=1,MarginV=20'"
             draw = f"{subtitle_cmd}"
         # 多线程数
         num_threads = 4
@@ -279,7 +283,7 @@ class FFmpeg():
                 "-c:v", "libx264",
                 "-c:a", "aac",
                 "-threads", str(num_threads),
-                "-vf", f"scale=320x480,{draw}",
+                "-vf", f"{draw}",
                  "-y",
                  single_video_url
 

+ 1 - 1
video_job.py

@@ -71,7 +71,7 @@ def usernames_today():
     print("today 已清空")
 
 
-# video_start()
+video_start()
 
 
 # 定时任务设置

+ 2 - 2
video_rewriting/video_prep.py

@@ -138,7 +138,7 @@ class getVideo:
                             jpg_path = None
                             pw_path = None
                             for attempt in range(3):
-                                jpg_path = FFmpeg.video_png(new_video_path, video_path_url, pw_random_id)  # 生成视频最后一帧jpg
+                                jpg_path, height = FFmpeg.video_png(new_video_path, video_path_url, pw_random_id)  # 生成视频最后一帧jpg
                                 if os.path.isfile(jpg_path):
                                     Common.logger("log").info(f"{task_mark}下的视频ID{id},生成视频最后一帧成功")
                                     break
@@ -149,7 +149,7 @@ class getVideo:
                                 continue
                             for attempt in range(3):
                                 pw_mp3_path = FFmpeg.get_video_mp3(pw_url, video_path_url, pw_random_id)
-                                pw_path = FFmpeg.pw_video(jpg_path, video_path_url, pw_url, pw_srt, pw_random_id, pw_mp3_path)  # 生成片尾视频
+                                pw_path = FFmpeg.pw_video(jpg_path, video_path_url, pw_url, pw_srt, pw_random_id, pw_mp3_path, height)  # 生成片尾视频
                                 if os.path.isfile(pw_path):
                                     Common.logger("log").info(f"{task_mark}下的视频ID{id},生成片尾视频成功")
                                     break