说明
API为V1版本控制面获取视频数据接口,获取数据集中的数据列表和查看单条数据详情请集成ListItems和GetItem接口,详情请查看:ListItems - 获取数据集中的数据列表 ,GetItem - 查询数据详情
指定数据集ID,获取所有数据集内数据
接口名称:ListDatasetDataAPI
参数 | 类型 | 是否必选 | 示例值 | 描述 |
|---|---|---|---|---|
DatasetID | String | 是 | "106260669" | 数据集 ID |
PageNumber | Int | 否 | 1 | 搜索结果的页码; |
PageSize | Int | 否 | 10 | 每页搜索结果的数量; |
curl 'http://open.volcengineapi.com/?Action=ListDatasetDataAPI&Version=2025-03-01' \ --header 'Content-Type: application/json' \ --data '{ "DatasetID": "106260669", "Page": 1, "PageSize": 10 }'
字段名 | 类型 | 描述 |
|---|---|---|
TotalCount | Int | 查询结果的总数 |
Items | Array<ListDatasetDataAPIRespItem> | 搜索结果 |
字段名 | 类型 | 描述 |
|---|---|---|
ContentID | String | 媒体内容的唯一标识(在同一个数据集下唯一) |
ContentType | String | 内容类型,支持上传枚举值:
|
ParentContentID | String | 父内容唯一标识 |
SequenceIndex | Int64 | 标识多个子内容在父内容中的顺序信息(比如电视剧的集数),用于串联视频内容进行同媒体系列的跨视频理解 |
Status | String | 状态:处理完成(0),处理中(1),数据异常(2) |
ErrorCode | String | 异常信息:返回数据的异常信息 |
Timestamp | Int64 | 更新时间戳 :秒级的 unix表示 |
数据接入和质量问题错误码及其含义:
10001: InvalidJsonLineError - 无效的json行
10002: DataPrimaryKeyNotFoundError - 数据唯一标识未找到
10003: DataContentTypeNotFoundError - 数据类型未找到
10004: UnsupportedContentTypeError - 不支持的数据类型
10005: DuplicateMediaSequenceIndexError - 重复的媒体内容序号
10006: MediaCannotBeSetAsParentError - Video类型不能设置为父内容
10007: ParentContentMustBeCollectionError - 父内容必须是Collection类型
10008: ParentContentNotUploadedError - 父内容未上传
10009: InvalidVideoUrlError - 无效的视频URL
10010: InvalidImageUrlError - 无效的图片URL
10011: VideoUrlNotUploadedError - 视频URL未上传
10012: InvalidMediaSequenceIndexError - 无效的媒体内容序号(为负数)
视频处理失败的错误码及含义:
20000: VideoProcessError - 视频处理错误
20001: VideoDurationExceedsLimitError - 视频时长超过限制
20002: VideoSizeExceedsLimitError - 视频大小超过限制
22001: VideoUnderstandingClipsCommonException - 视频理解过程异常
22002: VideoUnderstandingClipsNoCallbackError - 视频理解无回调
22003: VideoUnderstandingClipsResultFailed - 视频理解结果失败
"Result": { "Items": [{ "ContentID": "test_0522_collection_01", "ContentType": "collection", "ParentContentID": "", "SequenceIndex": 0, "Timestamp": 1748953903, "Status": 0, "ErrorCode": "0" }, { "ContentID": "test_0522_series_01", "ContentType": "video", "ParentContentID": "test_0522_collection_01", "SequenceIndex": 1, "Timestamp": 1748953166, "Status": 0, "ErrorCode": "0" }, { "ContentID": "test_0522_single_01", "ContentType": "video", "ParentContentID": "", "SequenceIndex": 0, "Timestamp": 1748511326, "Status": 0, "ErrorCode": "0" }, "ContentID": "test_0522_series_02", "ContentType": "video", "ParentContentID": "test_0522_collection_01", "SequenceIndex": 2, "Timestamp": 1748503206, "Status": 0, "ErrorCode": "0" }, { "ContentID": "test_0522_series_03", "ContentType": "video", "ParentContentID": "test_0522_collection_01", "SequenceIndex": 3, "Timestamp": 1748413589, "Status": -1, "ErrorCode": "unknown" }] }
接口名称:GetDatasetDataAPI
指定数据集ID和数据ID,获取视频数据的详情内容
参数 | 类型 | 是否必选 | 示例值 | 描述 |
|---|---|---|---|---|
DatasetID | String | 是 | "106260669" | 数据集 ID |
ContentID | String | 是 | "106260669_5770528247083860262" | 数据唯一标识 |
curl 'http://open.volcengineapi.com/?Action=GetDatasetDataAPI&Version=2025-03-01' \ --header 'Content-Type: application/json' \ --data '{ "DatasetID": "106260669", "ContentID": "test_0522_collection_01" }'
字段名 | 类型 | 描述 |
|---|---|---|
Content | String | 原始数据字段 |
VideoContent | GetDatasetDataAPIRespVideoContent | Type为video时,返回视频理解后的内容 |
CollectionContent | GetDatasetDataAPIRespCollectionContent | Type为collection时,返回系列下所有视频生成的内容总结 |
字段名 | 类型 | 描述 |
|---|---|---|
Title | String | 生成的视频标题 |
Summary | String | 生成的视频总结 |
String | 视频故事线理解返回的全部内容,返回一段内涵json结构的字符串 |
字段名 | 类型 | 描述 |
|---|---|---|
Summary | String | 生成的系列总结 |
字段名 | 类型 | 描述 |
|---|---|---|
Summaries | Array | 总结 |
Titles | Array | 标题 |
Clips | Array<Clips> | 视频中分片段的理解内容 |
Clips
字段名 | 类型 | 描述 |
|---|---|---|
Title | String | 标题 |
Summary | String | 总结 |
Score | Float | 高光程度得分值,分数越高,高光值越高 |
Dialogue | String | 视频对话 |
Start | Float | 开始时间 |
End | Float | 结束时间 |
{ "Summaries": [ "唐仁与秦风卷入黄金失窃与密室杀人双重迷局,警方通缉与黑帮威胁接踵而至。两人通过监控覆盖规律与现场痕迹,发现凶手藏匿工坊长达一周。黄金被铸成佛像未流出,真凶竟是思诺养父为掩盖罪行设局。最终在佛像内寻回黄金,揭露杀人动机与完美犯罪手法,警匪追逐中真相浮出水面。" ], "Titles": [ "密室谜案与黄金佛像背后的终极对决" ], "Clips": [ { "Title": "女孩的秘密与决定", "Summary": "影片中,一个男孩失踪后,他的父亲一直在寻找他,甚至怀疑儿子已死,并认为凶手可能是一个女孩。画面中,蓝脸人在学校透过围栏观察着,场景切换到街道上,蓝脸人继续在人群中穿梭。另一边,一个蓝脸女孩在街道上行走,神情忧虑。她似乎知道继父对自己有着不寻常的爱,担心事情暴露,因此决定除掉继父。整个片段充满了悬疑和紧张的氛围。", "Score": 3.5, "Dialogue": null, "Start": 7414.5, "End": 7460.0 }, { "Title": "探秘真相,终章落幕", "Summary": "秦风在医院与思诺对峙,揭开了斯诺的阴谋。之后,秦风与唐仁在街头相遇,两人决定一起继续探案。他们来到一个高科技实验室,见到了许多先进的设备。最后,电影在一系列的字幕和鸣谢中结束。", "Score": 3.5, "Dialogue": null, "Start": 7460.0, "End": 8142.5 } ] }
{ "ResponseMetadata":{ "RequestId":"", "Service":"", "Action":"", "Region":"", "Version":"" }, "Result":{ "Content":"{\"description\":\"2007 年,地球基础科学出现异常扰动,科学界...\",\"genre\":\"剧情 / 科幻\",\"parent_content_id\":\"\",\"sequence_index\":0,\"title\":\"三体第3集\",\"translated_name\":\"三体 / Three-Body\",\"writers\":[\"田良良\",\"陈晨\"],\"country\":\"中国大陆\",\"year\":\"2023\",\"language\":\"汉语普通话\",\"content_id\":\"test_0522_collection_01\",\"content_type\":\"collection\",\"runtime\":\"\",\"cast\":[\"张鲁一\",\"于和伟\",\"陈瑾\",\"王子文\",\"林永健\",\"李小冉\",\"王传君\",\"张帆\",\"白客\",\"涂松岩\",\"刘敏\",\"寇振海\",\"杨蓉\",\"孔琳\",\"张峻宁\",\"柯南・何裴\",\"李则慧\",\"赵健\",\"何杜娟\",\"孔连顺\",\"韩青\",\"黎明明\",\"张铭恩\",\"朱戬\",\"郭靖宇\",\"江南\",\"蔡佳\",\"胡杰\",\"于洋\",\"侯鸿亮\",\"梁振华\",\"费振翔\",\"高亚麟\",\"季晨\",\"马东\",\"唐家三少\",\"白一骢\",\"杨磊\",\"贾士凯\",\"王薇\",\"王羽铮\",\"于歆玥\",\"潘晓莉\",\"蔡盈盈\"],\"douban_rating\":\"7.0\",\"release_date\":\"2023-01-15 (中国大陆)\",\"director\":\"杨磊\"}", "VideoContent":null, "CollectionContent":{ "Summary":"目录:第1个视频 卫冕冠军..." } } }
{ "ResponseMetadata":{ "RequestId":"", "Service":"", "Action":"", "Region":"", "Version":"" }, "Result":{ "Content":"{\"country\":\"中国大陆\",\"language\":\"汉语普通话\",\"sequence_index\":2,\"video_url\":[\"http://ai-search-rec-video.byte-test.com/d1d5d4c432cb4cebae6f5728902504fd/main.m3u8\"],\"writers\":[\"田良良\",\"陈晨\"],\"translated_name\":\"三体 / Three-Body\",\"content_type\":\"video\",\"director\":\"杨磊\",\"genre\":\"剧情 / 科幻\",\"runtime\":\"\",\"title\":\"三体第2集\",\"cast\":[\"张鲁一\",\"于和伟\",\"陈瑾\",\"王子文\",\"林永健\",\"李小冉\",\"王传君\",\"张帆\",\"白客\",\"涂松岩\",\"刘敏\",\"寇振海\",\"杨蓉\",\"孔琳\",\"张峻宁\",\"柯南・何裴\",\"李则慧\",\"赵健\",\"何杜娟\",\"孔连顺\",\"韩青\",\"黎明明\",\"张铭恩\",\"朱戬\",\"郭靖宇\",\"江南\",\"蔡佳\",\"胡杰\",\"于洋\",\"侯鸿亮\",\"梁振华\",\"费振翔\",\"高亚麟\",\"季晨\",\"马东\",\"唐家三少\",\"白一骢\",\"杨磊\",\"贾士凯\",\"王薇\",\"王羽铮\",\"于歆玥\",\"潘晓莉\",\"蔡盈盈\"],\"content_id\":\"test_0522_series_02\",\"description\":\"2007 年,地球基础科学出现异常扰动,科学界人心惶惶,多名科学家离奇自杀。纳米科学家汪淼被警官史强带到联合作战中心,潜入 “科学边界” 组织协助调查。汪淼接触到名为 ETO 的组织,发现其幕后统帅是自杀身亡的科学家杨冬的母亲叶文洁。随着 ETO 与作战中心的不断博弈,汪淼和史强逐渐确定《三体》游戏中的世界真实存在。一切事件源于两个文明为生存空间展开的生死相逐。在联合作战中心及科学家们的共同努力下,汪淼、史强等人坚定信念,准备与即将入侵的三体人展开殊死斗争。\",\"douban_rating\":\"7.0\",\"parent_content_id\":\"test_0522_collection_01\",\"release_date\":\"2023-01-15 (中国大陆)\",\"year\":\"2023\"}", "VideoContent":{ "Title":"物理规律崩塌下的科学危机与人性挣扎", "Summary":"科学家们在实验中发现五次撞击结果完全一致,质疑物理规律时空均匀性。杨冬实验数据异常引发物理学存在性危机,科学边界组织提出射手与农场主假说,暗示人类可能如同二维生物般受制于更高维度规律。汪淼卷入调查发现照片倒计时,实验室频现超自然现象,物理学崩溃的阴影下,角色们在学术信仰与生存危机间艰难抉择,倒计时的逼近加剧了悬疑氛围。", "Insight":"{\"Summaries\":[\"科学家们在实验中发现五次撞击结果完全一致,质疑物理规律时空均匀性。杨冬实验数据异常引发物理学存在性危机,科学边界组织提出射手与农场主假说,暗示人类可能如同二维生物般受制于更高维度规律。汪淼卷入调查发现照片倒计时,实验室频现超自然现象,物理学崩溃的阴影下,角色们在学术信仰与生存危机间艰难抉择,倒计时的逼近加剧了悬疑氛围。\"],\"Titles\":[\"物理规律崩塌下的科学危机与人性挣扎\"],\"Clips\":[{\"Title\":\"神秘许可证引出奇幻场景\",\"Summary\":\"视频开始显示了一张国产电视剧发行许可证,随后画面切换到一系列神秘的宇宙景象...\",\"Score\":3.5,\"Dialogue\":\"(沪)剧审字(2023)第001号。\",\"Start\":0.0,\"End\":83.0},{\"Title\":\"《三体》电视剧开场\",\"Summary\":\"画面中是深邃的宇宙星空背景,上面出现了‘三体’和‘THREE-BODY’的字样,同时显示该剧根据刘慈欣同名小说《三体》改编,这是《三体》电视剧的开场片头。\",\"Score\":1.0,\"Dialogue\":\"根据刘慈欣同名小说《三体》改编。\",\"Start\":2588.5,\"End\":2594.5}]}" }, "CollectionContent":null } }
使用 Python 发起请求并进行解析示例
import hashlib import hmac import json from datetime import datetime from urllib.parse import parse_qsl, urlencode, urlparse import pytz import requests from requests import PreparedRequest from requests.auth import AuthBase class OpenApiAuth(AuthBase): """火山引擎OpenAPI默认验证方式""" def __init__( self, access_key: str, secret_key: str, region: str, host: str, service_name: str, ) -> None: self.access_key = access_key self.secret_key = secret_key self.region = region self.host = host self.service_name = service_name def __call__(self, r: PreparedRequest): def sha256str(content: str | bytes) -> str: if content is None: content = "" if isinstance(content, str): content = content.encode("utf-8") return hashlib.sha256(content).hexdigest() def hmac_sha256(key: bytes, content: str) -> bytes: return hmac.new(key, content.encode("utf-8"), hashlib.sha256).digest() # 格式化时间 now = datetime.now(tz=pytz.timezone("UTC")) timestr = now.strftime("%Y%m%dT%H%M%SZ") datestr = now.strftime("%Y%m%d") # headers # 去掉不用的header,方便看日志 del r.headers["User-Agent"] del r.headers["Accept-Encoding"] del r.headers["Accept"] del r.headers["Connection"] del r.headers["Content-Length"] r.headers.update( { "X-Date": timestr, "Host": self.host, } ) # 选择需要加入签名的header部分 signed_headers = dict( filter( lambda x: x[0] in ["content-type", "content-md5", "host"] or x[0].startswith("x-"), r.headers.lower_items(), # key小写 ) ) # 80或443端口情况下host不带端口 if "host" in signed_headers: parse_result = urlparse("//" + signed_headers["host"]) host = parse_result.hostname port = parse_result.port if port in ["80", "443"]: signed_headers["host"] = host # header信息打包到一起 signed_str = "".join([f"{k}:{v}\n" for k, v in sorted(signed_headers.items())]) SignedHeaders = ";".join(sorted(signed_headers.keys())) scheme, netloc, path, params, query, fragment = urlparse(r.url) # 潜规则,query升序 query = parse_qsl(query) query.sort() query = urlencode(query) # 1. 创建一个正规化请求 canoncial_request = "\n".join( [r.method, path, query, signed_str, SignedHeaders, sha256str(r.body)] ) # 2. 创建签名字符串 credential_scope = "/".join( [datestr, self.region, self.service_name, "request"] ) signing_str = "\n".join( ["HMAC-SHA256", timestr, credential_scope, sha256str(canoncial_request)] ) # 3. 计算签名秘钥 kdate = hmac_sha256(self.secret_key.encode("utf-8"), datestr) kregion = hmac_sha256(kdate, self.region) kservice = hmac_sha256(kregion, self.service_name) signing_key = hmac_sha256(kservice, "request") # 4. 计算签名 Signature = hmac_sha256(signing_key, signing_str).hex() r.headers["Authorization"] = ( f"HMAC-SHA256 Credential={self.access_key}/{credential_scope}, SignedHeaders={SignedHeaders}, Signature={Signature}" ) return r auth = OpenApiAuth( access_key="", # 填写自己的access_key secret_key="", # 填写自己的secret_key region="cn-beijing", host="open.volcengineapi.com", service_name="aisearch", ) def GetDatasetDataAPI(dataset_id, content_id): payload = {"DatasetID": dataset_id, "ContentID": content_id} action = "GetDatasetDataAPI" resp = requests.post( f"http://open.volcengineapi.com/?Action={action}&Version=2025-03-01", json = payload, auth = auth, ) text = resp.text text = json.loads(text) data = text["Result"] if isinstance(data, dict) and "Content" in data and isinstance(data["Content"], str): try: data["Content"] = json.loads(data["Content"]) data["VideoContent"]["Insight"] = json.loads( data["VideoContent"]["Insight"] ) except json.JSONDecodeError: print("Content字段不是有效的JSON字符串") # 保存data为json文件 with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) if __name__ == "__main__": # 查看content_id详情 GetDatasetDataAPI("106266573", "10009_2")