天生DR
天生DR
  • 发布:2021-06-10 18:51
  • 更新:2024-03-12 11:32
  • 阅读:6642

video 组件 高阶晋级

分类:uni-app

video 组件 高阶晋级

前言

本文是为使用了uni-app 框架开发App时 使用video标签 但是播放部分视频有一定特殊需求时的解决方案。
如果现有功能已经满足日常开发,可以忽略本文。

IJKMediaFramework

  • 目前uni-app中 video的实现 是基于ijkplayer基础之上的二次封装, 框架已经设置了一些属性解决常见的问题,例如 seek不准确, http重定向跳转到rstp,https无法播放等问题。

通过 video 标签中的 advanced 可以实现对于一些高级属性的设置,下边是示例

    'format','codec','sws','player' 可以设置四种, 具体设置类型 通过文章所列或者 ijkplayer,ffmpeg 相关资料查询  

    <video :advanced= advanced> </video>  

    advanced = [  
        {  
            "key": "dns_cache_clear",  
            "value": 1,  
            "type": "format",  
        },  
        {  
            "key": "framedrop",  
            "value": 1,  
            "type": "player",  
        },  
        {  
            "key": "videotoolbox",  
            "value": 0,  
            "type": "player",  
        }  
    ]  

uni-app iOS端 video组件的设置

框架默认参数

Key 默认值 注释 所属类型
max-fps 30 最大fps player
framedrop 0 跳帧开关,如果cpu解码能力不足,可以设置成5,否则会引起音视频不同步,也可以通过设置它来跳帧达到倍速播放 player
video-pictq-size 3 暂无 player
videotoolbox 0 1开启 0关闭 硬解码(硬件解码CPU消耗低。软解,更稳定) player
videotoolbox-max-frame-width 960 指定最大宽度 player
enable-accurate-seek 1 某些视频在SeekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题,通俗一点就是FFMPEG不兼容,视频压缩过于厉害,seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少 player
auto_convert 0 自动转屏开关 fortmat
reconnect 1 重连次数 fortmat
timeout 30 1000 1000 (超时时间,timeout参数只对http设置有效。若果你用rtmp设置timeout,ijkplayer内部会忽略timeout参数。rtmp的timeout参数含义和http的不一样。) fortmat
user-agent Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Html5Plus/1.0 (Immersed/20) uni-app (具体值看真实设备的值) User-Agent fortmat
dns_cache_clear 1 清空DNS,有时因为在APP里面要播放多种类型的视频(如:MP4,直播,直播平台保存的视频,和其他http视频), 有时会造成因为DNS的问题而报10000问题的 fortmat

uni-app Android端 video组件的设置

框架默认参数

