mirror of
https://github.com/Hommy-master/capcut-mate.git
synced 2026-10-28 03:54:51 +08:00
优化轨道,主轨道空着,什么也不放,新增加资源放在新轨道上方。
This commit is contained in:
@@ -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 = []
|
||||
|
||||
@@ -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}")
|
||||
|
||||
|
||||
@@ -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}")
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user