国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

蘋(píng)果手機(jī)video標(biāo)簽播放視頻問(wèn)題(播放mp4視頻遇到的坑)

這篇具有很好參考價(jià)值的文章主要介紹了蘋(píng)果手機(jī)video標(biāo)簽播放視頻問(wèn)題(播放mp4視頻遇到的坑)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.場(chǎng)景描述
服務(wù)端上傳MP4視頻文件,iOS客戶端通過(guò)URL播放該視頻文件。提供視頻接口,可以進(jìn)行視頻下載或者直接播放,但是iOS手機(jī)無(wú)法播放,且PC端safari瀏覽器也無(wú)法播放。
2.問(wèn)題描述
安卓手機(jī)可以正常播放視頻,iOS手機(jī)無(wú)法播放,且PC段safari瀏覽器也無(wú)法播放。
3.問(wèn)題分析
(1)safari不支持整個(gè)文件流,服務(wù)器必須支持分段請(qǐng)求。
(2)safari對(duì)于文件流的請(qǐng)求需要包含一個(gè)請(qǐng)求頭Range, 和一個(gè)響應(yīng)頭Content-Range

4.針對(duì)問(wèn)題分析,進(jìn)行文件分段傳輸,以下代碼已經(jīng)驗(yàn)證,可行,代碼如下:

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手機(jī)無(wú)法播放,且PC端safari瀏覽器也無(wú)法播放問(wèn)題修復(fù)
 * @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對(duì)象(假設(shè)convertToLocalResource提供了這個(gè)方法)
        Resource videoResource = convertToLocalResource(filePath);

        // 處理Range請(qǐng)求
        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請(qǐng)求頭
        long[] range = parseRange(rangeHeader, videoResource.contentLength());

        // 獲取視頻的部分?jǐn)?shù)據(jù)
        byte[] videoBytes = getPartialVideo(videoResource, range[0], range[1]);

        // 設(shè)置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 {
        // 獲取完整視頻的數(shù)據(jù)
        byte[] videoBytes = getFullVideo(videoResource);

        // 設(shè)置Content-Range頭部
        HttpHeaders headers = createFullHeaders(videoBytes.length, videoResource.contentLength());

        return new ResponseEntity<>(videoBytes, headers, HttpStatus.OK);
    }

    private long[] parseRange(String rangeHeader, long contentLength) {
        // 解析Range請(qǐng)求頭
        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 {
        // 獲取部分視頻數(shù)據(jù)
        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) {
        // 設(shè)置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 {
        // 獲取完整視頻的數(shù)據(jù)
        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) {
        // 設(shè)置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.使用上述方案可以實(shí)現(xiàn)各環(huán)境的視頻嵌套播放,已經(jīng)驗(yàn)證過(guò),可以直接用,各位根據(jù)自己的代碼稍作調(diào)整即可。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-836633.html

到了這里,關(guān)于蘋(píng)果手機(jī)video標(biāo)簽播放視頻問(wèn)題(播放mp4視頻遇到的坑)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【記錄處理Vue項(xiàng)目中Video.js播放不了MP4視頻Bug】

    【記錄處理Vue項(xiàng)目中Video.js播放不了MP4視頻Bug】

    在Vue項(xiàng)目中使用Video.js播放MP4視頻。 在項(xiàng)目中使用Video.js播放MP4視頻。視頻采集上來(lái)存在數(shù)據(jù)庫(kù),前端使用Video.js對(duì)視頻進(jìn)行播放。突然有一天,MP4視頻播放不了,并且報(bào)錯(cuò): VIDEOJS: ERROR: (CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) No compatible source was found for this media. 并發(fā)現(xiàn)前一時(shí)間段采集到

    2024年04月14日
    瀏覽(28)
  • 蘋(píng)果手機(jī)視頻mov轉(zhuǎn)mp4格式的方法

    蘋(píng)果手機(jī)視頻mov轉(zhuǎn)mp4格式的方法

    ? ? ???蘋(píng)果手機(jī)視頻mov轉(zhuǎn)mp4格式的方法?使用蘋(píng)果手機(jī)的小伙伴是越來(lái)越多了,蘋(píng)果手機(jī)中的視頻格式為mov,這是一種音視頻格式的封裝格式,比起mp4,mov還能夠容納腳本、圖片、Java等等,說(shuō)起來(lái)比mp4更高級(jí),但是因?yàn)閙ov視頻在脫離了蘋(píng)果設(shè)備以后就會(huì)出現(xiàn)無(wú)法被認(rèn)可,無(wú)

    2024年02月11日
    瀏覽(21)
  • 蘋(píng)果safari瀏覽器播放不了video標(biāo)簽視頻

    蘋(píng)果safari瀏覽器播放不了video標(biāo)簽視頻

    今天遇到了個(gè)神奇的問(wèn)題,視頻文件在pc端和安卓手機(jī)上播放都沒(méi)問(wèn)題,但是在ios上就是播放不了,大概代碼如下: 前端代碼: 后端代碼: PC端沒(méi)任何問(wèn)題: IOS端播放不了: 在網(wǎng)上搜索了很多辦法,有加前端參數(shù)配置的: 有改后端多次發(fā)送請(qǐng)求,分段獲取數(shù)據(jù)流的: 經(jīng)過(guò)

    2024年02月16日
    瀏覽(32)
  • Ubuntu無(wú)法播放MP4格式視頻問(wèn)題的解決

    歷經(jīng)3天艱苦卓絕的嘗試,期間直接將虛擬機(jī)玩崩了一次,今天終于是弄好了啊。 ????????開(kāi)始是按照該博主的文章,安裝了FFMPEG: (1條消息) Ubuntu 18.04 安裝FFmpeg_假裝很壞的謙謙君的博客-CSDN博客_ubuntu18安裝ffmpeg https://blog.csdn.net/qq_38863413/article/details/105017775 ? ? ? ? 安裝完

    2023年04月27日
    瀏覽(15)
  • 關(guān)于使用video標(biāo)簽插入視頻時(shí),視頻無(wú)法播放的問(wèn)題

    關(guān)于使用video標(biāo)簽插入視頻時(shí),視頻無(wú)法播放的問(wèn)題

    寫(xiě)代碼遇到一個(gè)問(wèn)題:使用video標(biāo)簽插入視頻時(shí),在chrome中無(wú)法播放,只顯示了一個(gè)封面圖片,在ie卻可以播放。 video的使用是看別人的: 由于照搬別人的代碼,我寫(xiě)的代碼如下: 然后出現(xiàn)問(wèn)題:只有個(gè)封面,不能播放視頻 解決過(guò)程: ?我以為是瀏覽器兼容問(wèn)題,查資料發(fā)

    2024年02月11日
    瀏覽(96)
  • ios和安卓手機(jī)端使用video標(biāo)簽播放失敗的問(wèn)題

    ios和安卓手機(jī)端使用video標(biāo)簽播放失敗的問(wèn)題

    手機(jī)端請(qǐng)求后端接口,返回視頻流給前端,然后在手機(jī)端進(jìn)行播放,手機(jī)端需要適配ios和安卓,后端在開(kāi)發(fā)好接口后在瀏覽器、postman調(diào)用接口時(shí)都能正常播放,安卓客戶端也可以正常播放,但是ios播放失敗。 剛開(kāi)始覺(jué)得是網(wǎng)速太慢的原因,換了一個(gè)更小的視頻,仍然不行,

    2024年01月18日
    瀏覽(88)
  • 【音視頻筆記】Mediacodec+Muxer生成mp4,瀏覽器無(wú)法播放問(wèn)題處理

    最近在測(cè)試視頻錄制功能時(shí)發(fā)現(xiàn),AudioRecord + MediaCodec + MediaMuxer生成的MP4,PC瀏覽器無(wú)法播放 ,但是Android、Windows、Mac的播放器應(yīng)用都能正常播放。雖然不禁想吐槽瀏覽器視頻組件的容錯(cuò)性差,但我也意識(shí)生成的文件格式肯定也是有問(wèn)題的。 然后嘗試了合成MP4視頻時(shí),只保留視

    2024年02月07日
    瀏覽(116)
  • Moviepy輸出視頻MP4文件Windows媒體播放器播放無(wú)畫(huà)面只有聲音問(wèn)題的解決辦法

    Moviepy輸出視頻MP4文件Windows媒體播放器播放無(wú)畫(huà)面只有聲音問(wèn)題的解決辦法

    一、問(wèn)題 這2天用Moviepy合成了一個(gè)視頻文件,用windows媒體播放器播放時(shí)只有聲音沒(méi)有畫(huà)面,如圖: 而用手機(jī)播放器卻可以正常播放。 二、問(wèn)題定位 文件基本信息如下: 再看視頻相關(guān)信息: 可以看到Windows中文件信息中沒(méi)有視頻的寬度和高度信息,看來(lái)視頻的分辨率信息存在

    2024年02月03日
    瀏覽(92)
  • 谷歌chrome瀏覽器無(wú)法自動(dòng)播放video標(biāo)簽視頻的問(wèn)題

    谷歌chrome瀏覽器無(wú)法自動(dòng)播放video標(biāo)簽視頻的問(wèn)題

    問(wèn)題根源詳見(jiàn): Chrome中的自動(dòng)播放政策??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日
    瀏覽(121)
  • uniapp使用video標(biāo)簽無(wú)法播放視頻出現(xiàn)黑屏問(wèn)題處理

    uniapp使用video標(biāo)簽無(wú)法播放視頻出現(xiàn)黑屏問(wèn)題處理

    問(wèn)題出現(xiàn)情況 并且點(diǎn)擊播放后出現(xiàn)報(bào)錯(cuò) 解決辦法 問(wèn)題出現(xiàn)的原因可能是video的視頻流不兼容或者在f12下無(wú)法看見(jiàn)視頻文件導(dǎo)致的,所有我們使用computed計(jì)算屬性來(lái)解決這個(gè)問(wèn)題 js html 按照上面的做法 這樣問(wèn)題就解決了 希望能解決大家的問(wèn)題 一鍵三連

    2024年02月11日
    瀏覽(106)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包