新闻详情

新闻详情

首页 / 资讯中心 / 详情

Moto 中 Kinesis Video Archived Media 服务的 Mock 实现指南:会话 URL 生成与视频剪辑获取

发布时间:2026/9/26 2:15:54来源:尧图网络
Moto 中 Kinesis Video Archived Media 服务的 Mock 实现指南:会话 URL 生成与视频剪辑获取
Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载本指南聚焦开源仓库 moto 对 AWSKinesis Video Archived Mediakinesis-video-archived-media服务的模拟实现覆盖该服务下已实现与未实现的 API 清单、底层数据端点DataEndpoint联动机制、会话 URL 的生成规则以及get_clip的返回结构。读完本文你将能在本地测试中通过 boto3 调用 HLS/DASH 会话 URL 获取与剪辑下载接口并了解这些模拟结果在源码层面的生成原理与边界限制。一、服务实现总览官方特性清单Moto 的服务实现清单文档 kinesis-video-archived-media.rst 明确记录了该服务的 API 支持状态。截至当前仓库版本六个 API 中有三个已实现、三个尚未实现API状态说明get_clip✅ 已实现返回视频剪辑Content-Type固定为video/mp4get_dash_streaming_session_url✅ 已实现生成 DASH Manifest 会话 URLget_hls_streaming_session_url✅ 已实现生成 HLS 主播放列表会话 URLget_images❌ 未实现—get_media_for_fragment_list❌ 未实现—list_fragments❌ 未实现—这三个已实现 API 是本文的讲解主线其完整后端逻辑集中在 moto/kinesisvideoarchivedmedia/models.py请求分发由 moto/kinesisvideoarchivedmedia/responses.py 完成。二、核心架构数据端点DataEndpoint与双后端联动理解该服务模拟的关键在于Kinesis Video Archived Media 的客户端不会直接访问服务主端点而是先通过 Kinesis Videokinesisvideo服务的get_data_endpoint拿到一个流专属的数据端点再用该端点发起会话 URL 或剪辑请求。这一联动在源码中体现得十分清晰。KinesisVideoArchivedMediaBackend通过属性直接挂接到 Kinesis Video 的后端实例models.pyclass KinesisVideoArchivedMediaBackend(BaseBackend): property def backend(self) - KinesisVideoBackend: return kinesisvideo_backends[self.account_id][self.region_name]也就是说Archived Media 后端与 Kinesis Video 后端共享同一账号、同一区域下的流数据。当调用方传入StreamName或StreamARN时后端委托给 Kinesis Video 的_get_stream查找流对象kinesisvideo/models.py优先按流名匹配未提供流名时按 ARN 精确查找均未命中则抛出ResourceNotFoundException。流对象上还有一个值得注意的方法get_data_endpointkinesisvideo/models.py它根据 API 名称决定端点前缀def get_data_endpoint(self, api_name: str) - str: data_endpoint_prefix s- if api_name in (PUT_MEDIA, GET_MEDIA) else b- return fhttps://{data_endpoint_prefix}{self.data_endpoint_number}.kinesisvideo.{self.region_name}.amazonaws.com实时媒体类 APIPUT_MEDIA/GET_MEDIA使用s-streaming前缀其余 API含本文的GET_HLS_STREAMING_SESSION_URL与GET_DASH_STREAMING_SESSION_URL使用b-batch/playback前缀。端点域名还嵌入了随机生成的十六进制编号与区域名因此在同一区域反复创建测试时每次拿到的数据端点都不同。三、会话 URL 生成get_hls_streaming_session_url 与 get_dash_streaming_session_url两个会话 URL 接口共享同一套生成逻辑_get_streaming_urlmodels.pydef _get_streaming_url(self, stream_name: str, stream_arn: str, api_name: str) - str: stream self.backend._get_stream(stream_name, stream_arn) data_endpoint stream.get_data_endpoint(api_name) session_token random_session_token() api_to_relative_path { GET_HLS_STREAMING_SESSION_URL: /hls/v1/getHLSMasterPlaylist.m3u8, GET_DASH_STREAMING_SESSION_URL: /dash/v1/getDASHManifest.mpd, } relative_path api_to_relative_path[api_name] return f{data_endpoint}{relative_path}?SessionToken{session_token}整个流程分为三步解析流对象通过_get_stream定位目标流取得数据端点调用流的get_data_endpoint(api_name)两个接口对应的路径分别是GET_HLS_STREAMING_SESSION_URL→/hls/v1/getHLSMasterPlaylist.m3u8GET_DASH_STREAMING_SESSION_URL→/dash/v1/getDASHManifest.mpd拼接会话 Tokensession_token来自 moto/sts/utils.py 的random_session_token()模拟真实 AWS 返回的短期会话凭证最终 URL 形如https://b-hex.kinesisvideo.region.amazonaws.com/hls/v1/getHLSMasterPlaylist.m3u8?SessionTokentoken https://b-hex.kinesisvideo.region.amazonaws.com/dash/v1/getDASHManifest.mpd?SessionTokentoken关于可选参数源码注释给出了明确说明models.py# Ignore option parameters as the format of hls_url doesnt depend on them即Expires、MaxMediaPlaylistFragmentResults、PlaybackMode、ContainerFormat、DiscontinuityMode、DisplayFragmentTimestamp等可选参数在 mock 实现中不参与 URL 生成——URL 格式只取决于 API 名称。对于仅需断言 URL 结构或验证调用链的测试而言这已足够但若你的测试依赖这些参数对 URL 的差异化影响则需注意当前版本不会体现。响应层在 responses.py 中完成参数提取与 JSON 封装分别从请求体读取StreamName/StreamARN调用后端后返回{HLSStreamingSessionURL: ...}或{DASHStreamingSessionURL: ...}。四、获取视频剪辑get_clipget_clip的 mock 实现刻意简化models.pydef get_clip(self, stream_name: str, stream_arn: str) - tuple[str, bytes]: self.backend._get_stream(stream_name, stream_arn) content_type video/mp4 # Fixed content_type as it depends on input stream payload bsample-mp4-video return content_type, payload行为要点仅校验流存在命中后返回固定内容Content-Type固定video/mp4注释解释称真实值取决于输入流本身因此 mock 不尝试推断Payload固定字节串bsample-mp4-video。请求参数ClipFragmentSelector片段选择类型与时间戳范围在服务端被忽略不做时间戳校验或切片。响应层将 payload 作为 HTTP 响应体、Content-Type写入响应头返回responses.py。因此该接口适合验证「剪辑下载链路通畅、响应头与响应体存在」不适合验证真实视频内容或时间戳切片逻辑。五、端到端实战在本地测试中调用 Archived Media仓库测试 test_kinesisvideoarchivedmedia.py 给出了完整可复制的调用范式。核心要点是必须先创建流并获取数据端点再以该端点为 endpoint 创建 archived media 客户端from moto import mock_aws import boto3 mock_aws def test_get_hls_streaming_session_url(): region_name ap-northeast-1 kvs_client boto3.client(kinesisvideo, region_nameregion_name) stream_name my-stream kvs_client.create_stream(StreamNamestream_name) api_name GET_HLS_STREAMING_SESSION_URL res kvs_client.get_data_endpoint(StreamNamestream_name, APINameapi_name) data_endpoint res[DataEndpoint] client boto3.client( kinesis-video-archived-media, region_nameregion_name, endpoint_urldata_endpoint, ) res client.get_hls_streaming_session_url(StreamNamestream_name) assert res[HLSStreamingSessionURL].startswith( f{data_endpoint}/hls/v1/getHLSMasterPlaylist.m3u8?SessionToken )该模式与真实 AWS 的调用方式一致先经 Kinesis Video 主端点获取数据端点再向数据端点发起 Archived Media 请求。测试同时对 URL 前缀做了断言印证了第三节所述的路径与 Token 拼接规则。DASH 与剪辑接口的测试遵循同一模式见同一测试文件# DASH断言前缀 data_endpoint /dash/v1/getDASHManifest.mpd?SessionToken res client.get_dash_streaming_session_url(StreamNamestream_name) # Clip构造片段选择器后断言 ContentType 与 Payload res client.get_clip( StreamNamestream_name, ClipFragmentSelector{ FragmentSelectorType: PRODUCER_TIMESTAMP, TimestampRange: { StartTimestamp: start_timestamp, EndTimestamp: end_timestamp, }, }, ) assert res[ContentType] video/mp4 assert Payload in res服务端模式下的存活检查见 test_server.py通过server.create_backend_app(kinesis-video-archived-media)启动 Flask 测试客户端对/getHLSStreamingSessionURL直接 POST 返回 404仅用于确认服务可启动。六、路由与请求分发路由规则定义在 urls.pyurl_bases匹配任意子域形式的https?://.*\.kinesisvideo\.(.)\.amazonaws.com所有路径统一交给KinesisVideoArchivedMediaResponse分发。这也解释了为什么客户端必须以数据端点b-hex.kinesisvideo.region.amazonaws.com作为 endpoint 才能命中 mock——它同样落在.kinesisvideo.region.amazonaws.com的域名模式内。在responses.py中每个已实现操作都对应同名处理方法通过_get_param从 JSON 请求体中提取StreamName与StreamARN最后返回 JSON 或二进制响应。而异常处理方面exceptions.py 目前为空文件注释标明暂无自实现异常流不存在等错误实际由 Kinesis Video 后端的ResourceNotFoundException抛出。七、未实现 API 与使用限制对照文档清单get_images、get_media_for_fragment_list、list_fragments三个 API 目前没有对应实现调用会落入未匹配路由或未实现操作。在编写相关测试时应避免依赖这三个接口或自行在上层 mock。此外还有几个已知限制值得在测试设计时留意Server 模式真实端点受限三个接口的单元测试在settings.TEST_SERVER_MODE下都会直接SkipTest注释说明原因是「DataEndpoint 被设置为真实 URL」见 test_kinesisvideoarchivedmedia.py。即在 moto server 模式下数据端点会指向真实 AWS 域名无法完成本地端到端调用请使用mock_aws装饰器的进程内模式。可选参数被忽略会话 URL 接口不解析Expires、PlaybackMode等选项参数URL 与这些参数无关。剪辑内容为占位数据get_clip不返回真实视频字节Content-Type与 payload 均为固定值时间戳范围与片段选择器不参与任何校验。八、小结Moto 对 kinesis-video-archived-media 的模拟围绕「Kinesis Video 数据端点联动」这一核心机制展开通过共享后端按流名/ARN 解析流对象生成带随机会话 Token 的 HLS/DASH 播放 URL并以固定内容响应剪辑请求。对于本地单元测试按「创建流 → 获取数据端点 → 以端点创建客户端 → 断言 URL 或响应体」的顺序即可稳定复现三个已实现 API 的调用链路。若需要进一步探索流对象结构与数据端点生成细节可继续阅读 moto/kinesisvideo/models.py 与 moto/kinesisvideoarchivedmedia/models.py。赞分享Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载相关推荐Moto 中 Kinesis Video StreamskinesisvideoMock 实现完全指南已支持 API、端点行为与实战测试Moto 中 Kinesis Video StreamskinesisvideoMock 实现完全指南已支持 API、端点行为与实战测试 本文基于 MotMock测试Moto 中 MediaStore Data 服务mediastore-data的 Mock 实现与实战指南Moto 中 MediaStore Data 服务mediastore data的 Mock 实现与实战指南 MediaStore DatamediastMock测试moto 中 AWS Payment Cryptographypayment-cryptography服务的 Mock 实现与实战指南moto 中 AWS Payment Cryptographypayment cryptography服务的 Mock 实现与实战指南 导读 本文基于 moMock测试上一篇Python初学者也能懂two-stream-action-recognition数据加载模块源码解读下一篇深入理解Solidity委托调用delegatecall代理模式实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于YOLO的课堂行为检测系统:选型、数据与部署实战 2026/9/26 3:01:31

