首页 > 其他分享 >uniapp 解决app端视频滚动错误、首次加载黑屏的问题(包含后续的视频播放、下载)

uniapp 解决app端视频滚动错误、首次加载黑屏的问题(包含后续的视频播放、下载)

时间:2023-05-19 09:12:32浏览次数:45  
标签:视频 canvas uniapp height width 地址 video 黑屏

我的理解:出现app端视频滚动错误的原因是因为<video/> 组件在非H5端是原生组件,层级高于普通前端组件。首次加载黑屏的问题,我暂时还不知道原因

我的解决方案:获取视频第一帧转成图片展示

1、后端处理

刚开始在网上搜索解决办法都是在将video组件更换为image组件,地址仍写video的地址,在地址后面加上'?x-oss-process=video/snapshot,t_0,f_jpg'

后端给我返回的地址是预览视频地址,我加上这个是没有反应的。我试着用uniapp官网的视频地址,发现加不加这段都可以。

<image :disabled="false" :controls='false' :autoplay='false' :src="item+'?x-oss-process=video/snapshot,t_0,f_jpg'" mode=""></image>

官方视频地址跟我的视频地址的差别就是访问他的会直接下载视频,访问我的只是预览视频。所以我怀疑有这个的原因,跟后端沟通过,他说改成下载地址很麻烦。

最后的解决方法是当我访问视频的链接后面加了'?x-oss-process=video/snapshot,t_0,f_jpg',他就给我返回图片

2、前端处理:前端封装 video,结合renderjs把视频的第一帧转成图片展示

父组件页面:

<template>
    <view class="content image" @tap="showView(filePath)">
         <video-content :filePath="filePath"></video-content>
    </view>
</template>   
import VideoContent from './components/videoContent.vue';
export default {
    components: {
        VideoContent
    },
    methods: {
        showView(filePath) {
            uni.navigateTo({
                url: `/page/communication/components/videoView?filePath=${filePath}`
            })
        }
    }
}     

 

video-content组件页面

<template>
  <view class="videoContent">
    <!-- 播放按钮 -->
    <view class="video-cover">
      <image class="play-button" src="/static/communication/pc-play.png"></image>
    </view>
    <!-- 逻辑层调用视图层方法,采用监听data中变量改变的方法 -->
    <view id="canvas" class="canvas" :prop="newVal" :change:prop="canvas.create"></view>
    <!-- 逻辑层生成的图片回显 -->
    <image class="image" :src="demo" mode=""></image>
  </view>
</template>

 

<!-- 逻辑层script-->
<script>
export default {
  name: 'videoContent',
  props: {
    // 图片地址
    filePath: {
      type: String
    }
  },
  data() {
    return {
      demo: '',
    }
  },
  computed: {
    newVal() {
      return this.filePath
    }
  },
  onl oad() {

  },
  methods: {
    getDataURL(options) {
      this.demo = options.dataURL
    }
  }
}
</script>
<!-- 视图层script module对应HTML代码中view的id-->
<script module="canvas" lang="renderjs">
    export default {
        methods: {
            // 视图层创建base64图片
            create(newValue, oldValue, ownerInstance){
                // 第一次进入为空不操作
                if(newValue == null){
                    return
                }
                let video = document.createElement('video')
                video.setAttribute('crossOrigin', 'anonymous') // 处理跨域,H5需后台支持,请求的视频资源响应投标需有Access-Control-Allow-Origin
                video.setAttribute('src', newValue)
                video.setAttribute('width', 200)
                video.setAttribute('height', 200)
                video.setAttribute('preload', 'auto')
                // uni.chooseVideo选择视频,当选用手机拍摄的视频时,地址是相对地址,如 _doc/uniapp_temp_1650594368317/camera/1650594390147.mp4
                // 可播放,但是loadeddata一直不执行,会触发error事件,视频加载失败
                // 应先转换成本地地址
                video.addEventListener('loadeddata', function () {
                    console.log('视频第一帧加载完')
                    let canvas = document.createElement('canvas')
                    let width = video.width // canvas的尺寸和图片一样
                    let height = video.height
                    canvas.width = width
                    canvas.height = height
                    canvas.getContext('2d').drawImage(video, 0, 0, width, height) // 绘制canvas
                    const dataURL = canvas.toDataURL('image/jpeg') // 转换为base64
                    // 传递数据给逻辑层
                    ownerInstance.callMethod('getDataURL',{
                        dataURL: dataURL
                   })
                    console.log('getVideoPoster-dataURL', dataURL.slice(0, 16)) 
              })
          
             video.addEventListener('error', err => {
                    console.log('视频加载失败', err)         
                })
            }
        }
    }
</script>

 

 

<style lang="scss" scoped>
.videoContent {
  position: relative;

  .video-cover {
    position: absolute;
    width: 100%;
    height: 100%;
    background-color: rgba(1, 1, 1, .5);
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: center;

    .play-button {
      width: 40rpx;
      height: 40rpx;
      background-size: 50%;
      background-repeat: no-repeat;
      background-position: 50% 50%;
      cursor: pointer;
    }
  }

  .image {
    max-width: 160rpx;
    max-height: 260rpx;
  }
}
</style>

 

3、 点击,跳转页面实现视频播放、视频保存到本地相册

 

<template>
  <transition name="slide-fade">
    <view class="videoView">
      <cover-image class="cover-video" src="/static/communication/download.png" @tap="download"></cover-image>
      <video id="popupVideo" :src="videoUrl" autoplay :show-fullscreen-btn="false" :show-center-play-btn="false">
      </video>
    </view>
  </transition>
</template>

