分类 编程语言 下的文章

错误描述

在使用uni-app开发微信小程序的时候,想要通过uni.chooseLocation获取用户地理位置的时候出现chooseLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json这样的错误。

错误分析

把错误日志分析下大致的意思就是:api需要在app.json/ext.json的requiredPrivateInfos字段中声明,也就是说需要app.json/ext.json在这里面配置下requiredPrivateInfos,那么怎么在uni-app里面配置呢?

解决办法

打开manifest.json选择源码视图,找到mp-weixin节点,添加requiredPrivateInfos的配置,源码如下:

"mp-weixin" : {
    "requiredPrivateInfos" : [ "chooseLocation", "getLocation" ]
}

然后问题就解决了,就可以正常获取用户的地理位置了。

现在的视频格式很多,有传统的、有新颖的,而m3u8格式的视频越来越受欢迎,因为它不占空间,而且播放速度很快。而且现在很多监控播放地址也是m3u8,video标签无法直接在浏览器中播放m3u8格式的视频。这时候我们需要借助video.js来播放。

第一步安装video.js

npm install vue-video-player videojs-contrib-hls --save

第二步在main.js中引入

import 'video.js/dist/video-js.css'

第三步新建视频播放组件

<template>
    <div style="width: 100%; height: 100%">
        <video id="video" preload="auto" muted class="video-js vjs-default-skin" style="width: 100%; object-fit: fill">
            <source :src="video" />
        </video>
    </div>
</template>
<script>
    import videojs from 'video.js'
    import 'videojs-contrib-hls'
    export default {
        props: {
            video: {
                value: null
            }
        },
        mounted() {
            this.$nextTick(() => {
                this.playVideo()
            })
        },
        methods: {
            playVideo() {
                videojs('video', {
                    bigPlayButton: true,
                    textTrackDisplay: false,
                    posterImage: false,
                    errorDisplay: false,
                    controls: true,
                    hls: {
                        withCredentials: true
                    }
                }, function() {
                    this.play()
                })
            }
        }
    }
</script>

第四部引用组件

<Video src="http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8"></Video>

AndroidStudio打包自定义Apk的名字

首先打开app下的build.gradle这个文件
在android的defaultConfig里面加上

  • 自定义名称

    // 自定义打包名称
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "自定义名称.apk"
        }
    }
  • 增加构建类型

    // 自定义打包名称
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "自定义名称_${buildType.name}.apk"
        }
    }
  • 增加版本号

    // 自定义打包名称
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "自定义名称_${buildType.name}_v${versionName}.apk"
        }
    }
  • 增加日期时间

    • 在android{}闭包外增加

      def generateTime() {
      return new Date().format("yyyy_MM_dd_HH_mm_ss")
      }
      // 自定义打包名称
      android.applicationVariants.all { variant ->
      variant.outputs.all {
          outputFileName = "自定义名称_${buildType.name}_v${versionName}_${generateTime()}.apk"
      }
      }

AndroidStudio打包APK教程

  • 点击导航栏的Build→Generate Signed Bundle / APK…
    1.png
  • 选择APK,然后点击Next
    2.png
  • 点击Create new...
    3.png
  • 点击文件夹的图片
    4.png
  • 输入jsk文件的名称选择保存的路径
    5.png
  • 填入一些信息
    6.png
  • 填入刚才设置的商店密码以及别名
    7.png
  • 选择release,然后点击Finish。
    8.png

然后就等待打包完成就行了。以后就直接可以打包了。也可以生成debug包。

如何取消萤石云视频加密并获取直播地址

小编最近在项目中使用到了海康威视的摄像头做直播,发现海康威视的摄像头可以直接接入到萤石云,进行直播,而且也可以进行回放十分的方便,但是获取直播后的地址发现播放不了,显示视频加密了,那么我们就得把视频解密,可以参考萤石云开发文档 https://open.ys7.com/doc/zh/book/index/user.html
下面就是小编用Python写了个解决办法:

deviceSerial = "xxxxx"
validateCode = "xxxxx"
token = "xxxxx"
datas = {"deviceSerial": deviceSerial, "validateCode": validateCode, "accessToken": token}
#发起请求,关闭加密
r = requests.post("https://open.ys7.com/api/lapp/device/encrypt/off", data=datas)
print(r.text)
#数据转换成json
codeJson = r.json()
#获取返回码
code = codeJson['code']
#如果返回码为'10002'(accessToken异常或过期),则重新获取accessToken,重新请求关闭视频加密,并且保存请求内容
if code == '10002':
    #根据appKey和appSecret获取accessToken
    datas = {'appKey': video.appkey,'appSecret': video.appsecret}
    r = requests.post("https://open.ys7.com/api/lapp/token/get", data=datas)
    keyJson = r.json()
    data = keyJson['data']
    #提取accessToken
    accessToken = data['accessToken']
    datas = {'deviceSerial': deviceSerial,'validateCode': validateCode}
    datas['accessToken'] = accessToken
    token = accessToken
    #重新请求关闭视频加密
    r = requests.post("https://open.ys7.com/api/lapp/device/encrypt/off", data=datas)
    #保存请求内容
    print(r.text)
# 获取直播地址
datas = {'accessToken': token, 'deviceSerial': deviceSerial, 'quality': 2, 'protocol': 4}
r = requests.post("https://open.ys7.com/api/lapp/v2/live/address/get", data=datas)
video.livetext = json.loads(r.text).get('data')