基于YOLO的课堂行为检测系统:选型、数据与部署实战

简介:基于YOLO的课堂行为检测系统是一套面向高校毕业设计、课程设计与期末大作业场景的完整工程包,聚焦深度学习和图像识别在课堂管理中的应用。系统基于YOLOv8实现学生与教师行为检测,可自动识别多种课堂行为状态,并对实时视频和…

阅读更多 →
基于Python+Vue的协同过滤图书推荐系统:从算法选型到前后端联调实战 2026/9/26 3:01:25

基于Python+Vue的协同过滤图书推荐系统:从算法选型到前后端联调实战

简介:这份资源是面向高校计算机相关专业毕业设计的完整项目包,主题为PythonVue基于协同过滤算法的图书推荐系统,适合正在准备毕设、需要机器学习与前后端分离实战案例的学生参考。系统涵盖用户模块、图书模块、推荐算法模块与推荐结果展示模块…

阅读更多 →
TypeScript 内建 JavaScript 对象完全指南:类型化使用 Function、Array、Promise 与 Intl 等 15 个常用内置对象 2026/9/26 3:01:24

TypeScript 内建 JavaScript 对象完全指南:类型化使用 Function、Array、Promise 与 Intl 等 15 个常用内置对象

文档教程 【免费下载链接】typescript-book The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source. 项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book 点击查看 免费下载 TypeScript 是 Jav…