<script>
import http from '@/api/request'
import { toast } from '../../../utils'
export default {
  data() {
    return {
      videoUrl: ''
    }
  },
  onl oad({ filePath }) {
    this.videoUrl = http.config.fileUrl + filePath
  },
  methods: {
    download() {
      console.log('this.videoUrl', this.videoUrl)
      uni.downloadFile({
        url: this.videoUrl,
        success: (res) => {
          if (res.statusCode === 200) {
            uni.saveVideoToPhotosAlbum({
              filePath: res.tempFilePath,
              success: function () {
                toast("保存成功");
              },
              fail: function () {
                tToast("保存失败,请稍后重试");
              }
            });
          }
        }
      });
    }
  }
}
</script>

<style lang="scss" scoped>
.videoView {

  video {
    margin-top: 72rpx;
    height: calc(100% - 72rpx);
    width: 100%;
  }

  .close {
    padding: 12rpx;
    position: absolute;
    top: 0;
    right: 0;

    image {
      width: 48rpx;
      height: 48rpx;
    }
  }

  .cover-video {
    display: block;
    position: fixed;
    right: 15rpx;
    bottom: 15rpx;
    width: 70rpx;
    height: 70rpx;
    z-index: 999;
  }
}
</style>

 

标签:视频,canvas,uniapp,height,width,地址,video,黑屏
From: https://www.cnblogs.com/angia/p/17411489.html

相关文章

  • 视频课程|R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例
    全文链接:http://tecdat.cn/?p=32462原文出处:拓端数据部落公众号分析师:ChangZhang贝叶斯网络(BN)是一种基于有向无环图的概率模型,它描述了一组变量及其相互之间的条件依赖性。贝叶斯网络在信息不完备的情况下通过可以观察随机变量推断不可观察的随机变量,对于解决复杂的不确定性和......
  • 【视频】风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例|附代码数
    原文链接:http://tecdat.cn/?p=22862 最近我们被客户要求撰写关于风险价值VaR的研究报告,包括一些图形和统计输出。风险价值(VaR)是一种统计数据,用于量化公司、投资组合在特定时间范围内可能发生的财务损失程度 ( 点击文末“阅读原文”获取完整代码数据******** )。什么是风......
  • 【视频】复杂网络分析CNA简介与R语言对婚礼数据聚类社区检测和可视化|数据分享|附代码
    全文链接:http://tecdat.cn/?p=18770 最近我们被客户要求撰写关于复杂网络分析的研究报告,包括一些图形和统计输出。为了用R来处理网络数据,我们使用婚礼数据集 ( 查看文末了解数据获取方式 ) 。CNA研究和应用爆炸式增长的突出原因是两个因素-一个是廉价而强大的计算机的可......
  • Spring boot 整合 ffmpeg 实现给视频添加文字水印 只有上传minio(理论通用!!)
    只要有ffmpeg命令理论可以实现所有ffmpeg能做的的事儿!!思路:前端上传视频通过commons-io的FileUtils.copyInputStreamToFile()将流复制到文件中java执行ffmpeg命令对这个文件进行转换输出到另外一个临时文件在将添加水印后的文件转成inputStream流上传到minio(本人小白可能有......
  • [图]Firefox 69新功能:可默认同时阻止视频和音频以节省流量
    Mozilla终于开始考虑修复困扰Firefox浏览器数十年的吃带宽问题。在最新的FirefoxNightly69版本中,允许用户同时阻止视频和音频。当前稳定版中,只允许用户阻止音频播放,不过在最新版本中允许用户同时阻止音频和视频,这样在访问Facebook或者Twitter等网站时候就不会出现太耗流量的问题......
  • [钻芒美化] 在线解析视频VIP播放器安装源码,集成最新全能视频接口引流必备
    本文转载自:[钻芒美化]在线解析视频VIP播放器安装源码,集成最新全能视频接口引流必备更多内容请访问钻芒博客:https://www.zuanmang.net声明源程序源自网络。版权非博主所有!钻芒二开美化版集成姬长信最新API接口。基于DASH优化的P2P流媒体视频播放,支持:腾讯,爱奇艺,优酷,乐视,......
  • < Python全景系列-4 > 史上最全文件类型读写库大盘点!什么?还包括音频、视频?
    欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语言!本文系列第四篇,介绍史上最全PYTHON文件类型读写库大盘点!包含常用和不常用的大量文件格式!文本、音频、视频应有尽有!废话不多说!......
  • 开源即时通讯IM框架MobileIMSDK的Uniapp端开发快速入门
    ► 相关链接:① MobileIMSDK-Uniapp端的详细介绍② MobileIMSDK-Uniapp端的开发手册new(* 精编PDF版)一、理论知识准备您需要对Uniapp和Vue开发有所了解:1)Uniapp官方入门教程2)可能是最好的uniapp入门教程3)Uniapp官方Vue快速入门教程您需要对WebSocket技术有所了......
  • AI+视频智能应用在文明城市创建中的关键性作用
    行业背景目前,我国正处于加快推进现代化的历史阶段。文明城市是反映一个地区现代文明程度、城市综合竞争实力的重要标志,很多城市动员上下力量,争相创建文明城市。然而,仅靠人力动员无法见行见效。想要立竿见影,则必须依靠科技的力量,为创建文明城市赋能附效。方案简介基于AI智能分析网关......
  • 端-边-云一体化视频融合预警解决方案助力文旅产业更出圈
    一、文旅现状当前,中国的旅游业正在慢慢转型,文化与旅游结合的需求越来越明显。在各地文旅局的大力宣传下,全国各地掀起文旅热潮,前有西安大唐不夜城火爆全国,后有淄博烧烤现象级出圈,再有洛阳城打造国风盛宴。在各地文旅积极“内卷”的推动下,游客的旅行激情正在被点燃。当然,各地政府在......