我们都知道在我们进行浮点运算的时候经常遇到的一个麻烦事就是精度问题,在js里面,0.1+0.2等于0.30000000000000004。为了解决这种精度丢失的问题我们可以先给每个小数乘以100转为正数,在最后除以100还原为浮点数这样也行。不过我们也可以借助big.js来解决任意精度的大十进制算术运算。

首先安装big.js

  • 可以直接导入

    <script src='https://cdn.jsdelivr.net/npm/big.js@6.0.0/big.min.js'></script>
  • 也可以通过npm安装

    npm install big.js
    import Big from 'big.js';
  • 也可以下载后导入

    https://github.com/MikeMcl/big.js

计算

  • 加法plus

    0.1 + 0.2                                     // 0.30000000000000004
    const x = new Big (0.1);
    const y = x.plus (0.2);                      // 0.3
  • 减法minus

    0.3 - 0.1                                     // 0.19999999999999998   
    const x = new Big (0.3);
    const y = x.minus (0.1)                      // 0.2
  • 乘法times

    0.6 * 3                    // 1.7999999999999998
    x = new Big(0.6)
    y = x.times(3)             // '1.8'
  • 除法div

    x = new Big(0.9)
    y = new Big(0.1)
    x.div(y)                   // 9

    其他用法

  • 数字处理

    x = new Big(255.5)
    x.toExponential(5)                     // "2.55500e+2"
    x.toFixed(5)                           // "255.50000"
    x.toPrecision(5)                       // "255.50"
  • 判断是否相等

    Big(-0).eq(0)              // true  ( -0 === 0 )

小编今天在使用Vue播放视频的时候,发现视频的格式是flv的,但是video标签是不支持flv格式的,我们只有借助第三方的工具库了。感谢bilibili团队制作的flv.js工具库。
我们首先安装下

npm install --save flv.js

然后我们在组件里面引入

import flvjs from 'flv.js'

我们再在视图里面创建一个id为videoElement的video标签。

<video id="videoElement" controls autoplay muted style="width: 4.5rem; height: 3rem;" />

在mounted中使用flvjs

mounted() {
    if (flvjs.isSupported()) {
        let videoElement = document.getElementById('videoElement');
        let flvPlayer = flvjs.createPlayer({
            type: 'flv',
            isLive: true,
            hasAudio: false,
            url: 'https://XXXXXX.flv'
        });
        console.log(flvPlayer, 'flv对象')
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play();
    }
},

注意:

  1. flv.js工具库仅支持HTTPFLV协议的流,如果使用RTMP协议的流则依然需要使用flash插件。
  2. 如果没有包含音频流,hasAudio要设置为false。
  3. 如果要自动播放的话,由于浏览器禁用音频的自动播放,所以我们要在video标签上设置muted属性。
  4. 官方文档:https://github.com/bilibili/flv.js

在Python3.3以及版本之前我们创建虚拟环境的时候都是使用的virtualenv,平时使用起来也比较方便,不过最近小编发现virtualenv已经装不上了。原来在Python3.3以上的版本中可以使用venv模块原生支持虚拟环境,也就是说原生的venv模块可以代替Python之前的virtualenv
venv模块和之前的virtualenv创建的虚拟环境,都可以提供与系统Python的隔离。每一个虚拟环境都有其自己的Python二进制(允许有不同的Python版本创作环境),并且可以拥有自己独立的一套Python包,对于项目的管理十分方便。但是需要注意的是,在Python3.3中使用venv命令创建的环境不包含pip,你需要进行手动安装,不过呢在Python3.4中改进了这一个缺陷。

使用方法:
创建虚拟环境

python3 -m venv [虚拟环境的名字]

mac启动虚拟环境

source [虚拟环境的名字]/bin/activate

windows启动虚拟环境

[虚拟环境的名字]\Scripts\activate.bat

退出虚拟环境

deactivate

如果是直接使用pip install M2Crypto安装的话就会出现

SWIG/_m2crypto.i:62: Error: Unable to find 'openssl/opensslv.h'
  SWIG/_m2crypto.i:68: Error: Unable to find 'openssl/safestack.h'
  SWIG/_evp.i:12: Error: Unable to find 'openssl/opensslconf.h'
  SWIG/_rc4.i:5: Error: Unable to find 'openssl/opensslconf.h'
  SWIG/_ec.i:7: Error: Unable to find 'openssl/opensslconf.h'
  error: command 'swig' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for m2crypto

这样的错误(没写完整哈),这是由于M2Crypto有两个依赖,openssl和swig,在Mac上需要首先安装这两个包,才能安装M2Crypto。
我们可以通过brew来安装这两个包,如果你的电脑没有brew的话,你就得先安装brew,小编在[post cid="773" /]这篇文章中介绍过怎么安装。下面我们来安装openssl和swig。

brew install openssl
brew install swig
# 有时候需要手动链接swig
# brew unlink swig && brew link swig

这时候就可以安装M2Crypto,不过还是有时候会报错,我们需要指定下地址

env LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" SWIG_FEATURES="-cpperraswarn -includeall -I$(brew --prefix openssl)/include"

然后我们就可以安装了M2Crypto

pip install M2Crypto