阅读更多 →
DeepSeek API Key 申请与 Python 调用实战:从零跑通到省钱策略 2026/9/26 3:01:24

DeepSeek API Key 申请与 Python 调用实战:从零跑通到省钱策略

1. 为什么我建议每个开发者都备一个 DeepSeek API Key这两年大模型 API 的价格战打得火热,但真正让我愿意长期留在工具箱里的,DeepSeek 算一个。原因很直接:推理质量够用、价格便宜到离谱、接口兼容 OpenAI 格式,意味着你之前为 O…

阅读更多 →
Google AI Edge Gallery 使用指南:在手机上部署离线大模型,从安装到自定义任务 2026/9/26 3:01:24

Google AI Edge Gallery 使用指南:在手机上部署离线大模型,从安装到自定义任务

Google AI Edge Gallery 使用指南:在手机上部署离线大模型,从安装到自定义任务 【免费下载链接】gallery A gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally. 项目地址: https://gitcode.com/G…

阅读更多 →
【AI前沿】GPT-5.6全球开放+微软换芯MAI+Claude“意识空间“揭秘:2026年7月10日AI日报-CSDN博客 2026/9/26 3:01:24

【AI前沿】GPT-5.6全球开放+微软换芯MAI+Claude“意识空间“揭秘:2026年7月10日AI日报-CSDN博客

首屏导读 本教程配套付费专栏: 大模型工程师修炼手记 19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程) AI时代程序员的自我提升 49.9 元(AI 时代成长方法论)。 单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