Files
dsProject/dsLightRag/JiMeng/T3_JmImg2Video.py

107 lines
4.2 KiB
Python
Raw Normal View History

2025-08-19 15:38:05 +08:00
import json
import time
import logging
from JiMeng.Kit.JmCommon import JmCommon
from JiMeng.Kit.JmErrorCode import JmErrorCode
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger('JmImg2Video')
class JmImg2Video(JmCommon):
req_key = "jimeng_vgfm_i2v_l20"
action = "CVSync2AsyncSubmitTask"
@staticmethod
def submit_image_to_video_task(image_urls, prompt):
"""
提交图生视频任务使用图片URL
:param image_urls: 图片URL列表
:param prompt: 提示词
:return: 任务结果
:raises Exception: 异常信息
"""
# 创建请求体
req = {
"req_key": JmImg2Video.req_key,
"image_urls": image_urls,
"prompt": prompt
}
response_body = JmCommon.do_request(
method="POST",
query_list={}, # 添加空字典作为query_list参数
body=json.dumps(req).encode('utf-8'),
action=JmImg2Video.action
)
return json.loads(response_body)
def main():
try:
2025-08-20 10:35:52 +08:00
# 参考: https://www.volcengine.com/docs/85621/1544774
2025-08-19 15:38:05 +08:00
image_urls = [
2025-08-20 10:10:28 +08:00
"https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/Backup/Text2Img.jpg"
2025-08-19 15:38:05 +08:00
]
2025-08-20 10:17:04 +08:00
prompt = """
|镜号|运镜|画面内容|
| :---: | :---: | --- |
|1|固定镜头|穿着黄色安全帽反光背心的工人背着小女孩左手抱着小熊玩偶两人脸上洋溢着幸福的笑容背景是老旧居民楼和湿漉漉的路面|
|2|推镜头|镜头从两人全身慢慢推近至两人上半身聚焦两人亲密温馨的神态|
|3|平移镜头|镜头从两人正面平移至侧面展现工人的朴实与小女孩的可爱|
|4|拉镜头|镜头逐渐拉远展现两人在居民楼间道路上的整体场景|
|5|固定镜头|定格在两人互动的画面突出亲情的温暖氛围|
"""
2025-08-19 15:38:05 +08:00
mp4_file_name = "image2video.mp4"
2025-08-20 10:35:52 +08:00
submit_result = JmImg2Video.submit_image_to_video_task(image_urls, prompt)
logger.info(f"提交结果: {submit_result}")
code = submit_result.get("code")
if not JmErrorCode.is_success(code):
logger.error(f"提交任务失败: 错误码={code}, 错误信息={JmErrorCode.get_message_by_code(code)}")
2025-08-19 15:38:05 +08:00
return
# 获取任务ID
task_id = submit_result.get("data", {}).get("task_id")
logger.info(f"任务ID: {task_id}")
# 检查任务是不是已经结束
query_retry_count = 0
max_query_retries = 10000 # 最大查询次数
query_retry_interval = 3000 # 查询间隔(毫秒)
while query_retry_count < max_query_retries:
result = JmCommon.query_task_result(task_id)
logger.info(f"查询结果: {result}")
code = result.get("code")
if not JmErrorCode.is_success(code):
logger.error(f"查询失败: 错误码={code}, 错误信息={JmErrorCode.get_message_by_code(code)}")
break
data = result.get("data")
if data and data.get("video_url"):
video_url = data.get("video_url")
logger.info(f"视频地址: {video_url}")
# 下载视频
2025-08-19 15:40:58 +08:00
save_video_path = fr"D:\dsWork\dsProject\dsLightRag\JiMeng\{mp4_file_name}"
2025-08-19 15:38:05 +08:00
logger.info("开始下载视频...")
JmCommon.download_file(video_url, save_video_path)
logger.info(f"视频已下载到: {save_video_path}")
break
else:
logger.info(f"任务处理中,等待{query_retry_interval}毫秒后重试...")
time.sleep(query_retry_interval / 1000)
query_retry_count += 1
if query_retry_count >= max_query_retries:
logger.error(f"任务查询超时,已达到最大查询次数: {max_query_retries}")
except Exception as e:
logger.error(f"程序执行异常: {str(e)}", exc_info=True)
if __name__ == "__main__":
main()