优化轨道,主轨道空着,什么也不放,新增加资源放在新轨道上方。

This commit is contained in:
Hommy
2025-12-15 15:11:03 +08:00
parent 6b13c7cf1d
commit 2f30fbc1b3
5 changed files with 74 additions and 58 deletions
+10 -6
View File
@@ -12,7 +12,10 @@ import json
from typing import List, Dict, Any, Tuple
def add_audios(draft_url: str, audio_infos: str) -> Tuple[str, str, List[str]]:
def add_audios(
draft_url: str,
audio_infos: str
) -> Tuple[str, str, List[str]]:
"""
添加音频到剪映草稿的业务逻辑
@@ -29,10 +32,10 @@ def add_audios(draft_url: str, audio_infos: str) -> Tuple[str, str, List[str]]:
"audio_effect": "reverb" // [可选] 音频效果名称,默认值为None
}
]
Returns:
draft_url: 草稿URL
track_id: 音频轨道ID
track_id: 音频轨道ID(非主轨道)
audio_ids: 音频ID列表
Raises:
@@ -62,10 +65,11 @@ def add_audios(draft_url: str, audio_infos: str) -> Tuple[str, str, List[str]]:
# 4. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 5. 添加音频轨道
# 5. 添加音频轨道(明确说明不使用主轨道,并设置合适的渲染层级)
track_name = f"audio_track_{helper.gen_unique_id()}"
script.add_track(track_type=draft.TrackType.audio, track_name=track_name)
logger.info(f"Added audio track: {track_name}")
# 设置 relative_index=10 确保音频轨道在主音频轨道之上,避免与主轨道冲突
script.add_track(track_type=draft.TrackType.audio, track_name=track_name, relative_index=10)
logger.info(f"Added audio track (non-main track): {track_name}")
# 6. 遍历音频信息,添加音频到草稿中的指定轨道,收集音频ID
audio_ids = []
+7 -6
View File
@@ -52,7 +52,7 @@ def add_images(
Returns:
draft_url: 草稿URL
track_id: 视频轨道ID
track_id: 图片轨道ID(非主轨道)
image_ids: 图片ID列表
segment_ids: 片段ID列表
segment_infos: 片段信息列表,包含每个片段的ID、开始时间和结束时间
@@ -84,10 +84,11 @@ def add_images(
# 4. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 5. 添加视频轨道(图片使用视频轨道)
# 5. 添加图片轨道(明确说明不使用主轨道,并设置合适的渲染层级)
track_name = f"image_track_{helper.gen_unique_id()}"
script.add_track(track_type=draft.TrackType.video, track_name=track_name)
logger.info(f"Added image track: {track_name}")
# 设置 relative_index=10 确保图片轨道在主视频轨道之上,避免与主轨道冲突
script.add_track(track_type=draft.TrackType.video, track_name=track_name, relative_index=10)
logger.info(f"Added image track (non-main track): {track_name}")
# 6. 遍历图片信息,添加图片到草稿中的指定轨道,收集片段ID和信息
segment_ids = []
@@ -115,7 +116,7 @@ def add_images(
script.save()
logger.info(f"Draft saved successfully")
# 8. 获取当前视频轨道ID
# 8. 获取当前图片轨道ID
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
@@ -123,7 +124,7 @@ def add_images(
break
logger.info(f"Image track created, draft_id: {draft_id}, track_id: {track_id}")
# 9. 获取当前所有视频资源ID(包括图片)
# 9. 获取当前所有图片资源ID(明确说明这些是图片资源,不与主轨道冲突)
image_ids = [video.material_id for video in script.materials.videos if video.material_type == "photo"]
logger.info(f"Image track completed, draft_id: {draft_id}, image_ids: {image_ids}")
+6 -5
View File
@@ -49,7 +49,7 @@ def add_videos(
transform_y: Y轴位置偏移(像素)[可选],默认值为0
Returns:
"draft_url": "https://ts.fyshark.com/#/cozeToJianyin?drafId=...",
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=...",
"track_id": "video-track-uuid",
"video_ids": ["video1-uuid", "video2-uuid", "video3-uuid"],
"segment_ids": ["segment1-uuid", "segment2-uuid", "segment3-uuid"],
@@ -80,9 +80,10 @@ def add_videos(
# 4. 从缓存中获取草稿
script: ScriptFile = DRAFT_CACHE[draft_id]
# 5. 添加视频轨道
# 5. 添加视频轨道(明确说明不使用主轨道,并设置合适的渲染层级)
track_name = f"video_track_{helper.gen_unique_id()}"
script.add_track(track_type=draft.TrackType.video, track_name=track_name)
# 设置 relative_index=10 确保视频轨道在主视频轨道之上,避免与主轨道冲突
script.add_track(track_type=draft.TrackType.video, track_name=track_name, relative_index=10)
# 6. 遍历视频信息,添加视频到草稿中的指定轨道,收集片段ID
segment_ids = []
@@ -96,7 +97,7 @@ def add_videos(
# 7. 保存草稿
script.save()
# 获取当前视频轨道id
# 8. 获取当前视频轨道id
track_id = ""
for key in script.tracks.keys():
if script.tracks[key].name == track_name:
@@ -104,7 +105,7 @@ def add_videos(
break
logger.info(f"draft_id: {draft_id}, track_id: {track_id}")
# 获取当前所有视频资源ID(全局唯一ID)
# 9. 获取当前所有视频资源ID(全局唯一ID)
video_ids = [video.material_id for video in script.materials.videos]
logger.info(f"draft_id: {draft_id}, video_ids: {video_ids}")
+10 -2
View File
@@ -32,6 +32,15 @@ def create_draft(width: int, height: int) -> str:
# 创建剪映草稿
try:
script = draft_folder.create_draft(draft_id, width, height, allow_replace=True)
# 添加空的主轨道(仅当没有主轨道时添加)
main_track_name = "main_track"
script.add_track(track_type=draft.TrackType.video, track_name=main_track_name, relative_index=0)
logger.info(f"Added empty main track: {main_track_name}")
# 保存草稿以确保主轨道被创建
script.save()
except Exception as e:
logger.error(f"create draft failed: {e}")
raise CustomException(CustomError.DRAFT_CREATE_FAILED)
@@ -40,5 +49,4 @@ def create_draft(width: int, height: int) -> str:
update_cache(draft_id, script)
logger.info(f"create draft success: {draft_id}")
return config.DRAFT_URL + "?draft_id=" + draft_id
return config.DRAFT_URL + "?draft_id=" + draft_id
+41 -39
View File
@@ -91,43 +91,6 @@ def easy_create_material(
raise CustomException(CustomError.MATERIAL_CREATE_FAILED)
def add_audio_material(script: ScriptFile, audio_url: str) -> bool:
"""
添加音频素材到草稿
Args:
script: 草稿文件对象
audio_url: 音频文件URL
Returns:
是否成功添加
"""
try:
logger.info(f"Adding audio material: {audio_url}")
# 构造音频信息JSON
audio_infos = json.dumps([{
"audio_url": audio_url,
"duration": 30000000, # 默认30秒(30 * 1000000微秒)
"start": 0,
"end": 30000000,
"volume": 1.0
}])
# 直接使用草稿对象添加音频轨道和片段
from src.service.add_audios import parse_audio_data, add_audio_to_draft
audio_items = parse_audio_data(audio_infos)
if audio_items:
track_name = f"audio_track_{helper.gen_unique_id()}"
script.add_track(track_type=TrackType.audio, track_name=track_name)
add_audio_to_draft(script, track_name, "", audio_items[0])
return True
except Exception as e:
logger.error(f"Failed to add audio material: {str(e)}")
return False
def add_video_material(script: ScriptFile, video_url: str) -> bool:
"""
添加视频素材到草稿(固定5秒时长)
@@ -158,7 +121,8 @@ def add_video_material(script: ScriptFile, video_url: str) -> bool:
video_items = parse_video_data(video_infos)
if video_items:
track_name = f"video_track_{helper.gen_unique_id()}"
script.add_track(track_type=TrackType.video, track_name=track_name)
# 设置 relative_index=10 确保视频轨道在主视频轨道之上,避免与主轨道冲突
script.add_track(track_type=TrackType.video, track_name=track_name, relative_index=10)
add_video_to_draft(script, track_name, "", video_items[0])
return True
@@ -195,7 +159,8 @@ def add_image_material(script: ScriptFile, img_url: str) -> bool:
image_items = parse_image_data(image_infos)
if image_items:
track_name = f"video_track_{helper.gen_unique_id()}"
script.add_track(track_type=TrackType.video, track_name=track_name)
# 设置 relative_index=10 确保图片轨道在主视频轨道之上,避免与主轨道冲突
script.add_track(track_type=TrackType.video, track_name=track_name, relative_index=10)
add_image_to_draft(script, track_name, "", image_items[0])
return True
@@ -204,6 +169,43 @@ def add_image_material(script: ScriptFile, img_url: str) -> bool:
return False
def add_audio_material(script: ScriptFile, audio_url: str) -> bool:
"""
添加音频素材到草稿(固定5秒时长)
Args:
script: 草稿文件对象
audio_url: 音频文件URL
Returns:
是否成功添加
"""
try:
logger.info(f"Adding audio material: {audio_url}")
# 构造音频信息JSON(固定5秒时长)
audio_infos = json.dumps([{
"audio_url": audio_url,
"start": 0,
"end": 5000000, # 5秒(5 * 1000000微秒)
"volume": 1.0
}])
# 直接使用草稿对象添加音频轨道和片段
from src.service.add_audios import parse_audio_data, add_audio_to_draft
audio_items = parse_audio_data(audio_infos)
if audio_items:
track_name = f"audio_track_{helper.gen_unique_id()}"
# 设置 relative_index=10 确保音频轨道在主音频轨道之上,避免与主轨道冲突
script.add_track(track_type=TrackType.audio, track_name=track_name, relative_index=10)
add_audio_to_draft(script, track_name, "", audio_items[0])
return True
except Exception as e:
logger.error(f"Failed to add audio material: {str(e)}")
return False
def add_text_material(
script: ScriptFile,
text: str,