当前位置: 首页 > news >正文

图书网站开发数据库的建立游民星空是谁做的网站

图书网站开发数据库的建立,游民星空是谁做的网站,佛山网站建设团队,网站上做扫一扫1.场景描述 服务端上传MP4视频文件#xff0c;iOS客户端通过URL播放该视频文件。提供视频接口#xff0c;可以进行视频下载或者直接播放#xff0c;但是iOS手机无法播放#xff0c;且PC端safari浏览器也无法播放。 2.问题描述 安卓手机可以正常播放视频#xff0c;iOS手机…1.场景描述 服务端上传MP4视频文件iOS客户端通过URL播放该视频文件。提供视频接口可以进行视频下载或者直接播放但是iOS手机无法播放且PC端safari浏览器也无法播放。 2.问题描述 安卓手机可以正常播放视频iOS手机无法播放且PC段safari浏览器也无法播放。 3.问题分析 1safari不支持整个文件流服务器必须支持分段请求。 2safari对于文件流的请求需要包含一个请求头Range 和一个响应头Content-Range 4.针对问题分析进行文件分段传输以下代码已经验证可行代码如下 package com.example.yonyou.dyp.com;import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.io.InputStream;/*** description: iOS手机无法播放且PC端safari浏览器也无法播放问题修复* author Lancy* date: 2023/12/8 17:11*/ RestController RequestMapping(/videos) public class VideoController {GetMapping(/{videoFileName})public ResponseEntitybyte[] streamVideo(RequestHeader(value Range, required false) String rangeHeader,HttpServletRequest request) throws IOException {String filePath D:/video/20230801_093526.mp4;// 获取视频文件的Resource对象假设convertToLocalResource提供了这个方法Resource videoResource convertToLocalResource(filePath);// 处理Range请求if (rangeHeader ! null rangeHeader.startsWith(bytes)) {return handleRangeRequest(videoResource, rangeHeader);} else {return handleFullRequest(videoResource);}}private ResponseEntitybyte[] handleRangeRequest(Resource videoResource, String rangeHeader) throws IOException {// 解析Range请求头long[] range parseRange(rangeHeader, videoResource.contentLength());// 获取视频的部分数据byte[] videoBytes getPartialVideo(videoResource, range[0], range[1]);// 设置Content-Range头部HttpHeaders headers createRangeHeaders(videoBytes.length, range[0], range[1], videoResource.contentLength());return new ResponseEntity(videoBytes, headers, HttpStatus.PARTIAL_CONTENT);}private ResponseEntitybyte[] handleFullRequest(Resource videoResource) throws IOException {// 获取完整视频的数据byte[] videoBytes getFullVideo(videoResource);// 设置Content-Range头部HttpHeaders headers createFullHeaders(videoBytes.length, videoResource.contentLength());return new ResponseEntity(videoBytes, headers, HttpStatus.OK);}private long[] parseRange(String rangeHeader, long contentLength) {// 解析Range请求头String[] range rangeHeader.substring(6).split(-);long start Long.parseLong(range[0]);long end range.length1 || range[1].isEmpty() ? contentLength - 1 : Long.parseLong(range[1]);return new long[]{start, end};}private byte[] getPartialVideo(Resource videoResource, long start, long end) throws IOException {// 获取部分视频数据try (InputStream videoStream videoResource.getInputStream()) {long length end - start 1;byte[] videoBytes new byte[(int) length];videoStream.skip(start);videoStream.read(videoBytes, 0, (int) length);return videoBytes;}}private HttpHeaders createRangeHeaders(long contentLength, long start, long end, long totalLength) {// 设置Content-Range头部HttpHeaders headers new HttpHeaders();headers.setContentType(MediaType.parseMediaType(video/mp4));headers.setContentLength(contentLength);headers.add(Content-Range, bytes start - end / totalLength);return headers;}private byte[] getFullVideo(Resource videoResource) throws IOException {// 获取完整视频的数据try (InputStream videoStream videoResource.getInputStream()) {byte[] videoBytes new byte[(int) videoResource.contentLength()];videoStream.read(videoBytes, 0, videoBytes.length);return videoBytes;}}private HttpHeaders createFullHeaders(long contentLength, long totalLength) {// 设置Content-Range头部HttpHeaders headers new HttpHeaders();headers.setContentType(MediaType.parseMediaType(video/mp4));headers.setContentLength(contentLength);headers.add(Content-Range, bytes 0- (contentLength - 1) / totalLength);return headers;}public Resource convertToLocalResource(String filePath) {File file new File(filePath);if (file.exists() file.isFile()) {return new FileSystemResource(file);} else {throw new IllegalArgumentException(File does not exist or is not a regular file: filePath);}}}5.使用上述方案可以实现各环境的视频嵌套播放已经验证过可以直接用各位根据自己的代码稍作调整即可。
http://www.sadfv.cn/news/18633/

相关文章:

  • 网站建设注册哪类商标网站页面设计如何快速定稿
  • 服务器网站开发手机网站登录模板
  • 深圳创新网站建设常州网站制作推广
  • 2015个人备案网站论坛怎么做企业网站推广的方法
  • 建湖做网站的公司景安安装wordpress
  • 局机关建设网站的意义做设计的网站定制
  • 织梦网站关掉wap品牌建设让
  • 校园网站建设的可行性分析沧州网站制作多少钱
  • 建站行业成为买方市场办公网络建设项目商务要求
  • 做网站搞友情链接无锡百度
  • 如何免费做网站商家做网站的优点
  • 建立网站需要多少钱八寇湖南岚鸿团队网站页面优化方案
  • 网站会员系统wordpress推广普通话的重要性
  • 网站规划结构电子商务网站建设过程范文
  • 河南城乡建设部网站Wordpress页面手机不适配
  • 做网站首选科远网络网站如何设置404页面
  • 江苏纬信网站建设郑州网络营销网站
  • 做网站的公司哪好众筹网站开发分析报告
  • 网站开发前端要学什么软件深圳找网站建设
  • 软件通网站建设免费一级域名注册教程
  • 宁波网络推广产品服务天津seo托管
  • 深圳鼎诚网站建设企业手机版网站
  • 安庆网站建设为长沙亚町设计
  • 营销网站如何建设网站做那个效果好
  • 制作网站小程序正规的制作网页的公司
  • 与知名网站互连app开发哪家好
  • 海外网站cdn加速网络哪家公司最好
  • 电子商务网站建设的工具郑州人流医院哪家好
  • 杭州网站优化培训婴儿用品网站模板
  • wap网站建设开发广州做外贸网站