苹果手机video标签播放视频问题(播放mp4视频遇到的坑)

这篇具有很好参考价值的文章主要介绍了苹果手机video标签播放视频问题(播放mp4视频遇到的坑)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.场景描述
服务端上传MP4视频文件,iOS客户端通过URL播放该视频文件。提供视频接口,可以进行视频下载或者直接播放,但是iOS手机无法播放,且PC端safari浏览器也无法播放。
2.问题描述
安卓手机可以正常播放视频,iOS手机无法播放,且PC段safari浏览器也无法播放。
3.问题分析
(1)safari不支持整个文件流,服务器必须支持分段请求。
(2)safari对于文件流的请求需要包含一个请求头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 ResponseEntity<byte[]> 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 ResponseEntity<byte[]> 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 ResponseEntity<byte[]> 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.length==1 || 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.使用上述方案可以实现各环境的视频嵌套播放,已经验证过,可以直接用,各位根据自己的代码稍作调整即可。文章来源地址https://www.toymoban.com/news/detail-836633.html

到了这里,关于苹果手机video标签播放视频问题(播放mp4视频遇到的坑)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【记录处理Vue项目中Video.js播放不了MP4视频Bug】

    在Vue项目中使用Video.js播放MP4视频。 在项目中使用Video.js播放MP4视频。视频采集上来存在数据库,前端使用Video.js对视频进行播放。突然有一天,MP4视频播放不了,并且报错: VIDEOJS: ERROR: (CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) No compatible source was found for this media. 并发现前一时间段采集到

    2024年04月14日
    浏览(35)
  • 苹果手机视频mov转mp4格式的方法

           苹果手机视频mov转mp4格式的方法?使用苹果手机的小伙伴是越来越多了,苹果手机中的视频格式为mov,这是一种音视频格式的封装格式,比起mp4,mov还能够容纳脚本、图片、Java等等,说起来比mp4更高级,但是因为mov视频在脱离了苹果设备以后就会出现无法被认可,无

    2024年02月11日
    浏览(34)
  • 苹果safari浏览器播放不了video标签视频

    今天遇到了个神奇的问题,视频文件在pc端和安卓手机上播放都没问题,但是在ios上就是播放不了,大概代码如下: 前端代码: 后端代码: PC端没任何问题: IOS端播放不了: 在网上搜索了很多办法,有加前端参数配置的: 有改后端多次发送请求,分段获取数据流的: 经过

    2024年02月16日
    浏览(61)
  • Ubuntu无法播放MP4格式视频问题的解决

    历经3天艰苦卓绝的尝试,期间直接将虚拟机玩崩了一次,今天终于是弄好了啊。         开始是按照该博主的文章,安装了FFMPEG: (1条消息) Ubuntu 18.04 安装FFmpeg_假装很坏的谦谦君的博客-CSDN博客_ubuntu18安装ffmpeg https://blog.csdn.net/qq_38863413/article/details/105017775         安装完

    2023年04月27日
    浏览(31)
  • 关于使用video标签插入视频时,视频无法播放的问题

    写代码遇到一个问题:使用video标签插入视频时,在chrome中无法播放,只显示了一个封面图片,在ie却可以播放。 video的使用是看别人的: 由于照搬别人的代码,我写的代码如下: 然后出现问题:只有个封面,不能播放视频 解决过程: ❌我以为是浏览器兼容问题,查资料发

    2024年02月11日
    浏览(40)
  • ios和安卓手机端使用video标签播放失败的问题

    手机端请求后端接口,返回视频流给前端,然后在手机端进行播放,手机端需要适配ios和安卓,后端在开发好接口后在浏览器、postman调用接口时都能正常播放,安卓客户端也可以正常播放,但是ios播放失败。 刚开始觉得是网速太慢的原因,换了一个更小的视频,仍然不行,

    2024年01月18日
    浏览(36)
  • 【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

    最近在测试视频录制功能时发现,AudioRecord + MediaCodec + MediaMuxer生成的MP4,PC浏览器无法播放 ,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件的容错性差,但我也意识生成的文件格式肯定也是有问题的。 然后尝试了合成MP4视频时,只保留视

    2024年02月07日
    浏览(50)
  • Moviepy输出视频MP4文件Windows媒体播放器播放无画面只有声音问题的解决办法

    一、问题 这2天用Moviepy合成了一个视频文件,用windows媒体播放器播放时只有声音没有画面,如图: 而用手机播放器却可以正常播放。 二、问题定位 文件基本信息如下: 再看视频相关信息: 可以看到Windows中文件信息中没有视频的宽度和高度信息,看来视频的分辨率信息存在

    2024年02月03日
    浏览(31)
  • 谷歌chrome浏览器无法自动播放video标签视频的问题

    问题根源详见: Chrome中的自动播放政策  https://developer.chrome.com/blog/autoplay/  The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For the Web Audio API, the autoplay policy launched in Chrome 71. This affects web games, some WebRTC appli

    2024年02月11日
    浏览(67)
  • uniapp使用video标签无法播放视频出现黑屏问题处理

    问题出现情况 并且点击播放后出现报错 解决办法 问题出现的原因可能是video的视频流不兼容或者在f12下无法看见视频文件导致的,所有我们使用computed计算属性来解决这个问题 js html 按照上面的做法 这样问题就解决了 希望能解决大家的问题 一键三连

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包