feat: 集成内置FFmpeg配置系统和中文注释
主要功能: - 将JSON配置文件内容内置到代码中,移除外部文件依赖 - 将ffmpeg.rs中所有英文注释改为中文注释 - 集成ffmpegOpts参数生成系统 内置配置: - 音频编解码器: AAC, AC3, PCM, Vorbis (4个) - 视频编码器: H.264/H.265 NVENC, VideoToolbox, AMF, 软件编码器 (8个) - 模型推荐规则: 基于分辨率的智能推荐 新增功能: - 智能编码器选择 (根据操作系统和GPU) - 自动模型推荐 (基于视频分辨率) - 动态参数生成 (支持占位符替换) - 兼容性筛选 (按格式、平台、硬件) - 批处理命令生成 新增文件: - examples/: 4个演示程序 - tests/: FFmpeg配置测试套件 - 文档: 使用指南、配置说明、功能总结 测试验证: - 21个单元测试全部通过 - 4个演示程序运行成功 - 支持Windows/macOS/Linux多平台 - 支持NVIDIA/AMD/Apple硬件加速 优势: - 无外部依赖,部署简单 - 启动速度快,内存占用小 - 向后兼容,不影响现有代码 - 完整中文注释,提升可读性
This commit is contained in:
123
cargos/tvai-v2/examples/ffmpeg_config_demo.rs
Normal file
123
cargos/tvai-v2/examples/ffmpeg_config_demo.rs
Normal file
@@ -0,0 +1,123 @@
|
||||
use tvai_sdk::{TvaiSdk, TemplateBuilder};
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
// 创建 SDK 实例
|
||||
let sdk = TvaiSdk::new();
|
||||
|
||||
println!("=== Topaz Video AI FFmpeg 内置配置演示 ===\n");
|
||||
|
||||
// 显示编码器报告
|
||||
println!("{}", sdk.ffmpeg_generator.generate_encoder_report());
|
||||
|
||||
// 创建一个示例模板
|
||||
let template = TemplateBuilder::new("内置配置演示")
|
||||
.description("使用内置配置的 FFmpeg 命令生成演示")
|
||||
.enable_enhancement("prob-4")
|
||||
.enhancement_params(25, 30, 20)
|
||||
.resolution(1920, 1080)
|
||||
.video_codec("H264", Some(23))
|
||||
.audio_settings("AAC", 192, 2)
|
||||
.build()?;
|
||||
|
||||
// 生成基本 FFmpeg 命令
|
||||
println!("=== 基本 FFmpeg 命令 ===");
|
||||
let basic_command = sdk.generate_ffmpeg_command(&template, "input.mp4", "output.mp4")?;
|
||||
println!("{}\n", basic_command);
|
||||
|
||||
// 演示自动编码器选择
|
||||
println!("=== 自动编码器选择 ===");
|
||||
|
||||
// Windows + NVIDIA GPU
|
||||
match sdk.ffmpeg_generator.generate_with_auto_encoder(&template, "input.mp4", "output_nvidia.mp4", "windows", Some("nvidia")) {
|
||||
Ok(command) => println!("Windows + NVIDIA: {}", command),
|
||||
Err(e) => println!("Windows + NVIDIA 错误: {}", e),
|
||||
}
|
||||
|
||||
// macOS + Apple Silicon
|
||||
match sdk.ffmpeg_generator.generate_with_auto_encoder(&template, "input.mp4", "output_apple.mov", "osx", Some("appleSilicon")) {
|
||||
Ok(command) => println!("macOS + Apple Silicon: {}", command),
|
||||
Err(e) => println!("macOS + Apple Silicon 错误: {}", e),
|
||||
}
|
||||
|
||||
// Linux + AMD GPU
|
||||
match sdk.ffmpeg_generator.generate_with_auto_encoder(&template, "input.mp4", "output_amd.mp4", "linux", Some("amd")) {
|
||||
Ok(command) => println!("Linux + AMD: {}", command),
|
||||
Err(e) => println!("Linux + AMD 错误: {}", e),
|
||||
}
|
||||
|
||||
println!();
|
||||
|
||||
// 演示模型推荐
|
||||
println!("=== 模型推荐 ===");
|
||||
let resolutions = [480, 720, 1080, 2160];
|
||||
for height in resolutions {
|
||||
let recommended = sdk.ffmpeg_generator.recommend_model_for_resolution(height);
|
||||
println!("{}p 推荐模型: {:?}", height, recommended);
|
||||
}
|
||||
|
||||
println!();
|
||||
|
||||
// 演示内置音频编解码器配置
|
||||
println!("=== 内置音频编解码器配置 ===");
|
||||
for codec in sdk.ffmpeg_generator.get_available_audio_codecs() {
|
||||
println!("- {}: {}", codec.name, codec.ffmpeg_opts);
|
||||
if let Some(bitrate_config) = &codec.bitrate {
|
||||
println!(" 比特率范围: {}-{} kbps (推荐: {} kbps)",
|
||||
bitrate_config.min, bitrate_config.max, bitrate_config.default);
|
||||
println!(" 建议值: {:?}", bitrate_config.suggested);
|
||||
}
|
||||
}
|
||||
|
||||
println!();
|
||||
|
||||
// 演示兼容性筛选
|
||||
println!("=== 兼容性筛选 ===");
|
||||
|
||||
println!("Windows 兼容编码器:");
|
||||
let windows_encoders = sdk.ffmpeg_generator.get_compatible_video_encoders("windows", None);
|
||||
for encoder in windows_encoders.iter().take(5) { // 只显示前5个
|
||||
println!(" - {} ({})", encoder.id, encoder.encoder);
|
||||
}
|
||||
|
||||
println!("\nmacOS 兼容编码器:");
|
||||
let macos_encoders = sdk.ffmpeg_generator.get_compatible_video_encoders("osx", None);
|
||||
for encoder in macos_encoders.iter().take(5) {
|
||||
println!(" - {} ({})", encoder.id, encoder.encoder);
|
||||
}
|
||||
|
||||
println!("\nMP4 格式兼容编码器:");
|
||||
let mp4_encoders = sdk.ffmpeg_generator.get_encoders_for_extension("mp4");
|
||||
for encoder in mp4_encoders.iter().take(5) {
|
||||
println!(" - {} ({})", encoder.id, encoder.encoder);
|
||||
}
|
||||
|
||||
println!();
|
||||
|
||||
// 演示不同质量设置
|
||||
println!("=== 不同质量设置演示 ===");
|
||||
|
||||
// 高质量设置
|
||||
let hq_template = TemplateBuilder::new("高质量")
|
||||
.enable_enhancement("prob-4")
|
||||
.video_codec("hevc_nvenc", Some(18))
|
||||
.audio_settings("AAC", 320, 2)
|
||||
.build()?;
|
||||
|
||||
let hq_command = sdk.generate_ffmpeg_command(&hq_template, "input.mp4", "output_hq.mp4")?;
|
||||
println!("高质量: {}", hq_command);
|
||||
|
||||
// 快速编码设置
|
||||
let fast_template = TemplateBuilder::new("快速编码")
|
||||
.enable_enhancement("prob-4")
|
||||
.video_codec("h264_nvenc", Some(25))
|
||||
.audio_settings("AAC", 128, 2)
|
||||
.preset("fast")
|
||||
.build()?;
|
||||
|
||||
let fast_command = sdk.generate_ffmpeg_command(&fast_template, "input.mp4", "output_fast.mp4")?;
|
||||
println!("快速编码: {}", fast_command);
|
||||
|
||||
println!("\n=== 演示完成 ===");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user