212 lines
7.3 KiB
Python
212 lines
7.3 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
测试视频文件加载的脚本
|
||
检查视频文件的存在性、可访问性和格式
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
import json
|
||
from pathlib import Path
|
||
|
||
# 添加项目根目录到Python路径
|
||
project_root = Path(__file__).parent.parent
|
||
sys.path.insert(0, str(project_root))
|
||
|
||
from python_core.services.media_manager import MediaManager
|
||
from python_core.config import settings
|
||
|
||
def check_video_files():
|
||
"""检查视频文件的存在和可访问性"""
|
||
print("🎬 检查视频文件...")
|
||
|
||
# 获取所有视频片段
|
||
media_manager = MediaManager()
|
||
segments = media_manager.get_all_segments()
|
||
|
||
if not segments:
|
||
print("❌ 没有找到任何视频片段")
|
||
return
|
||
|
||
print(f"📊 找到 {len(segments)} 个视频片段")
|
||
|
||
# 检查每个视频文件
|
||
for i, segment in enumerate(segments[:10]): # 只检查前10个
|
||
file_path = segment.get('file_path', '')
|
||
filename = segment.get('filename', 'Unknown')
|
||
|
||
print(f"\n{i+1}. {filename}")
|
||
print(f" 路径: {file_path}")
|
||
|
||
if not file_path:
|
||
print(" ❌ 文件路径为空")
|
||
continue
|
||
|
||
# 检查文件是否存在
|
||
path_obj = Path(file_path)
|
||
if path_obj.exists():
|
||
print(" ✅ 文件存在")
|
||
|
||
# 检查文件大小
|
||
size = path_obj.stat().st_size
|
||
print(f" 📏 文件大小: {size:,} 字节 ({size/1024/1024:.2f} MB)")
|
||
|
||
# 检查文件权限
|
||
readable = os.access(file_path, os.R_OK)
|
||
print(f" 🔓 可读权限: {'是' if readable else '否'}")
|
||
|
||
# 检查文件扩展名
|
||
extension = path_obj.suffix.lower()
|
||
supported_formats = ['.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.webm', '.m4v']
|
||
is_supported = extension in supported_formats
|
||
print(f" 🎞️ 文件格式: {extension} ({'支持' if is_supported else '不支持'})")
|
||
|
||
else:
|
||
print(" ❌ 文件不存在")
|
||
|
||
# 检查父目录是否存在
|
||
parent_dir = path_obj.parent
|
||
if parent_dir.exists():
|
||
print(f" 📁 父目录存在: {parent_dir}")
|
||
# 列出父目录中的文件
|
||
try:
|
||
files = list(parent_dir.glob("*"))
|
||
print(f" 📋 父目录包含 {len(files)} 个文件")
|
||
if files:
|
||
print(" 📄 文件列表:")
|
||
for f in files[:5]: # 只显示前5个
|
||
print(f" - {f.name}")
|
||
except Exception as e:
|
||
print(f" ❌ 无法读取父目录: {e}")
|
||
else:
|
||
print(f" ❌ 父目录不存在: {parent_dir}")
|
||
|
||
def check_storage_directories():
|
||
"""检查存储目录结构"""
|
||
print("\n📁 检查存储目录结构...")
|
||
|
||
# 检查主要目录
|
||
directories = [
|
||
settings.temp_dir,
|
||
settings.temp_dir / "cache",
|
||
settings.temp_dir / "video_segments",
|
||
settings.temp_dir / "original_videos",
|
||
settings.temp_dir / "thumbnails"
|
||
]
|
||
|
||
for directory in directories:
|
||
print(f"\n📂 {directory}")
|
||
if directory.exists():
|
||
print(" ✅ 目录存在")
|
||
|
||
# 统计文件数量
|
||
try:
|
||
files = list(directory.glob("*"))
|
||
video_files = [f for f in files if f.suffix.lower() in ['.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.webm', '.m4v']]
|
||
|
||
print(f" 📊 总文件数: {len(files)}")
|
||
print(f" 🎬 视频文件数: {len(video_files)}")
|
||
|
||
if video_files:
|
||
print(" 🎞️ 视频文件示例:")
|
||
for vf in video_files[:3]:
|
||
size = vf.stat().st_size
|
||
print(f" - {vf.name} ({size/1024/1024:.2f} MB)")
|
||
|
||
except Exception as e:
|
||
print(f" ❌ 无法读取目录内容: {e}")
|
||
else:
|
||
print(" ❌ 目录不存在")
|
||
|
||
def test_video_info_extraction():
|
||
"""测试视频信息提取"""
|
||
print("\n🔍 测试视频信息提取...")
|
||
|
||
media_manager = MediaManager()
|
||
segments = media_manager.get_all_segments()
|
||
|
||
if not segments:
|
||
print("❌ 没有视频片段可测试")
|
||
return
|
||
|
||
# 测试第一个存在的视频文件
|
||
for segment in segments[:5]:
|
||
file_path = segment.get('file_path', '')
|
||
if file_path and Path(file_path).exists():
|
||
print(f"\n🎬 测试文件: {segment.get('filename', 'Unknown')}")
|
||
print(f" 路径: {file_path}")
|
||
|
||
try:
|
||
# 尝试获取视频信息
|
||
video_info = media_manager._get_video_info(file_path)
|
||
print(f" ✅ 视频信息提取成功:")
|
||
print(f" 时长: {video_info.get('duration', 'N/A')} 秒")
|
||
print(f" 分辨率: {video_info.get('width', 'N/A')}x{video_info.get('height', 'N/A')}")
|
||
print(f" 帧率: {video_info.get('fps', 'N/A')} fps")
|
||
print(f" 编码: {video_info.get('codec', 'N/A')}")
|
||
break
|
||
|
||
except Exception as e:
|
||
print(f" ❌ 视频信息提取失败: {e}")
|
||
continue
|
||
else:
|
||
print("❌ 没有找到可用的视频文件进行测试")
|
||
|
||
def suggest_fixes():
|
||
"""建议修复方案"""
|
||
print("\n🔧 修复建议:")
|
||
|
||
print("\n1. 如果视频文件不存在:")
|
||
print(" - 检查导入过程是否正确完成")
|
||
print(" - 确认文件没有被意外删除")
|
||
print(" - 重新导入视频素材")
|
||
|
||
print("\n2. 如果文件存在但无法播放:")
|
||
print(" - 检查文件格式是否支持")
|
||
print(" - 验证文件是否损坏")
|
||
print(" - 尝试使用其他播放器测试文件")
|
||
|
||
print("\n3. 如果路径问题:")
|
||
print(" - 检查路径中是否包含特殊字符")
|
||
print(" - 确认路径分隔符正确(Windows vs Unix)")
|
||
print(" - 验证文件权限设置")
|
||
|
||
print("\n4. 浏览器播放问题:")
|
||
print(" - 检查Tauri配置中的asset protocol设置")
|
||
print(" - 验证CSP策略是否允许视频播放")
|
||
print(" - 尝试不同的视频加载方法")
|
||
|
||
print("\n5. 调试步骤:")
|
||
print(" - 启用浏览器开发者工具")
|
||
print(" - 查看网络请求和错误信息")
|
||
print(" - 检查控制台日志")
|
||
print(" - 测试convertFileSrc和data URL方法")
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print("🎬 视频加载问题诊断")
|
||
print("=" * 50)
|
||
|
||
try:
|
||
# 1. 检查视频文件
|
||
check_video_files()
|
||
|
||
# 2. 检查存储目录
|
||
check_storage_directories()
|
||
|
||
# 3. 测试视频信息提取
|
||
test_video_info_extraction()
|
||
|
||
# 4. 提供修复建议
|
||
suggest_fixes()
|
||
|
||
print("\n✅ 诊断完成!")
|
||
|
||
except Exception as e:
|
||
print(f"❌ 诊断过程中出现错误: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
if __name__ == "__main__":
|
||
main()
|