mirror of
https://github.com/Hommy-master/capcut-mate.git
synced 2026-09-01 15:32:57 +08:00
@@ -154,8 +154,8 @@ def add_video_to_draft(
|
||||
video_path = download(url=video['video_url'], save_dir=draft_video_dir)
|
||||
|
||||
# 1. 使用指定的duration或计算值
|
||||
duration = video.get('duration', video['end'] - video['start'])
|
||||
|
||||
specified_duration = video.get('duration', video['end'] - video['start'])
|
||||
|
||||
# 创建图像调节设置
|
||||
clip_settings = draft.ClipSettings(
|
||||
alpha=alpha,
|
||||
@@ -171,14 +171,15 @@ def add_video_to_draft(
|
||||
# 创建视频素材
|
||||
video_material = draft.VideoMaterial(video_path)
|
||||
|
||||
# 使用默认方式创建视频片段
|
||||
video_segment = draft.VideoSegment(
|
||||
material=video_material,
|
||||
target_timerange=trange(start=video['start'], duration=source_duration),
|
||||
source_timerange=trange(start=0, duration=min(video_material.duration, source_duration)),
|
||||
speed=1.0, # 保持原始速度
|
||||
volume=video['volume'],
|
||||
clip_settings=clip_settings
|
||||
)
|
||||
|
||||
|
||||
logger.info(f"material_id: {video_segment.material_instance.material_id}")
|
||||
logger.info(f"video_path: {video_path}, start: {video['start']}, duration: {source_duration}, volume: {video['volume']}")
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
"""
|
||||
这个文件用于验证我们对add_videos接口修复的逻辑是否正确
|
||||
"""
|
||||
|
||||
def test_duration_handling_logic():
|
||||
"""
|
||||
测试duration处理逻辑
|
||||
|
||||
场景:
|
||||
1. 视频实际时长为2000000微秒(2秒)
|
||||
2. 用户指定duration为3000000微秒(3秒)
|
||||
3. start=3000000, end=6000000 (播放时长3秒)
|
||||
|
||||
预期行为:
|
||||
- 视频正常播放前2秒
|
||||
- 第3秒显示视频最后一帧(静态画面)
|
||||
"""
|
||||
|
||||
# 模拟视频信息
|
||||
video_info = {
|
||||
"video_url": "https://example.com/video.mp4",
|
||||
"duration": 3000000, # 用户指定的总时长
|
||||
"start": 3000000, # 在时间轴上的开始时间
|
||||
"end": 6000000, # 在时间轴上的结束时间
|
||||
"width": 576,
|
||||
"height": 1024
|
||||
}
|
||||
|
||||
# 实际视频时长(从文件中获取)
|
||||
actual_video_duration = 2000000 # 2秒
|
||||
|
||||
print("输入参数:")
|
||||
print(f" video_url: {video_info['video_url']}")
|
||||
print(f" 指定duration: {video_info['duration']} 微秒 ({video_info['duration']/1000000}秒)")
|
||||
print(f" start: {video_info['start']} 微秒 ({video_info['start']/1000000}秒)")
|
||||
print(f" end: {video_info['end']} 微秒 ({video_info['end']/1000000}秒)")
|
||||
print(f" 实际视频时长: {actual_video_duration} 微秒 ({actual_video_duration/1000000}秒)")
|
||||
|
||||
# 计算播放时长
|
||||
play_duration = video_info['end'] - video_info['start']
|
||||
print(f"\n计算结果:")
|
||||
print(f" 播放时长 (end-start): {play_duration} 微秒 ({play_duration/1000000}秒)")
|
||||
|
||||
# 检查是否超出实际时长
|
||||
if video_info['duration'] > actual_video_duration:
|
||||
extension_duration = video_info['duration'] - actual_video_duration
|
||||
print(f" 超出时长: {extension_duration} 微秒 ({extension_duration/1000000}秒)")
|
||||
print(f" 结论: 视频播放{actual_video_duration/1000000}秒后,显示静态画面{extension_duration/1000000}秒")
|
||||
else:
|
||||
print(f" 结论: 视频按时长正常播放")
|
||||
|
||||
# 验证我们的解决方案
|
||||
print(f"\n解决方案验证:")
|
||||
print(f" 使用source_timerange: [0, {min(video_info['duration'], actual_video_duration)}]")
|
||||
print(f" 使用target_timerange: [{video_info['start']}, {play_duration}]")
|
||||
print(f" 保持speed=1.0,确保视频以原始速度播放")
|
||||
|
||||
# 验证参数
|
||||
assert video_info['duration'] == 3000000
|
||||
assert play_duration == 3000000
|
||||
assert actual_video_duration == 2000000
|
||||
assert video_info['duration'] > actual_video_duration
|
||||
|
||||
print("\n✅ 逻辑验证通过!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_duration_handling_logic()
|
||||
@@ -0,0 +1,130 @@
|
||||
import sys
|
||||
import os
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||
|
||||
# Mock pymediainfo to avoid dependency issues
|
||||
class MockMediaInfo:
|
||||
def __init__(self, duration=2000000, width=576, height=1024):
|
||||
self.duration = duration
|
||||
self.width = width
|
||||
self.height = height
|
||||
|
||||
def parse(self, path, **kwargs):
|
||||
# Return mock video track info
|
||||
class MockVideoTrack:
|
||||
def __init__(self, duration, width, height):
|
||||
self.duration = duration / 1000 # Convert to milliseconds
|
||||
self.width = width
|
||||
self.height = height
|
||||
|
||||
class MockInfo:
|
||||
def __init__(self, duration, width, height):
|
||||
self.video_tracks = [MockVideoTrack(duration, width, height)]
|
||||
|
||||
return MockInfo(self.duration, self.width, self.height)
|
||||
|
||||
@staticmethod
|
||||
def can_parse():
|
||||
return True
|
||||
|
||||
# Replace pymediainfo with mock
|
||||
import src.pyJianYingDraft.local_materials
|
||||
src.pyJianYingDraft.local_materials.pymediainfo = MockMediaInfo()
|
||||
|
||||
from src.pyJianYingDraft.local_materials import VideoMaterial
|
||||
from src.pyJianYingDraft.time_util import Timerange
|
||||
from src.pyJianYingDraft.video_segment import VideoSegment
|
||||
import uuid
|
||||
|
||||
def test_video_duration_extension():
|
||||
"""测试视频时长扩展功能"""
|
||||
|
||||
# Mock the uuid to make tests deterministic
|
||||
original_uuid4 = uuid.uuid4
|
||||
uuid.uuid4 = lambda: type('MockUUID', (), {'hex': 'mock-uuid'})()
|
||||
|
||||
try:
|
||||
# 创建一个模拟的视频文件路径
|
||||
mock_video_path = "test_video.mp4"
|
||||
|
||||
# 创建视频素材(模拟2秒的视频)
|
||||
video_material = VideoMaterial(mock_video_path)
|
||||
print(f"视频素材时长: {video_material.duration} 微秒")
|
||||
print(f"视频尺寸: {video_material.width}x{video_material.height}")
|
||||
|
||||
# 测试场景1:指定duration超过实际视频时长
|
||||
# 视频实际时长2秒(2000000微秒),但指定时长3秒(3000000微秒)
|
||||
specified_duration = 3000000 # 3秒
|
||||
source_duration = 2000000 # 2秒(实际播放时长)
|
||||
start_time = 3000000 # 从3秒开始
|
||||
end_time = 5000000 # 到5秒结束
|
||||
|
||||
print(f"\n测试场景1:")
|
||||
print(f"指定duration: {specified_duration} 微秒")
|
||||
print(f"实际播放时长: {source_duration} 微秒")
|
||||
print(f"时间轴开始时间: {start_time} 微秒")
|
||||
print(f"时间轴结束时间: {end_time} 微秒")
|
||||
|
||||
# 创建视频片段
|
||||
video_segment = VideoSegment(
|
||||
material=video_material,
|
||||
target_timerange=Timerange(start=start_time, duration=source_duration),
|
||||
source_timerange=Timerange(start=0, duration=min(specified_duration, video_material.duration)),
|
||||
speed=1.0,
|
||||
volume=1.0
|
||||
)
|
||||
|
||||
print(f"片段创建成功!")
|
||||
print(f"片段ID: {video_segment.segment_id}")
|
||||
print(f"素材ID: {video_segment.material_id}")
|
||||
print(f"目标时间范围: start={video_segment.target_timerange.start}, duration={video_segment.target_timerange.duration}")
|
||||
print(f"源时间范围: start={video_segment.source_timerange.start}, duration={video_segment.source_timerange.duration}")
|
||||
print(f"播放速度: {video_segment.speed.speed}")
|
||||
|
||||
# 验证结果
|
||||
assert video_segment.target_timerange.start == start_time
|
||||
assert video_segment.target_timerange.duration == source_duration
|
||||
assert video_segment.source_timerange.duration <= video_material.duration
|
||||
print("测试场景1通过!")
|
||||
|
||||
# 测试场景2:指定duration小于实际视频时长
|
||||
specified_duration = 1000000 # 1秒
|
||||
source_duration = 2000000 # 2秒(实际播放时长)
|
||||
start_time = 6000000 # 从6秒开始
|
||||
end_time = 8000000 # 到8秒结束
|
||||
|
||||
print(f"\n测试场景2:")
|
||||
print(f"指定duration: {specified_duration} 微秒")
|
||||
print(f"实际播放时长: {source_duration} 微秒")
|
||||
print(f"时间轴开始时间: {start_time} 微秒")
|
||||
print(f"时间轴结束时间: {end_time} 微秒")
|
||||
|
||||
# 创建视频片段
|
||||
video_segment2 = VideoSegment(
|
||||
material=video_material,
|
||||
target_timerange=Timerange(start=start_time, duration=source_duration),
|
||||
source_timerange=Timerange(start=0, duration=min(specified_duration, video_material.duration)),
|
||||
speed=1.0,
|
||||
volume=1.0
|
||||
)
|
||||
|
||||
print(f"片段创建成功!")
|
||||
print(f"片段ID: {video_segment2.segment_id}")
|
||||
print(f"素材ID: {video_segment2.material_id}")
|
||||
print(f"目标时间范围: start={video_segment2.target_timerange.start}, duration={video_segment2.target_timerange.duration}")
|
||||
print(f"源时间范围: start={video_segment2.source_timerange.start}, duration={video_segment2.source_timerange.duration}")
|
||||
print(f"播放速度: {video_segment2.speed.speed}")
|
||||
|
||||
# 验证结果
|
||||
assert video_segment2.target_timerange.start == start_time
|
||||
assert video_segment2.target_timerange.duration == source_duration
|
||||
assert video_segment2.source_timerange.duration <= video_material.duration
|
||||
print("测试场景2通过!")
|
||||
|
||||
finally:
|
||||
# Restore original uuid
|
||||
uuid.uuid4 = original_uuid4
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_video_duration_extension()
|
||||
print("\n所有测试通过!")
|
||||
Reference in New Issue
Block a user