通过python将大文件上传到视频索引器

通过python将大文件上传到视频索引器,python,http-post,microsoft-cognitive,video-indexer,Python,Http Post,Microsoft Cognitive,Video Indexer,我正试图通过视频索引器API上传一个大视频(大约1.5GB)。然而,我的机器需要占用大量内存来完成这项工作。部署系统有相当少的RAM。我想使用API,这样视频可以分多个部分上传,而不会占用太多内存(大约100MB就足够了) 我曾尝试使用ffmpeg将视频分块并逐块上传,但视频索引器将它们识别为不同的视频,并为每个视频提供单独的见解。如果视频是在线聚合的,那就更好了 如何将分块视频上载到MS video Indexer?让我猜猜。之前,您按照官方教程和API参考(API参考页面末尾的Python示

我正试图通过视频索引器API上传一个大视频(大约1.5GB)。然而,我的机器需要占用大量内存来完成这项工作。部署系统有相当少的RAM。我想使用API,这样视频可以分多个部分上传,而不会占用太多内存(大约100MB就足够了)

我曾尝试使用ffmpeg将视频分块并逐块上传,但视频索引器将它们识别为不同的视频,并为每个视频提供单独的见解。如果视频是在线聚合的,那就更好了


如何将分块视频上载到MS video Indexer?

让我猜猜。之前,您按照官方教程和API参考(API参考页面末尾的Python示例代码,如下图所示)上传了您的大型视频

它需要大量内存,因为下面的代码发送从内存读取的数据块
{body}
,其值来自代码
open(“”).read()

但是,如果您仔细阅读本文档的小节和下面的C#code,即使是API参考中对
videoUrl
的解释,您也会看到作为
多部分/form
主体内容传递的视频文件并不是唯一的方法

视频URL

要编制索引的视频/音频文件的URL。URL必须指向媒体文件(不支持HTML页面)。文件可以通过作为URI一部分提供的访问令牌进行保护,为文件提供服务的端点必须使用TLS 1.2或更高版本进行保护。需要对URL进行编码

如果未指定videoUrl,则视频索引器希望您将文件作为多部分/表单正文内容传递

带有
videoUrl

API参考中
videoUrl
参数的屏幕截图

您可以首先通过或等工具将大型视频文件上载到Azure Blob存储或满足
videoUrl
要求的其他在线服务,然后以Azure Blob存储为例,使用sas令牌(Python代码如下)生成Blob url,将其作为
videoUrl
传递给API请求进行上载

使用sas令牌生成blob url的Python代码
从azure.storage.blob.baseblobservice导入baseblobservice
从azure.storage.blob导入BlockBlobsService,BlobPermissions
从datetime导入datetime,timedelta
帐户名称=“”
帐户密钥=“”
容器名称=“”
blob_名称=“”
服务=基本业务服务(帐户名称=帐户名称,帐户密钥=帐户密钥)
token=service.generate\u blob\u shared\u access\u签名(container\u name,blob\u name,BlobPermissions.READ,datetime.utcnow()+timedelta(小时=1),)
blobUrlWithSas=f“https://{account\u name}.blob.core.windows.net/{container\u name}/{blob\u name}?{token}”

希望有帮助。

您好,这绝对是一个选项,但我们不能通过分块传输编码发送视频吗?@gPats您不能通过分块传输编码将视频发送到视频索引API,但您可以将其分块传输到Azure Blob存储。请参考BlockBlob:的其余API,并使用它们的相关Python API。
conn.request("POST", "/{location}/Accounts/{accountId}/Videos?name={name}&accessToken={accessToken}&%s" % params, "{body}", headers)
from azure.storage.blob.baseblobservice import BaseBlobService
from azure.storage.blob import BlockBlobService, BlobPermissions
from datetime import datetime, timedelta

account_name = '<your account name>'
account_key = '<your account key>'
container_name = '<your container name>'
blob_name = '<your blob name>'
service = BaseBlobService(account_name=account_name, account_key=account_key)

token = service.generate_blob_shared_access_signature(container_name, blob_name, BlobPermissions.READ, datetime.utcnow() + timedelta(hours=1),)
blobUrlWithSas = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}?{token}"