4.3 KiB
4.3 KiB
Windows 视频路径修复验证
🐛 问题分析
原始错误
convertFileSrc C:\Users\imeep\.mixvideo\temp\video_segments\478e3974-5710-4521-8076-89b09eed2971.mp4
转换后URL: http://asset.localhost/C%3A%5CUsers%5Cimeep%5C.mixvideo%5Ctemp%5Cvideo_segments%5C478e3974-5710-4521-8076-89b09eed2971.mp4
结果: convertFileSrc method failed - video error
问题根源
- Windows绝对路径:
C:\Users\...格式 - URL编码问题:
C:→C%3A,\→%5C - Tauri asset protocol: 不支持这种编码后的Windows路径格式
🔧 修复方案
1. 路径检测机制
const isWindowsAbsolutePath = (path: string): boolean => {
return /^[A-Z]:\\/i.test(path) || path.includes('\\')
}
2. 分层加载策略
Windows路径加载顺序:
1. dataUrl 方法 (read_video_as_data_url)
↓ 失败时
2. convertFileSrc 方法 (原始路径)
↓ 失败时
3. normalizedPath 方法 (路径标准化)
非Windows路径加载顺序:
1. convertFileSrc 方法 (推荐)
↓ 失败时
2. dataUrl 方法 (备用)
3. 核心改进
A. 智能路径检测
const isWindowsPath = isWindowsAbsolutePath(path)
const methods = isWindowsPath ? windowsMethods : unixMethods
B. Windows优先使用data URL
// Windows路径优先使用后端读取
{
name: 'dataUrl',
load: async () => {
const dataUrl = await invoke<string>('read_video_as_data_url', { filePath: path })
return dataUrl
}
}
C. 路径标准化备用方案
{
name: 'normalizedPath',
load: () => {
const normalizedPath = path.replace(/\\/g, '/')
return convertFileSrc(normalizedPath)
}
}
✅ 预期修复效果
1. Windows路径处理
- ✅ 自动检测Windows绝对路径
- ✅ 优先使用data URL方法绕过路径编码问题
- ✅ 提供多种备用加载方案
2. 兼容性保证
- ✅ 非Windows路径保持原有逻辑
- ✅ 向后兼容现有功能
- ✅ 错误处理机制完善
3. 用户体验
- ✅ 自动选择最佳加载方法
- ✅ 详细的调试日志
- ✅ 友好的错误提示
🧪 测试验证
1. 测试用例
Windows路径测试:
路径: C:\Users\imeep\.mixvideo\temp\video_segments\test.mp4
预期: 使用data URL方法成功加载
Unix路径测试:
路径: /home/user/.mixvideo/temp/video_segments/test.mp4
预期: 使用convertFileSrc方法成功加载
2. 验证步骤
- 打开项目详情页面
- 点击视频素材播放按钮
- 观察控制台日志:
- 应该显示路径检测结果
- 应该显示选择的加载方法
- 应该显示加载成功或失败信息
3. 成功标志
- ✅ 不再出现
convertFileSrc method failed错误 - ✅ Windows路径视频可以正常播放
- ✅ 控制台显示正确的加载方法选择
🔍 故障排除
1. 如果data URL方法失败
检查项目:
- 文件是否存在
- 文件是否过大 (>50MB可能导致内存问题)
- 文件格式是否支持
2. 如果所有方法都失败
可能原因:
- 文件损坏
- 权限问题
- 不支持的视频格式
- Tauri配置问题
3. 调试建议
// 在控制台查看详细信息
console.log('Path type:', isWindowsAbsolutePath(path))
console.log('Selected methods:', methods.map(m => m.name))
console.log('File exists:', await invoke('check_file_exists', { filePath: path }))
📊 性能考虑
1. data URL方法
- 优点: 绕过路径编码问题,兼容性好
- 缺点: 内存占用大,加载时间长
- 适用: 小到中等大小的视频文件 (<50MB)
2. convertFileSrc方法
- 优点: 性能好,内存占用小
- 缺点: 路径编码问题
- 适用: 标准路径格式的文件
3. 优化建议
- 对于大文件,优先尝试convertFileSrc
- 对于Windows路径,优先使用data URL
- 实现文件大小检测,动态选择方法
🎯 总结
这个修复方案通过:
- 智能路径检测 - 自动识别Windows vs Unix路径
- 分层加载策略 - 针对不同路径类型使用最佳方法
- 完善错误处理 - 多种备用方案确保成功率
应该能够解决Windows路径下的视频播放问题,同时保持对其他平台的兼容性。