ios和安卓手机端使用video标签播放失败的问题

一、情况说明

手机端请求后端接口,返回视频流给前端,然后在手机端进行播放,手机端需要适配ios和安卓,后端在开发好接口后在浏览器、postman调用接口时都能正常播放,安卓客户端也可以正常播放,但是ios播放失败。
刚开始觉得是网速太慢的原因,换了一个更小的视频,仍然不行,然后查了下资料,说是视频编码的问题,然后又换了下视频编码,仍然不行,最后经过测试,发现ios客户端使用video标签解析视频时会根据响应的请求头进行读取数据,响应头需要包含文件大小,如果没有就无法解析视频,但是在安卓客户端和浏览器上是没有这种问题的,所以需要兼容ios。

二、条件说明

视频文件是通过手机拍摄,没有经过任何处理的mp4文件。
后端是springboot项目,将视频放在resource资源目录下。
前端需要适配ios和安卓客户端,使用video标签进行解析。

三、后端代码

  • 首先需要读取类路径下的指定资源文件,转换为二进制流,设置好响应头,再返回。
    MP4
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.FileCopyUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

	@GetMapping("/video/{fileName}")
    public void video2(@PathVariable String fileName, HttpServletResponse response) throws IOException {
    	//读取类路径下的资源文件
        ClassPathResource resource = new ClassPathResource("file/" + fileName);
        //转为File对象
        File file = resource.getFile();
        //获取文件大小,因为file.length()返回的是long类型,单位是B,但是响应头是int类型,所以需要强转为int类型
        //int类型的大小为2147483647,折算下来,文件大小不能超过1GB,可以这样做,如果大小超过1GB,那么需要分段读取返回了
        int fileLength = (int)file.length();
        //将文件对象转为输入流
        FileInputStream input = new FileInputStream(file);
		//设置响应头,inline:表示在线预览,后面是文件的名字
        response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        //设置文件的大小 (ios不设置无法正常播放视频)
        response.setHeader("Content-Length", String.valueOf(fileLength));
        //文件格式
        response.setContentType("video/mp4");
        //将二进制流返回给前端
        FileCopyUtils.copy(input, response.getOutputStream());
    }

四、总结

  • 安卓和浏览器适配做得很好,只需要设置好文件类型和Content-Disposition,最后返回文件的二进制流即可。
    但是ios客户端还需要设置文件大小才能正确播放。
    我只做了MP4格式的视频,其他格式的视频暂时还没有试过,百度看了下,其他视频文件可能会涉及到视频编码的问题。
  • 在手机端上播放视频,流量很贵,像我的做法的话都是一次性返回整个文件的二进制流,这样过于暴力,后续优化的时候,可能要设置另外的响应头,进行分段返回。比如响应头中Content-Range是获取文件的部分内容。
  • 用分段的形式返回文件二进制流的实现方式:分段返回文件二进制流的实现方式
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 您好!关于您提到的问题,可能原因有以下几个:1.视频格式不支持,2.视频文件路径不正确,3.视频文件下载不完整或损坏。建议您先检查您的视频文件是否可以在其他设备或浏览器上正常播放。如果可以,再检查一下代码中的视频路径和格式是否正确。如果还是无法解决问题,可以提供更多细节信息,以便更好地帮助您解决问题。谢谢! ### 回答2: 在iOS使用video标签播放视频失败可能有多个原因。以下是一些可能的原因和解决方案: 1. 浏览器兼容性问题iOS系统使用的是Safari浏览器,它对于video标签的支持可能受到限制。首先,确保你使用的是最新版本的Safari浏览器。如果问题仍然存在,尝试使用其他第三方浏览器或者通过WebView组件来播放视频。 2. 视频格式不受支持:iOS通常支持播放常见的视频格式,如MP4。确保你的视频文件使用的是受支持的格式,并且编码设置正确。如果不确定视频格式是否正确,可以尝试使用其他格式进行测试。 3. 媒体服务器配置问题:如果你的视频是从远程媒体服务器加载的,确保服务器的配置正确。特别是检查MIME类型是否正确设置为video/mp4或其他支持的视频格式。 4. 网络连接问题:如果你的网络连接不稳定或者速度较慢,可能会导致视频加载失败。尝试连接其他稳定快速的网络来检查问题是否解决。 5. JavaScript或CSS代码问题:检查你的代码中是否有语法错误或者逻辑问题,可能会导致视频无法正确加载或播放。 如果以上解决方案都没有解决问题,建议查阅相关的开发文档,尝试通过调试工具来查找具体的错误信息和解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值