我正在尝试通过Video Indexer API上传大型视频(大约1.5 GB)。但是我的机器要占用大量RAM。部署系统具有相当少量的RAM。我想使用API,以便将视频上传为多个部分,而不会占用过多的内存(大约100MB即可)。
我曾尝试使用ffmpeg将视频分成几块,然后逐段上传,但Video Indexer却将它们识别为不同的视频,并为每个视频提供了独立的见解。如果将视频在线汇总会更好。
如何将视频分块上传到MS Video Indexer?
答案 0 :(得分:0)
让我猜。以前,您按照官方教程Tutorial: Use the Video Indexer API
和Upload Video
API参考(API参考页面末尾的Python示例代码,如下图所示)上传大型视频。
由于下面的代码发送了从内存中读取的数据块{body}
,而它的值来自代码open("<your local file name>").read()
,因此占用了大量内存。
conn.request("POST", "/{location}/Accounts/{accountId}/Videos?name={name}&accessToken={accessToken}&%s" % params, "{body}", headers)
但是,如果您仔细阅读了文档videoUrl
的Upload and index your videos
小节和以下C#代码,即使在API参考中对videoUrl
的解释中,您也会看到视频文件已通过作为multipart/form
正文内容并不是唯一的方法。
videoUrl
要建立索引的视频/音频文件的URL。 URL必须指向媒体文件(不支持HTML页面)。可以使用作为URI一部分提供的访问令牌来保护文件,并且使用TLS 1.2或更高版本对文件提供服务的端点必须进行保护。该网址需要进行编码。
如果未指定videoUrl,则视频索引器希望您将文件作为多部分/表单主体内容进行传递。
videoUrl
的C#代码的屏幕截图videoUrl
参数的屏幕截图您可以先通过Python streaming upload code或azcopy
或Azure Storage Explorer之类的其他工具将大视频文件上传到Azure Blob存储或满足videoUrl
要求的其他在线服务,然后以Azure Blob存储为例,生成带有sas令牌的blob网址(如下所示的Python代码),将其作为videoUrl
传递到API请求进行上传。
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}"
希望有帮助。