2.(本人对视频编码并无深入研究,欢迎提供设置建议) PC 端使用的韩国开发者那个简易的某 S 编码封装转换软件,设置如下: 档案格式 MP4 带时间戳,编码 h264 用 cpu 压制;量化器 23 ,设定档选择了 main ,auto + 快速解码,速度选择了“非常快”;音频编码 HE-AAC 直接选择最高 kbps ,声道取样率保持不变与源文件相同;视频的分辨率及帧率通常会选择保持不变与源文件相同。 我个人通常会选择把视频的整体速度变更为 2 倍速,视频的时长直接缩短了一半,而且这样以后谁也不用去手动调整 2 倍速了。
3.以上设置的效果:例如原本 20 分钟的视频,二倍速就是 10 分钟。20 分钟 700 多 MB 的 4K 视频压制出来变为了 10 分钟 300 多 MB 的文件体积。 只要不是多年前的旧 cpu ,压制用时应该一般是 5 分钟左右。完全不耽误用电脑,去喝口水上个厕所就压制完了。
4.最后选择以视频的形式上传到自己的电报频道。 上述举例的 300 多 MB 的视频在桌面端上传并没有被电报服务器自动再次压制,文件体积没有变,经测试在安卓端与苹果端在线播放均正常。 (尊贵的电报会员可以享受更快的上传速度,同时使用网页端要比使用桌面端的上传速度更快,不过只有几百 MB 的文件本来一会就上传完了也无所谓了)
]]>这个成本还真不如去闲鱼这个人来帮忙出视频
朋友推荐了个有意思的网站( https://v03ai.com ),很便宜只要 0.5 刀就能出一个 veo 3 视频
不知道他们真是送福利还是说有什么特殊技术手段做到这么低成本的。
]]>目前在 Python 上使用 moviepy 来做,合成一段 50s 的视频+配音,如果没有画中画大约 120s 左右(全程画中画大概翻倍),如果动画帧多些可能 150s 的样子。 但是领导不满意,想要把这个时间压缩下来,用他的话说最好十几秒就合成完毕。本人没咋做过视频编解码的活,来问问 V2EX 的老哥们还有啥提速方案。
查了下 moviepy 底层用的是 ffmpeg ,貌似这个已经是很高效的视频编解码技术了。 使用的机器没有专业显卡卡,但是可以申请到 AI 卡比如 T4 ,不知道能不能加速点。
]]>目前 YouTube 对 4K 60p HDR 的建议上传码率是 66-85Mbps ,但是是针对 H264 的。我希望视频的画质不要降低到这个标准以下。
已经问过 AI 了,说是 AV1 45Mbps ,H265 54Mbps ,但是这种属于经验值吧,还是想听听专家的意见。另外 AV1 有啥坑吗?
]]>有什么自动化的方式能够实现么,网上也找了一段 OpenCV 的代码,感觉效率低,而且通过画面中出现的人物数量判断太潦草了,甚至不如通过判断视频下面是否有黑边什么的更合理。
]]>感觉莫名其妙的,会员也不是没花钱,还分设备歧视。
]]>来源于 b 站的 banner 。
貌似 chrome 解码.webm
格式的视频是软解,cpu 飙高风扇狂转,而解码.mp4
却是硬件解码。二者视频 codec 一致,只是封装后缀不一样。。。
Input #0, matroska,webm, from 'a6f3f362-14c3-4dfd-8801-d69e8547a529.webm': Metadata: encoder : libwebm-0.2.1.0 creation_time : 2024-09-25T18:16:52.000000Z Duration: 00:00:01.58, start: -0.007000, bitrate: 331 kb/s Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv), 3200x300, SAR 1:1 DAR 32:3, 12 fps, 12 tbr, 1k tbn (default) Metadata: alpha_mode : 1 Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
转下面.mp4
硬解
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'a.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf61.3.100 Duration: 00:00:01.60, start: 0.000000, bitrate: 227 kb/s Stream #0:0[0x1](eng): Video: vp9 (Profile 0) (vp09 / 0x39307076), yuv420p(tv), 3200x300, 220 kb/s, SAR 1:1 DAR 32:3, 12 fps, 12 tbr, 16k tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1[0x2](eng): Audio: opus (Opus / 0x7375704F), 48000 Hz, stereo, fltp, 1 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0]
]]>但是出现了问题:
播放大视频的时候,只会请求前面两个 ts 分片文件(会播放几秒钟,播放几秒后就一直转圈加载了),小视频没有这个问题
技术栈:前端 vue-video-player 视频存储:阿里云 vod
跨域问题已经解决过了,但还是不行,请问大佬这是什么问题,万分感谢!
出现问题的截图:
m3u8 请求:
m3u8 返回:
m3u8 文件内容:(中间部分省略了)
中间部分省略了
提阿里云的工单:反馈这个视频可以正常播放:
final cut pro 要 $300, 价格相差好大 😓, 功能和使用也相差很大吗?
]]>RIFF (little-endian) data, AVI, 1920 x 1080, 30.00 fps, video: Motion JPEG, audio: uncompressed PCM (mono, 16000 Hz)
06.avi 跟 01 ~ 05 一样的输出,但是 07.avi~10.avi 则全部都显示是data
格式。尝试过使用 ffmpeg 修复,一直报错,错误如下:
[in#0 @ 0x6000039b8800] Error opening input: Invalid data found when processing input
想问下大佬们这种情况还能不能修复的了?
]]>宿主机 PVE ,raid 阵列,2.5G 网卡,128G 内存,32 核处理器,vGPU 显卡,机器硬件肯定是没有任何问题的。
虚拟机 1: ubuntu 安装 docker ,docker 安装 emby
虚拟机 2: 黑群晖
配置方案:黑裙开启 smb ,emby 通过 smb 访问视频内容
播放方案:
坚果 N1S Ultra 投影仪,安装 emby 客户端播放
问题:
1 、播放部分蓝光视频的时候很卡,但是看起来磁盘 io ,网络 io ,cpu idel 都没有任何异常,那么我这种架构下,到底是投影仪在解码还是 NAS 在解码?我看 emby 设置那里写着如果想要用显卡加速,需要付费,所以我这个 NAS 的 GPU 应该是没用吧?所以到底是哪个地方的问题导致播放卡顿的呀?
2 、播放部分蓝光视频的时候,颜色不对,比如画面大部分绿色都变成了红色。比如看《猩球崛起》,所有的树木都变成红色的了,我看网上说好像是 HDR 的问题,但是我无论是在 Emby 里面还是在投影仪上面,都没找到哪里有相关设置,这个又到底是哪里的问题呢?
]]>在移动应用开发中,视频播放功能是常见的需求之一,而视频内容的加密保护和统计则成为了开发者需要关注的问题。本文将分享如何使用 uniapp 结合视频云点播插件,实现视频播放的加密和统计功能。对方案有任何疑问,可 V:wjc24680525
在开始之前,请确保你已经安装了 HBuilderX ,并创建了一个 uniapp 项目。接下来,你需要从插件市场购买并下载视频云点播插件。
manifest.json
文件中,找到app 原生插件配置
部分,勾选视频云点播插件。视频加密是保护视频内容不被非法获取的重要手段。插件提供了强大的加密功能,我们可以利用这一功能来保护我们的视频内容。
首先,你需要在视频云平台获取userid
、readtoken
、writetoken
和secretkey
,这些参数将用于视频的加密和解密。
var cOnfigModule= uni.requireNativePlugin("PLV-VodUniPlugin-ConfigModule"); configModule.setToken({ 'userid': '你的 userid', 'readtoken': '你的 readtoken', 'writetoken': '你的 writetoken', 'secretkey': '你的 secretkey' }, (ret) => { if (ret.isSuccess) { console.log('设置 token 成功'); } else { console.error('设置 token 失败:', ret.errMsg); } });
使用视频云点播插件提供的播放器组件plv-player
来播放视频。
<template> <plv-player ref="vod" class="vod-player" seekType="0" autoPlay="true" disableScreenCAP="false" rememberLastPosition="false" @OnPlayStatus="onPlayStatus" @OnPlayError="onPlayError" @positiOnChange="positionChange"> </plv-player> </template> <script> export default { methods: { setVid() { this.$refs.vod.setVid({ vid: '视频的 vid', level: 0 }, (ret) => { if (ret.errMsg) { uni.showToast({ title: ret.errMsg, icon: "none" }); } }); }, onPlayStatus(e) { console.log('播放状态:', e.playbackState); }, onPlayError(e) { console.error('播放错误:', e.errCode, e.errEvent); }, positionChange(e) { console.log('当前播放位置:', e.currentPosition); } }, mounted() { this.setVid(); } } </script> <style> .vod-player { width: 100%; height: 100%; } </style>
视频播放统计对于了解用户行为和优化内容至关重要。插件对应的管理后台提供了丰富的统计字段和 API ,可根据实际需求调用
]]>在当前的互联网时代,直播已成为一种流行的互动方式,无论是用于商业推广还是教育培训。uniapp 框架利用 Vue.js ,允许开发者编写一次代码,即可在多个平台上部署应用,包括 iOS 、Android 、Web 以及各类小程序。本文将探讨如何使用 uniapp 结合特定的直播 SDK ,来开发支持直播带货、线上培训的应用。对方案有任何疑问,可 V:wjc24680525
本文介绍的技术方案涉及一个直播 SDK 插件,它为 Android 和 iOS 平台提供了原生支持,能够覆盖线上培训和直播带货两大应用场景。
首先,需要在相关直播平台的官方网站注册账号,以便获取必要的开发配置信息。
在注册并登录平台后,从后台获取appId
、userId
、appSecret
等关键配置信息,这些将用于 SDK 插件的初始化和功能调用。
根据 SDK 插件提供方的文档,将直播 SDK 插件集成到 uniapp 项目中。包括以下步骤:
var cOnfigModule= uni.requireNativePlugin("LiveScenesConfigModule"); // 初始化 SDK 配置 configModule.setConfig({ appId: "您的 appId", userId: "您的 userId", appSecret: "您的 appSecret" }, (result) => { if (result.isSuccess) { console.log("SDK 插件配置成功"); } else { console.error("SDK 配置失败:", result.errMsg); } });
var playModule = uni.requireNativePlugin("LiveScenesPlayModule"); // 加入直播教室 playModule.joinLiveClassroom(1, { // 1 表示在线教育场景 channelId: "特定频道号", additionalParams: { param4: "自定义参数", param5: "自定义参数" } }, (result) => { if (result.isSuccess) { console.log("成功加入直播"); } else { console.error("加入直播失败:", result.errMsg); } });
利用 uniapp 框架结合直播 SDK 插件,可以高效地开发出功能丰富的直播应用。本文提供的指南和代码示例旨在帮助开发者快速上手这一过程。
功能:使用 webview 的方案,在 App 中实现视频/直播的悬浮小窗播放效果,支持应用内小窗、系统小窗,在订单页小窗播放,回到直播间小窗消失
场景:适用于要在 App 中快速实现直播带货场景,或在 App 中需要点播视频小窗播放的场景
支持环境:安卓、iOS 、鸿蒙
前置条件:使用保利威的 webview SDK Demo ,对方案有任何疑问,可+V:wjc24680525 ,备注“小窗”
当前将提供的源码包中的 PolyvAndroidWebViewDemo 、PLVWebViewSDK 、PLVJsBridge 、PLVFloatWindow 四个项目放入到同一目录下,然后使用编译器打开 PolyvAndroidWebViewDemo 项目即可。
参考 1.2 功能对接文档
如果需要更换 web-native 通信协议的情况时,可以参考提供的 1.3 更换 web-native 通信规则注意事项
在启动 PLVWebViewDemoActivity 之前,我们需要设置加载的 Url 和添加上需要用到的 Ua ,这里可以通过PLVWebViewConfig
来进行设置,示例代码如下:
PLVWebViewConfig cOnfig= new PLVWebViewConfig(); config.setUrl("需要加载的 url") .setUa("需要添加的 UA"); PLVWebViewDemoActivity.startWebViewDemoActivity(PLVURLInputActivity.this, config);
当前 SDK 支持设置小窗边框颜色,通过PLVFloatWindowManager
进行设置,示例代码如下:
PLVFloatWindowManager.getInstance().setSolidColor(Color.RED);
当前 SDK 支持设置小窗边框颜色,通过PLVFloatWindowManager
进行设置,示例代码如下:
PLVFloatWindowManager.getInstance().setSolidWidth(20);
当进程退到后台时会自动唤出小窗(默认关闭),通过PLVFloatWindowManager
进行设置,示例代码如下:
PLVWebViewConfig cOnfig= new PLVWebViewConfig(); config.setSupportAutoFloating(true); // 开启自动开启小窗功能 PLVWebViewDemoActivity.startWebViewDemoActivity(PLVURLInputActivity.this, config);
当前小窗支持系统小窗和应用窗(默认使用系统小窗),如果开启系统小窗需要请求小窗悬浮权限,而应用小窗不需要请求权限,注意应用小窗依赖于 Activity ,当 Activity 被销毁时,应用小窗也会被关闭。
PLVWebViewConfig cOnfig= new PLVWebViewConfig(); config.isSystemFloatingWindow(true);// 为 true 时使用系统窗,false 为使用应用小窗 PLVWebViewDemoActivity.startWebViewDemoActivity(PLVURLInputActivity.this, config);
当前 sdk 支持通过原生或 web 端来弹出请求悬浮权限弹窗(默认使用原生弹窗方式)。
注意如果是选择使用 web 端来弹窗请求悬浮权限弹窗,需要 web 端支持对应的事件。
PLVWebViewConfig cOnfig= new PLVWebViewConfig(); config.setUseWebRequestPermission(true);// 为 true 时 web 弹窗,false 为使用原生弹窗 PLVWebViewDemoActivity.startWebViewDemoActivity(PLVURLInputActivity.this, config);
SDK 内部已经定义了一部分与 web 端通信的 js 事件,这些通信事件可以在 demo 层中重写某些方法进行监听和拦截处理,这里以监听 onShare 事件进行为例:
public class PLVWebViewDemoActivity extends PLVWebViewBaseActivity { @Override public void onShare() { // 监听到 onShare 事件的处理 ... super.onShare(); } }
可以选择需要监听的 js 事件进行重写实现对事件的监听。
注意:这些 js 通信事件都是与 webview 关联,开启系统小窗后,即使 Activity 被销毁依然能收到来自 web 端发送的消息,触发这些方法,所以重写这些方法时,尽量避免做与 Activity 生命周期关联的操作
当前支持通过重写方法来监听事件;
有以下这些方法:
/** * 点击商品,将切换到小窗时会触发该回调 * * @param width 小窗的宽 * @param height 小窗的高 * @param newPage 是否打开新的一页 * @param link 打开新的一页加载的 url * @param data 其他更多数据,开发者可根据需要自定义实现逻辑,数据为 json 格式 */ void changeToWindowForProduct(int width, int height, boolean newPage, String link, String data); /** * 用户主动调用切换到小窗的方法,在切换前会触发该回调 * * @param width 小窗的宽 * @param height 小窗的高 */ void changeToWindowForUser(int width, int height); /** * 点击小窗区域,从小窗中恢复到页面触发该回调 **/ void changeToNormal(); /** * 点击小窗关闭按钮,关闭小窗触发该回调 **/ void closeWindow(); /** * 点击返回事件 */ void onGobackPressed(); /** * 横置屏幕事件 */ void onLandScreen(); /** * 竖直屏幕事件 */ void onPortraitScreen(); /** * 分享事件 */ void onShare(); /** * 收藏事件 */ void onCollect(); /** * 隐藏状态栏,进入沉浸模式 */ void hideNavigationBar(); /** * 显示状态栏,退出沉浸模式 */ void showNavigationBar(); /** * 打开悬浮窗权限页面 */ void requestFloatWindowPermissionByWeb(); /** * 发送当前小窗的打开状态给前端 */ void getFloatWindowStatus(); /** * 获取当前的网路状态 */ void getCurrentNetworkStatus(); /** * 设置是否开启自动悬浮窗权限 * @param enable true 为打开,false 为甘比 */ void setEnableBackground(boolean enable); /** * 获取是否开启了自动悬浮窗的权限 */ void getEnableBackground(); /** * 处理其他 event */ void handleOtherEvent(String event);
SDK 支持注册自定义 js 事件,可以通过下面的方式来注册自定义 js 事件,示例代码如下:
@Override protected void initHandleForDemo() { //监听来自 web 端发送事件 floatableLayout.getWebView().registerHandler("监听事件", new BridgeHandler() { @Override public void handler(String s, CallBackFunction callBackFunction) {} }); //向 web 端发送对应事件和消息 floatableLayout.getWebView().callHandler("发送事件", "发送消息", new CallBackFunction() { @Override public void onCallBack(String s } }); }
注意:注册新的 js 事件时不仅需要原生端做相应的操作,还需要 web 端有注册对应的事件,否则是原生端是不会接收到对应的事件消息
当前 SDK 内部是通过 Jsbridge 该库来实现 web 端与原生端的通信,Jsbridge 中定义了 web 端与原生的通信规则,如果集成项目是没有制定指定的 web-native 通信规则,那么可以直接使用 SDK 的通信规则即可,无需其余改动。
如果集成项目中有定制指定的 web-native 通信规则,可以参考下面的方式进行修改。
无论是使用哪一种通信规则,关键在于原生端发送/接收 web 端消息,web 端发送/接收原生端消息,所以当需要更换 SDK 内部的 web-native 通信规则仅关注上述的两点即可。
因为 sdk 内部是依赖于 jsbridge 该模块实现 web-native 通信,当需要更换通信规则时,可以选择不依赖该模块。
public class PLVBaseWebView extends BridgeWebView { .... }
可将 PLVBaseWebView 继承的 BridgeWebView 更换为集成项目中指定通信规则的 webview 。
WebViewClient 是实现原生端接收 web 端消息的关键,也是定制修改 webview 的核心部份,所以在更换通信规则时也需要更换 WebViewClient
//替换自己需要用到的 WebViewClient webView.setWebViewClient(webviewClient);
可以通过 setWebViewClient(new WebViewClient() 方法为 webview 设置指定 WebViewclient 。
public void callMessage(String type, String message) { //当使用的新的 web-native 规则时,可以将下面的代码修改为 webview 使用新规则发送消息时的代码 webview.callHandler(type, message, new CallBackFunction() { @Override public void onCallBack(String s) { ... } }); }
当前 SDK 内部时通过 webview.callHandler()方法来实现消息的发送,当更换新的通信规则时,可以将这个 webview.callHandler()方法替换为新规则中对应原生端发送消息的方法。
webview.registerHandler("xxx", new BridgeHandler() { @Override public void handler(String s, CallBackFunction callBackFunction) { ... } });
当前 SDK 内部是通过 webview.registerHandler()方法来监听 web 端发送的消息,当更换新的通信规则时,可以将这个 webview.registerHandler()方法替换为新规则中对应原生端接收 web 消息的方法。
web-native 通信规则是由 web 端和原生端两端定制的,所以当更换 web-native 通信规则不仅需要原生端更换,web 端也需要进行更换。
当前需要通信的 web 页面 与 更换通信规则后的原生端 所使用的通信规则是否是对应,如果是对应的情况下无需做其他更替。
如果需要通信的 web 页面与 更换通信规则后的原生端 所使用的不对应,那么就需要去更替 web 端的通信规则。
如 web 端页面需要使用保利威的 web 页面(当前保利威 web 页面与 sdk 内部所使用的通信规则一致,当原生端切换通信规则,那么 web 端页面也需要更换对应通信规则)
window.bridge.callHandler( 'callAppEvent', message, function(responseData) { //发送消息 .... } );
当前 SDK 内部与 Web 端对应的通信规则是通过 bridge.callHandler()方法来进行发送消息,当替换新的通信规则后,可以使用新的发送方式来取代这个 bridge.callHandler()方法
// 监听来自 xxx 事件的消息 bridge.registerHandler("xxx", function(data, responseCallback) { document.getElementById("show").innerHTML = (data); });
当前 SDK 内部与 Web 端对应的通信规则是通过 bridge.registerHandler()方法来接收消息,当替换新的通信规则后,可以使用新的发送方式来取代这个 bridge.registerHandler()方法
名称· | 要求 |
---|---|
iOS 系统 | 9.0+ |
CocoaPods | 1.11.3+ |
Xcode | 11.0+ |
打开项目的 PROJECT - Deployment Target - iOS Deployment Target 改为 9.0 或更高。
打开项目的 TARGETS - General - Deployment Info ,把 iOS 系统改为 9.0 或更高。
打开项目的 info.plist
文件,添加如下内容:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> </dict>
播放器支持全屏播放,需要在 TARGETS - General - Deployment Info 中,勾选支持的横屏旋转方向。
打开项目的 TARGETS - Signings & Capabilities ,点击 + Capability ,选择 Background Modes ,勾选 ‘Audio, AirPlay, and Picture in Picture’。
在 Podfile 文件中,添加以下内容:
pod 'PLVWebViewSDK', '~> 1.0.0'
在终端执行 pod install
如果需要使用系统小窗功能,则需要在 Podfile 文件中另外添加以下内容
# 包含系统画中画 -- 如果不使用系统小窗 则不需要下面配置 pod 'PLVAliHttpDNS', '~>1.10.0' pod 'PLVFoundationSDK', '1.10.6', :subspecs => ['BaseUtils', 'NetworkUtils', 'ErrorCode', 'LogReporter', 'ConsoleLogger', 'Reachability', 'SafeModel', 'ProgressHUD'] pod 'PLVBusinessSDK', '1.10.4', :subspecs => ['BaseBSH'] pod 'PLVLiveScenesSDK', '1.10.6', :subspecs => ['Base', 'LogReporter', 'ConsoleLogger', 'ErrorManager', 'Network', 'Player', 'BasePlayer', 'LivePlayer', 'LivePlaybackPlayer', 'PictureInPicture']
并在终端执行 pod install
,并且将对应的 PLVLiveScenesSDK 、PLVBusinessSDK
进行替换。
将 PLVWebViewSDK.framework 库添加到自己的项目中。如果是使用源码的方式集成,则需要将 PLVWebViewSDK 文件整个添加到自己的项目即可。
1.如果项目使用系统小窗功能则需要将以下库添加到项目中
PLVAliHttpDNS 、PLVBusinessSDK 、PLVFoundationSDK 、PLVIJKPlayer 、PLVLiveScenesSDK
2.在 General => Frameworks ,Libraries ,and Embedded Content 中移除已添加的 PLVFoundationSDK.framework 、PLVLiveScenesSDK.framework 、PLVBusinessSDK.framework 库,并添加系统库 libresolv.tbd 。
3.设置 PLVIJKPlayer 为 Embed & Sign
4.Build Settings ,Other Linker Flags 中添加 -ObjC ,如果项目已配置有,则不需要重复添加
5.运行报错
如果模拟器运行报错需要在 Build Settings 中设置 Excluded Architecture => Any iOS Simulator SDK 为 arm64
如果运行报错
Building for iOS Simulator, but the linked and embedded framework '***' was built for iOS + tvOS Simulator
可在 Build Settings 中 设置 VALIDATE_WORKSPACE 为 YES 即可。
创建想要展示 WebView 的控制器页面 DemoViewController
继承于PLVWebViewBaseViewController
,并通过初始化方法 -initWithConfig:
创建控制器页面。示例代码如下:
// PLVWebViewDemoViewController.h #import <PLVWebViewSDK/PLVWebViewSDK.h> @interface PLVWebViewDemoViewController : PLVWebViewBaseViewController @end
初始化时可通过重写 initHandleForDemo
进行自定义配置,同时可以对 Bridge 事件进行自定义处理。示例代码如下:
// PLVWebViewDemoViewController.m @implementation PLVWebViewDemoViewController #pragma mark - [ Override ] - (void)viewDidLoad { [super viewDidLoad]; } /// 初始化时,可以进行的自定义配置 //- (void)initHandleForDemo { // //} #pragma mark - [ Delegate ] #pragma mark PLVFloatableWebViewBridgeDelegate /// 如需要监听 js 回调事件,可以通过 Delegate 事件进行相应的处理,例如 webviewBridgeShare 消息 //- (void)webviewBridgeShare:(PLVFloatableWebViewBridge *)bridge { // //} @end
创建、配置、打开直播页面控制器
PLVWebViewConfig *cOnfig= [[PLVWebViewConfig alloc] init]; config.urlString = urlString; config.allowFloatingWindow = YES; config.isSystemFloatingWindow = NO; config.userAgent = self.uaTextView.text; config.enableAutoFloatWindow = YES; PLVWebViewDemoViewController *webVC = [[PLVWebViewDemoViewController alloc] initWithConfig:config]; [self.navigationController pushViewController:webVC animated:YES];
创建 PLVWebViewBaseViewController 时需要根据 PLVWebViewConfig 配置来进行初始化。
PLVWebViewConfig *cOnfig= [[PLVWebViewConfig alloc] init]; config.urlString = @""; config.allowFloatingWindow = YES; config.isSystemFloatingWindow = NO; config.userAgent = @""; config.enableAutoFloatWindow = YES; PLVWebViewDemoViewController *floatingWebVC = [[PLVWebViewDemoViewController alloc] initWithConfig:config];
我们还可以对浮窗的大小、默认位置、以及样式进行配置修改:
// 配置浮窗大小 [[PLVFloatWindowManager sharedManager] setFloatingWindowSize:size]; // 配置浮窗初始位置 [[PLVFloatWindowManager sharedManager] setFloatingWindowLocation:point]; // 应用内小窗样式修改 UIView *appWindowView = [PLVFloatWindowManager sharedManager].floatingWindow; appWindowView.layer.cornerRadius = 8.0f; appWindowView.layer.masksToBounds = YES;
其中,调用 -moveContentViewToWindow:size:
方法主动唤起的浮窗,默认宽度为屏幕的 0.3 倍,宽高比 16:9 。通过保利威的网页唤起浮窗,浮窗大小由网页告知。初始位置是指浮窗右下角距离屏幕右下角的相对位置,默认为(-10, -100), 表示悬浮窗右边沿距离屏幕右边沿 10pt ,下边沿距离屏幕下边沿 100pt 。
如果要使用画中画功能,首先需要在 Podfile 文件中 添加支持画中画的 SDK ,然后执行 pod install
;
# 包含系统画中画 -- 如果不使用系统小窗 则不需要下面配置 pod 'PLVAliHttpDNS', '~>1.10.0' pod 'PLVFoundationSDK', '1.10.6', :subspecs => ['BaseUtils', 'NetworkUtils', 'ErrorCode', 'LogReporter', 'ConsoleLogger', 'Reachability', 'SafeModel', 'ProgressHUD'] pod 'PLVBusinessSDK', '1.10.4', :subspecs => ['BaseBSH'] pod 'PLVLiveScenesSDK', '1.10.6', :subspecs => ['Base', 'LogReporter', 'ConsoleLogger', 'ErrorManager', 'Network', 'Player', 'BasePlayer', 'LivePlayer', 'LivePlaybackPlayer', 'PictureInPicture']
替换对应的离线包
用提供的离线包PLVLiveScenesSDK 、PLVBusinessSDK
将 Pods 文件夹下对应的 SDK 进行替换。
当开启了 enabelWhiteList
后,只有添加了域名白名单的链接才会支持原生与前端的通信,才支持小窗的功能。
[PLVUAConfigManager sharedManager].enabelWhiteList = YES; [[PLVUAConfigManager sharedManager] addHostWhitelist:@[@"live.polyv.cn"]];
同时支持 自定义配置 UA
[[PLVUAConfigManager sharedManager] addCustomUserAgent:@""];
在 SDK 内部已经对一些事件进行了处理,如果想要自定义处理某些事件可以在 demo 中进行监听拦截处理。示例如下:
#pragma mark - [ Delegate ] #pragma mark PLVFloatableWebViewBridgeDelegate /// 如需要监听 js 回调事件,可以通过 Delegate 事件进行相应的处理,例如 webviewBridgeShare 消息 - (void)webviewBridgeShare:(PLVFloatableWebViewBridge *)bridge { }
可以通过 Demo 层注册和调用自定义事件,示例代码如下:
- (void)initHandleForDemo { [self.contentAreaView.mainWebView.bridge registerHandler:@"" handler:^(id _Nonnull data, PLVWVJBResponseCallback _Nonnull responseCallback) { }]; [self.contentAreaView.mainWebView.bridge callHandler:@"" data:nil responseCallback:^(id _Nonnull responseData) { }]; }
本项目中使用的是开源库 WebViewJavascriptBridge 来实现 web 和 native 之间的通信。如果接入的项目中没有用到 web-native 通信,则不需要做任何调整。如果接入的项目中也用到 web-native 通信,则可以参考下面的方式进行修改。
SDK 中使用的 WebViewJavascriptBridge 来实现通信的,在 PLVFloatableWebViewBridge 中对其进行了封装处理,如果需要更换 native 端通信规则只需要修改 PLVFloatableWebViewBridge 这个类即可
- (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler { //当使用的新的 web-native 规则时,可以将下面的代码修改为 webview 使用新规则注册消息时的代码 [self.bridge registerHandler:handlerName handler:handler]; }
- (void)callHandler:(NSString*)handlerName data:(id _Nullable)data responseCallback:(WVJBResponseCallback _Nullable)responseCallback { //当使用的新的 web-native 规则时,可以将下面的代码修改为 webview 使用新规则发送消息时的代码 [self.bridge callHandler:handlerName data:data responseCallback:responseCallback]; }
当 native 端通信规则改变时,web 端则要根据是否与原来的通信方式原理相同来判断是否需要修改。
bridge.registerHandler("testJavascriptHandler", function (data, responseCallback) { console.log(data); responseCallback(data); } );
bridge.callHandler("callAppEvent", { }, function responseCallback(responseData) { console.log(responseData); } );
当前 web-native 的通信是通过 bridge 这种方式来发送和接收消息的,如果需要调整可用集成项目 web 端接收、发送消息的方式来进行替换。
iOS 因为系统限制想实现系统小窗只能通过画中画的功能,同时这个功能会有版本限制,在 iOS14+开始支持 iPhone 的画中画功能。同时直播如果使用系统播放器 AVPlayer 会有 14s+的高延迟,IJKPlayer 可以实现低延迟,但是 iOS15 以上画中画才支持 SampleBufferLayer ,因此如果直播低延迟的话需要 iOS15+。
PLVWebSDK 项目从属于易方信息科技股份有限公司,对保利威云直播、云点播系列产品的直播、回放观看做了良好的适配,极大优化了用户的观看体验,并支持浮窗播放等扩展功能,也可作为其他网页的展示容器。
本项目包含功能如下:
ohpm install plvwebsdk
OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包
ohos.permission.INTERNET ohos.permission.GET_NETWORK_INFO
1.设置 UA
当前可以通过下面的方式来设置需要的 UA
PLVWebViewConfig().setUa("Android" + PLVUAConfig.defaultUA)
注意:如果需要到 Saas 页面的小窗功能的情况,必须在 UA 中带上 Android 和 PLVUAConfig.defaultUA 字段
2.设置 url
可以通过下面的方式来设置需要加载的 url
PLVWebViewConfig().setUrl("需要加载的 url")
3.设置是否允许小窗悬浮
可以通过下面的方式来设置是否允许开启小窗功能,默认是开启的,如不需要可以设置为 false
PLVWebViewConfig().setAllowFloatingWindow(true)
当前 SDK 内部已经注册好与前端页面通信的事件,当接入 sdk 后就能直接使用这些事件。
SDK 也支持注册自定义事件,可以通过下面的方式来进行注册
this.controller.registerHandler("自定义事件", (data: string) => {// 监听自定义事件的处理 }) this.controller.callHandle("发送原生事件", "xxx", () => {//发送原生事件 })
如果需要监听/拦截 SDK 内部已经实现了的事件,可以通过下面的方式继续监听/拦截,这里以 onShare 事件为例子,如果需要监听/拦截其他事件可以仿照这里来完成
this.controller.registerCustomerContainEvent({ onShare: () => {// 监听到 onShare 事件时的操作 return true // return true 表示拦截掉分享事件 false 就继续由 sdk 往下执行 } })
// 小窗播放事件 webviewBridage?.sendData('clickProduct', webviewData); // 没有小窗播放的情况: 监听自定义事件 webviewBridage?.sendData('clickProductCustom', webviewData); // 数据格式 const webviewData = { width: plvWebviewDataSize.width, height: plvWebviewDataSize.height, newPage: true, link: “跳转的自定义 url”, data: { type : out | inner | stock link : “跳转的自定义 url” ( 同上 link ) market : ‘5053’, code : 789465, name : 名称 }, }
clickProduct 事件 和 clickProductCustom 自定义 webviewData ---> data 下面根据 type 和 其他参数完成 app 内链接跳转功能
对方案有任何疑问,可+V:wjc24680525 ,备注“小窗”
]]>免费,可以下载高清、全高清及 4K+视频,部分站点还支持无水印下载,自称覆盖 1000+网站,海外几个热门站点确实可用,懂得都懂,但是不支持 YouTube !
网站地址👉 XXVID
免费,可以选择不同分辨率,包括音频、视频,也支持其他站点下载,但是亲测 YouTube 效果最好。
网站地址👉 DMSAVE
第一句 第二句 第三句
想要生成如下格式或 srt 字幕
00:00:00:01 00:00:02:08 第一句 00:00:02:08 00:00:03:24 第二句 00:00:03:24 00:00:06:04 第三句
]]>飞浆的我看视频和自己跑推理,效果都不太好,想问下各位知道有哪些比较新一点且效果还行的项目吗?
]]>平时我还是倾向于挑 SDR 视频在看,但是最近下资源发现越来越多是 HDR 内容,还有 Dolby Vision 内容,资源越来越难下了。
]]>Hacksaw Ridge 2016 Multi 2160p UHD BluRay Hevc10 HDR10 DTSHD & ATMOS 7.1 -DDR
是不是 remux 和 hevc 的差别?也不至于差 1 倍容量吧?
另外请问下,两者相同象素下画质上差别明显吗?
]]>如果不转换一遍直接扔到剪辑软件中,在播放时也是一卡一卡的,抽搐状态。
但很多视频播放器直接播放却又不存在这个现象。
有没有大神遇到同样的问题,感谢!
]]>