#!/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()