mirror of
https://gitea.cookies.4d.ink/Cookies/CookiesChartConverter.git
synced 2025-10-26 03:02:39 +00:00
92 lines
2.8 KiB
Python
92 lines
2.8 KiB
Python
import os
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
from loguru import logger
|
|
|
|
from pv_convert import process_video
|
|
from config import work as work_dirs
|
|
# === 配置 ===
|
|
WANNACRI_PATH = "wannacri" # 需在 PATH 或填写完整路径
|
|
FFMPEG_PATH = "ffmpeg" # 需在 PATH 或填写完整路径
|
|
|
|
def extract_usm(usm_path: Path, output_dir: Path):
|
|
""" 提取 usm 文件内容 """
|
|
subprocess.run([WANNACRI_PATH, "extractusm", str(usm_path),"--key","0x7F4551499DF55E68"], cwd=output_dir, check=True)
|
|
|
|
def convert_ivf_to_mp4(ivf_path: Path, output_mp4_path: Path):
|
|
""" 将 ivf 文件转换为 mp4 """
|
|
subprocess.run([
|
|
FFMPEG_PATH,
|
|
"-y", "-i", str(ivf_path),
|
|
"-c:v", "copy",
|
|
str(output_mp4_path)
|
|
], check=True)
|
|
|
|
import subprocess
|
|
|
|
def get_video_duration(path: Path) -> float:
|
|
"""使用 ffprobe 获取视频时长(单位:秒)"""
|
|
try:
|
|
result = subprocess.run(
|
|
["ffprobe", "-v", "error", "-show_entries", "format=duration",
|
|
"-of", "default=nokey=1:noprint_wrappers=1", str(path)],
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.STDOUT,
|
|
text=True
|
|
)
|
|
return float(result.stdout.strip())
|
|
except Exception as e:
|
|
logger.error(f"获取视频时长失败: {e}")
|
|
return 0.0
|
|
|
|
def dat_to_mp4(dat_file: str, id: str):
|
|
"""将 .dat 文件当作 .usm 文件处理,提取并转换为 .mp4"""
|
|
dat_path = Path(dat_file).resolve()
|
|
base_name = dat_path.stem
|
|
work_dir = Path(work_dirs) / id
|
|
|
|
usm_path = dat_path
|
|
ivf_dir = work_dir / "output" / f"{base_name}.dat" / "videos"
|
|
mp4_path = work_dir / f"{base_name}.mp4"
|
|
|
|
# Step 1: 提取 USM 内容
|
|
logger.info(f"[1/3] 提取 USM 内容 ...")
|
|
extract_usm(usm_path, work_dir)
|
|
|
|
# Step 2: 找到第一个 .ivf 文件
|
|
ivf_files = list(ivf_dir.glob("*.ivf"))
|
|
if not ivf_files:
|
|
logger.error(f"❌ 提取失败,未找到 .ivf 文件")
|
|
return None
|
|
|
|
ivf_path = ivf_files[0]
|
|
logger.info(f"[2/3] 转换为 MP4 ...")
|
|
convert_ivf_to_mp4(ivf_path, mp4_path)
|
|
|
|
# Step 3: 检查视频时长
|
|
duration = get_video_duration(mp4_path)
|
|
if duration < 1.0:
|
|
logger.warning(f"⚠️ 视频时长 {duration:.2f}s 太短,跳过生成 pv.mp4")
|
|
return None
|
|
|
|
logger.info(f"[3/3] 成功生成:{mp4_path}")
|
|
process_video(mp4_path, work_dir / "pv.mp4")
|
|
return work_dir / "pv.mp4"
|
|
|
|
# === 示例用法 ===
|
|
if __name__ == "__main__":
|
|
import sys
|
|
if len(sys.argv) != 3:
|
|
logger.info("用法: python dat_to_mp4.py <xxx.dat>")
|
|
exit(1)
|
|
|
|
dat_file = sys.argv[1]
|
|
mp4_output = dat_to_mp4(dat_file,sys.argv[2])
|
|
|
|
if mp4_output:
|
|
converted_mp4_path = f"pv.mp4"
|
|
logger.info(f"[4/4] 开始转换为新的 MP4 文件:{converted_mp4_path}")
|
|
|
|
|