Key 默认值 注释 所属类型
max-fps 30 最大fps player
framedrop 5 跳帧开关,如果cpu解码能力不足,可以设置成5,否则会引起音视频不同步,也可以通过设置它来跳帧达到倍速播放 player
mediacodec 0 1开启 0关闭 硬解码(硬件解码更清晰。软解,更稳定) player
enable-accurate-seek 1 某些视频在SeekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题,通俗一点就是FFMPEG不兼容,视频压缩过于厉害,seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少 player
skip_loop_filter 0 环路滤波 0/8/16/24/32/48, 增强播放效率,其中48是指'AVDISCARD_ALL', 所有帧都不做环路滤波. codec
user-agent Mozilla/5.0 (Linux; Android 10; MXW-AN00 Build/HONORMXW-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 Html5Plus/1.0 (具体值看真实设备的值) User-Agent fortmat
dns_cache_clear 1 清空DNS,有时因为在APP里面要播放多种类型的视频(如:MP4,直播,直播平台保存的视频,和其他http视频), 有时会造成因为DNS的问题而报10000问题的 fortmat

高阶拓展参数

一些可能用到的参数

Key 可能设置的值 注释 所属类型
soundtouch 设置是否开启变调 1开启 0 不开启 player
skip_loop_filter 设置是否开启环路过滤,0开启,画面质量高,解码开销大,48关闭,画面质量差点,解码开销小 codec
analyzemaxduration 100L 设置播放前的最大探测时间 format
analyzeduration 设置播放前的探测时间 1,达到首屏秒开效果 format
probesize 1024*10 播放前的探测Size,默认是1M, 改小一点会出画面更快 format
flush_packets 1 每处理一个packet之后刷新io上下文 format
max-buffer-size 0 最大缓冲大小,单位kb player
packet-buffering 是否开启预缓冲,一般直播项目会开启,达到秒开的效果,不过带来了播放丢帧卡顿的体验 1开启 0 不开启 player
fflags fastseek 解决m3u8文件拖动问题 比如:一个3个多少小时的音频文件,开始播放几秒中,然后拖动到2小时左右的时间,要loading 10分钟 fortmat

还有一些更多的参数设置 大家可以参考 ffmpeg 和 一些网络文章

注意注意注意

ijkplayer 为开源项目,可以看得到源码,  
由于`iOS`和 `Android` 的差异性,部分属性可能只在一端生效,具体支持的参数,请查看 [ff_ffplay_options.h] (https://github.com/Bilibili/ijkplayer/blob/master/ijkmedia/ijkplayer/ff_ffplay_options.h)  
4 关注 分享
2***@qq.com 一抱一个胖猪猪 篮孓 1***@qq.com

要回复文章请先登录注册

y***@163.com

y***@163.com

做app时video组件怎么嵌入进一个倍速按钮
2024-03-12 11:32
王但是

王但是

回复 1***@qq.com :
去年离职了 你有什么模块需求?
2023-11-24 20:26
1***@qq.com

1***@qq.com

怎么联系你,有个模块想找你增加
2023-05-19 17:44
1***@qq.com

1***@qq.com

回复 1***@qq.com :
在advanced中增加{{
'key': 'max-fps',
'value': 1,
'type': 'player'
}}
这个之后,和没有添加的显示结果一样
感觉这个advanced 都没有生效
2022-12-06 11:48
1***@qq.com

1***@qq.com

回复 天生DR :
是的,设置了advanced的最大帧数为1,视频依然正常播放
advanced: [{
'key': 'analyzeduration',
'value': 1,
'type': 'format'
}, {
'key': 'analyzemaxduration',
'value': '100L',
'type': 'format'
}, {
'key': 'max-buffer-size',
'value': 1,
'type': 'player'
}, {
'key': 'packet-buffering',
'value': 1,
'type': 'player'
}]
这是设置的参数、安卓端,
<video :httpCache='true' :advanced='advanced' :show-loading="isShowLoad" :controls="false" :show-center-play-btn="false" :show-fullscreen-btn="false" :show-progress="false" :objectFit="objectFit" :src="src" :enable-progress-gesture="false" @fullscreenchange="changeScreen" @timeupdate="timeupdate" @ended="ended" @waiting="waiting" @play="playing" :id="'chunleiVideo'+vId" :ref="'chunleiVideo'+vId" class="video" codec='hardware' :style="{ height: `${vHeight}rpx`,width: `${vWidth}rpx`}" v-if="isVideo" header={ Range: bytes=0-10240 }>
这是对应的标签
2022-12-06 11:42
天生DR

天生DR (作者)

回复 1***@qq.com :
设置的advanced 那个参数没生效?
2022-12-05 11:49
1***@qq.com

1***@qq.com

设置了advanced不生效
2022-11-29 11:23
3***@qq.com

3***@qq.com

延时比较大如何解决,现在是大概1秒左右延时,需求是要到500ms内
2022-04-07 23:30
Tibbers

Tibbers

回复 天生DR :
按照文档配置了max-fps=10,但是实际上帧率没有变化,其他的参数也都试了,没有效果,编辑器版本3.3.13
2022-04-02 12:55
天生DR

天生DR (作者)

回复 Tibbers :
advanced参数肯定是有生效的 我们都测试过 文档上没有是因为这个属于附加功能 官方只是增加了设置项 具体效果需要开发者 自行查阅资料 或者对 ffmpeg 很熟悉才可以
2022-04-01 20:49