190 lines
7.6 KiB
Rust
190 lines
7.6 KiB
Rust
use tvai_sdk::{TvaiSdk, TemplateBuilder};
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_audio_codec_loading() {
|
|
let sdk = TvaiSdk::new();
|
|
let audio_codecs = sdk.ffmpeg_generator.get_available_audio_codecs();
|
|
|
|
// 检查是否加载了内置音频编解码器
|
|
assert!(!audio_codecs.is_empty(), "应该加载内置音频编解码器配置");
|
|
|
|
// 检查 AAC 编解码器
|
|
let aac_codec = sdk.ffmpeg_generator.get_audio_codec("AAC");
|
|
assert!(aac_codec.is_some(), "应该找到 AAC 编解码器");
|
|
|
|
if let Some(aac) = aac_codec {
|
|
assert_eq!(aac.name, "AAC");
|
|
assert!(aac.ffmpeg_opts.contains("aac"), "AAC 编解码器应该包含 'aac' 选项");
|
|
assert!(aac.ext.contains(&"mp4".to_string()), "AAC 应该支持 MP4 格式");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_video_encoder_loading() {
|
|
let sdk = TvaiSdk::new();
|
|
let video_encoders = sdk.ffmpeg_generator.get_available_video_encoders();
|
|
|
|
// 检查是否加载了内置视频编码器
|
|
assert!(!video_encoders.is_empty(), "应该加载内置视频编码器配置");
|
|
|
|
// 检查 H.264 编码器
|
|
let h264_encoder = sdk.ffmpeg_generator.get_video_encoder_by_name("H264");
|
|
assert!(h264_encoder.is_some(), "应该找到 H.264 编码器");
|
|
}
|
|
|
|
#[test]
|
|
fn test_model_recommendation() {
|
|
let sdk = TvaiSdk::new();
|
|
|
|
// 测试不同分辨率的模型推荐
|
|
let recommendations_480p = sdk.ffmpeg_generator.recommend_model_for_resolution(480);
|
|
assert!(!recommendations_480p.is_empty(), "480p 应该有模型推荐");
|
|
|
|
let recommendations_1080p = sdk.ffmpeg_generator.recommend_model_for_resolution(1080);
|
|
assert!(!recommendations_1080p.is_empty(), "1080p 应该有模型推荐");
|
|
|
|
let recommendations_4k = sdk.ffmpeg_generator.recommend_model_for_resolution(2160);
|
|
assert!(!recommendations_4k.is_empty(), "4K 应该有模型推荐");
|
|
}
|
|
|
|
#[test]
|
|
fn test_audio_codec_params_generation() {
|
|
let sdk = TvaiSdk::new();
|
|
|
|
// 测试 AAC 编解码器参数生成
|
|
let aac_params = sdk.ffmpeg_generator.generate_audio_codec_params("AAC", Some(192));
|
|
assert!(aac_params.contains("-c:a"), "应该包含音频编解码器参数");
|
|
assert!(aac_params.contains("192"), "应该包含指定的比特率");
|
|
|
|
// 测试不存在的编解码器
|
|
let unknown_params = sdk.ffmpeg_generator.generate_audio_codec_params("UNKNOWN", Some(128));
|
|
assert!(unknown_params.contains("-c:a UNKNOWN"), "应该回退到默认格式");
|
|
}
|
|
|
|
#[test]
|
|
fn test_compatibility_filtering() {
|
|
let sdk = TvaiSdk::new();
|
|
|
|
// 测试 Windows 兼容性筛选
|
|
let windows_encoders = sdk.ffmpeg_generator.get_compatible_video_encoders("windows", None);
|
|
assert!(!windows_encoders.is_empty(), "应该有 Windows 兼容的编码器");
|
|
|
|
// 测试 macOS 兼容性筛选
|
|
let macos_encoders = sdk.ffmpeg_generator.get_compatible_video_encoders("osx", None);
|
|
assert!(!macos_encoders.is_empty(), "应该有 macOS 兼容的编码器");
|
|
|
|
// 测试 GPU 筛选
|
|
let _nvidia_encoders = sdk.ffmpeg_generator.get_compatible_video_encoders("windows", Some("nvidia"));
|
|
// 注意:这个测试可能为空,因为需要特定的配置
|
|
|
|
// 测试文件扩展名筛选
|
|
let mp4_encoders = sdk.ffmpeg_generator.get_encoders_for_extension("mp4");
|
|
assert!(!mp4_encoders.is_empty(), "应该有支持 MP4 的编码器");
|
|
}
|
|
|
|
#[test]
|
|
fn test_auto_encoder_selection() {
|
|
let sdk = TvaiSdk::new();
|
|
|
|
// 创建测试模板
|
|
let template = TemplateBuilder::new("测试模板")
|
|
.enable_enhancement("prob-4")
|
|
.build()
|
|
.expect("应该能创建测试模板");
|
|
|
|
// 测试自动编码器选择
|
|
let result = sdk.ffmpeg_generator.generate_with_auto_encoder(
|
|
&template,
|
|
"input.mp4",
|
|
"output.mp4",
|
|
"windows",
|
|
Some("nvidia")
|
|
);
|
|
|
|
// 这个测试可能失败,因为需要特定的编码器配置
|
|
// 但至少应该返回一个结果(成功或特定的错误)
|
|
assert!(result.is_ok() || result.is_err(), "应该返回结果");
|
|
}
|
|
|
|
#[test]
|
|
fn test_ffmpeg_command_with_config() {
|
|
let sdk = TvaiSdk::new();
|
|
|
|
// 创建使用配置文件的模板
|
|
let template = TemplateBuilder::new("配置文件测试")
|
|
.enable_enhancement("prob-4")
|
|
.video_codec("H264", Some(23))
|
|
.audio_settings("AAC", 192, 2)
|
|
.build()
|
|
.expect("应该能创建模板");
|
|
|
|
// 生成 FFmpeg 命令
|
|
let command = sdk.generate_ffmpeg_command(&template, "input.mp4", "output.mp4")
|
|
.expect("应该能生成 FFmpeg 命令");
|
|
|
|
// 验证命令包含预期的元素
|
|
assert!(command.contains("ffmpeg"), "应该包含 ffmpeg");
|
|
assert!(command.contains("-i"), "应该包含输入参数");
|
|
assert!(command.contains("tvai_up"), "应该包含 TVAI 增强滤镜");
|
|
assert!(command.contains("-c:a"), "应该包含音频编解码器");
|
|
}
|
|
|
|
#[test]
|
|
fn test_encoder_report_generation() {
|
|
let sdk = TvaiSdk::new();
|
|
|
|
let report = sdk.ffmpeg_generator.generate_encoder_report();
|
|
|
|
// 验证报告包含预期的内容
|
|
assert!(report.contains("可用编码器报告"), "应该包含报告标题");
|
|
assert!(report.contains("音频编解码器"), "应该包含音频编解码器部分");
|
|
|
|
// 如果有编码器配置,应该包含编码器信息
|
|
if !sdk.ffmpeg_generator.get_available_video_encoders().is_empty() {
|
|
assert!(report.len() > 100, "报告应该有实质内容");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_bitrate_config_usage() {
|
|
let sdk = TvaiSdk::new();
|
|
|
|
// 测试 AAC 编解码器的比特率配置
|
|
if let Some(aac_codec) = sdk.ffmpeg_generator.get_audio_codec("AAC") {
|
|
if let Some(bitrate_config) = &aac_codec.bitrate {
|
|
assert!(bitrate_config.min > 0, "最小比特率应该大于 0");
|
|
assert!(bitrate_config.max > bitrate_config.min, "最大比特率应该大于最小比特率");
|
|
assert!(!bitrate_config.suggested.is_empty(), "应该有建议的比特率值");
|
|
assert!(bitrate_config.ffmpeg_opt.contains("<BITRATE>"), "应该包含比特率占位符");
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_video_encoder_quality_modes() {
|
|
let sdk = TvaiSdk::new();
|
|
|
|
// 查找支持质量模式的编码器
|
|
for encoder in sdk.ffmpeg_generator.get_available_video_encoders() {
|
|
if let Some(bitrate_opts) = &encoder.bitrate_opts {
|
|
if bitrate_opts.cbr.is_some() {
|
|
assert!(bitrate_opts.cbr.as_ref().unwrap().contains("<CONST_BITRATE_VALUE>"),
|
|
"CBR 模板应该包含比特率占位符");
|
|
}
|
|
|
|
if bitrate_opts.vbr.is_some() {
|
|
let vbr_template = bitrate_opts.vbr.as_ref().unwrap();
|
|
assert!(vbr_template.contains("<QP_VALUE>") ||
|
|
vbr_template.contains("<QPI_VALUE>") ||
|
|
vbr_template.contains("<QV_VALUE>"),
|
|
"VBR 模板应该包含质量占位符");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|