当前位置: 首页 > 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://wiki.neutronadmin.com/news/18633/

相关文章:

  • 麻章网站建设公司wordpress wp-json
  • 智库建设网站婚纱影楼网站免费源码
  • 建设英文网站的公司建设企业网站综合考虑
  • 佛山市公司网站建设哪家好免费做请帖的网站
  • pc建站网站外发加工网有哪些
  • 电子商务网站数据库怎么做网易企业邮箱登录入口手机网页版
  • php 网站 教程怎么做阿里巴巴外贸网站
  • 网站怎么做排名呢怎么建设
  • 本地网站建设信息大全购物网站功能模块设计
  • 深圳一百讯网站建设网站是公司域名是个人可以
  • dede网站地图html文件网站做流量的论坛贴吧
  • 长沙做一个网站多少钱wordpress信息搜集
  • 化妆品网站建设思路wordpress前端框架
  • 泰州网站建设多少钱qq空间秒赞秒评网站推广
  • 个人做网站下载网上图可以吗400平别墅装修费用
  • 论坛seo网站长沙网站推广平台
  • 域名注册的网站有哪些建设厅官方网站北京
  • 影视 网站建设 新媒体寒亭区建设局网站
  • 信阳建设网站哪家好文案转行做网站编辑
  • 联盟文明网站建设有新突破优秀设计网站大全
  • 可拖拽编程网站开发郑州发布
  • 小企业网站建设在哪里创建网站投资多少钱
  • 做网站专题的软件网站营销外包
  • 做视频网站怎么挣钱吗商标可以做网站吗
  • 滑县网站建设服务军民融合网站建设
  • 驻马店做网站公司wordpress seo模块
  • 宜昌最权威网站建设公司网络营销与直播电商专业就业方向
  • 网站建设对网络营销的影响万网网站设计
  • 在软件定义网络架构中管理员深圳网站建设专业乐云seo
  • 做美食推广的网站有哪些长沙营销型网站建设费用