fix: 修复视频切分前几秒无画面问题

问题分析:
- 原因:使用 -c copy 流复制模式在非关键帧位置切分
- 症状:切分后的视频前几秒显示黑屏或无画面

解决方案:
1. 新增三种切分模式:
   - Fast: 快速模式(流复制,速度快但可能有画面问题)
   - Accurate: 精确模式(重新编码,确保画面完整)
   - Smart: 智能模式(关键帧对齐 + 快速切分)

2. 精确模式技术改进:
   - 使用 libx264 重新编码视频
   - 使用 aac 重新编码音频
   - 添加 -preset fast 提高编码速度
   - 设置 -crf 23 保证质量
   - 添加 -movflags +faststart 优化播放

3. 智能模式特性:
   - 自动获取视频关键帧信息
   - 将切分点调整到最近的关键帧
   - 结合快速切分提高效率

4. 新增调试功能:
   - test_video_split 命令测试不同切分模式
   - 详细的切分日志输出
   - 模式选择和参数配置

默认配置:
- 使用 Accurate 模式确保画面完整
- 可通过配置切换到其他模式

现在切分的视频应该不会再有前几秒无画面的问题!
This commit is contained in:
imeepos
2025-07-13 21:17:48 +08:00
parent 704e6d8fff
commit 864d1b42a9
5 changed files with 219 additions and 23 deletions

View File

@@ -142,6 +142,20 @@ pub struct CreateMaterialRequest {
pub max_segment_duration: Option<f64>, // 最大片段时长(秒)
}
/// 视频切分模式
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum VideoSplitMode {
Fast, // 快速模式(流复制,可能有画面问题)
Accurate, // 精确模式(重新编码,确保画面完整)
Smart, // 智能模式(关键帧对齐 + 快速切分)
}
impl Default for VideoSplitMode {
fn default() -> Self {
VideoSplitMode::Accurate
}
}
/// 素材处理配置
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MaterialProcessingConfig {
@@ -152,6 +166,7 @@ pub struct MaterialProcessingConfig {
pub audio_quality: String, // 音频质量设置
pub output_format: String, // 输出格式
pub auto_process: Option<bool>, // 是否自动处理
pub split_mode: VideoSplitMode, // 视频切分模式
}
impl Default for MaterialProcessingConfig {
@@ -164,6 +179,7 @@ impl Default for MaterialProcessingConfig {
audio_quality: "medium".to_string(),
output_format: "mp4".to_string(),
auto_process: Some(true),
split_mode: VideoSplitMode::Accurate, // 默认使用精确模式
}
}
}