如何加载本地存储媒体资源实现向Android TV投屏播放视频
本地存储视频投屏到Android TV实现方案
核心原理
Google Cast SDK默认仅支持通过HTTP/HTTPS URL加载媒体资源,无法直接访问移动设备本地存储的文件,因此需要在本机启动临时轻量HTTP服务,将本地视频文件映射为可访问的内网HTTP地址,再提交给Cast会话播放。
具体实现步骤
- 第一步:引入本地HTTP服务依赖,推荐使用
NanoHTTPD,无需额外复杂配置,轻量易集成 - 第二步:实现本地视频文件的访问映射逻辑:
- 读取本地视频的
Uri,通过ContentResolver获取文件的真实路径、MIME类型、文件长度 - 自定义NanoHTTPD实例,在
serve()方法中匹配请求路径,返回对应本地视频的文件流、正确的响应头(包含Content-Type、Content-Length、支持断点续传的Range处理逻辑)
- 读取本地视频的
- 第三步:适配官方Cast示例的媒体加载逻辑
- 替换原示例中加载远程URL的逻辑,构造
MediaInfo实例时,setContentId参数传入本地HTTP服务的访问地址即可,其余逻辑和原官方示例加载远程URL的逻辑完全一致 - 注意Android 12及以上版本需保证本地HTTP服务在前台运行,避免被系统后台查杀导致播放中断
- 替换原示例中加载远程URL的逻辑,构造
- 第四步:权限适配
- 申请存储读取权限:Android 13及以上申请
READ_MEDIA_VIDEO,低版本申请READ_EXTERNAL_STORAGE - 无需额外网络权限,本地回环地址访问不受网络权限限制
- 申请存储读取权限:Android 13及以上申请
常见问题处理
- 播放卡顿:可增加HTTP服务的缓冲区大小,配置为1MB以上即可
- 快进快退失效:必须在NanoHTTPD的响应中正确处理
Range请求头,返回对应偏移量的文件流和206 Partial Content状态码 - 投屏断开后无法续播:本地HTTP服务需要和Cast会话生命周期绑定,会话销毁时再停止服务
内容的提问来源于stack exchange,提问作者AhmadHassan
相关产品推荐
相关产品推荐

