【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-ijkplayer
简介
ijkplayer是OpenHarmony和HarmonyOS环境下可用的一款基于FFmpeg的视频播放器。
演示

下载安装
ohpm install @ohos/ijkplayer
使用说明
import { IjkMediaPlayer } from "@ohos/ijkplayer";import type { OnPreparedListener } from "@ohos/ijkplayer";import type { OnVideoSizeChangedListener } from "@ohos/ijkplayer";import type { OnCompletionListener } from "@ohos/ijkplayer";import type { OnBufferingUpdateListener } from "@ohos/ijkplayer";import type { OnErrorListener } from "@ohos/ijkplayer";import type { OnInfoListener } from "@ohos/ijkplayer";import type { OnSeekCompleteListener } from "@ohos/ijkplayer";import { LogUtils } from "@ohos/ijkplayer";
在UI中配置XComponent控件
XComponent({id: 'xcomponentId',type: 'surface',libraryname: 'ijkplayer_napi'}).onLoad((context) => {this.initDelayPlay(context);}).onDestroy(() => {}).width('100%').aspectRatio(this.aspRatio)
播放
//单例模式let mIjkMediaPlayer = IjkMediaPlayer.getInstance();//多实例模式let mIjkMediaPlayer = new IjkMediaPlayer();// 如果播放视频,调用setContext接口,参数1为XComponent回调的context, 可选参数2为XComponent的id属性值mIjkMediaPlayer.setContext(this.mContext, "xcomponentId");// 如果只播放音频,则调用setAudioId接口,参数为音频对象的id// mIjkMediaPlayer.setAudioId('audioIjkId');// 设置debug模式mIjkMediaPlayer.setDebug(true);// 初始化配置mIjkMediaPlayer.native_setup();// 设置视频源mIjkMediaPlayer.setDataSource(url); // 设置视频源http请求头let headers = new Map([["user_agent", "Mozilla/5.0 BiliDroid/7.30.0 (bbcallen@gmail.com)"],["referer", "https://www.bilibili.com"]]);mIjkMediaPlayer.setDataSourceHeader(headers);// 使用精确寻帧 例如,拖动播放后,会寻找最近的关键帧进行播放,很有可能关键帧的位置不是拖动后的位置,而是较前的位置.可以设置这个参数来解决问题mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", "1");// 预读数据的缓冲区大小mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", "102400");// 停止预读的最小帧数mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", "100");// 启动预加载mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", "1");// 设置无缓冲,这是播放器的缓冲区,有数据就播放mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", "0");// 跳帧处理,放CPU处理较慢时,进行跳帧处理,保证播放流程,画面和声音同步mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", "5");// 最大缓冲cache是3s, 有时候网络波动,会突然在短时间内收到好几秒的数据// 因此需要播放器丢包,才不会累积延时// 这个和第三个参数packet-buffering无关。mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", "3000");// 无限制收流mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", "1");// 屏幕常亮mIjkMediaPlayer.setScreenOnWhilePlaying(true);// 设置超时mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", "10000000");mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "connect_timeout", "10000000");mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "listen_timeout", "10000000");mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "addrinfo_timeout", "10000000");mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_timeout", "10000000");let mOnVideoSizeChangedListener: OnVideoSizeChangedListener = {onVideoSizeChanged(width: number, height: number, sar_num: number, sar_den: number) {that.aspRatio = width / height;LogUtils.getInstance().LOGI("setOnVideoSizeChangedListener-->go:" + width + "," + height + "," + sar_num + "," + sar_den)that.hideLoadIng();}}mIjkMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);let mOnPreparedListener: OnPreparedListener = {onPrepared() {LogUtils.getInstance().LOGI("setOnPreparedListener-->go");}}mIjkMediaPlayer.setOnPreparedListener(mOnPreparedListener);let mOnCompletionListener: OnCompletionListener = {onCompletion() {LogUtils.getInstance().LOGI("OnCompletionListener-->go")that.currentTime = that.stringForTime(mIjkMediaPlayer.getDuration());that.progressValue = PROGRESS_MAX_VALUE;that.stop();}}mIjkMediaPlayer.setOnCompletionListener(mOnCompletionListener);let mOnBufferingUpdateListener: OnBufferingUpdateListener = {onBufferingUpdate(percent: number) {LogUtils.getInstance().LOGI("OnBufferingUpdateListener-->go:" + percent)}}mIjkMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);let mOnSeekCompleteListener: OnSeekCompleteListener = {onSeekComplete() {LogUtils.getInstance().LOGI("OnSeekCompleteListener-->go")that.startPlayOrResumePlay();}}mIjkMediaPlayer.setOnSeekCompleteListener(mOnSeekCompleteListener);let mOnInfoListener: OnInfoListener = {onInfo(what: number, extra: number) {LogUtils.getInstance().LOGI("OnInfoListener-->go:" + what + "===" + extra)}}mIjkMediaPlayer.setOnInfoListener(mOnInfoListener);let mOnErrorListener: OnErrorListener = {onError(what: number, extra: number) {LogUtils.getInstance().LOGI("OnErrorListener-->go:" + what + "===" + extra)that.hideLoadIng();prompt.showToast({message:"亲,视频播放异常,系统开小差咯"});}}mIjkMediaPlayer.setOnErrorListener(mOnErrorListener);mIjkMediaPlayer.setMessageListener();mIjkMediaPlayer.prepareAsync();mIjkMediaPlayer.start();
暂停
mIjkMediaPlayer.pause();
停止
mIjkMediaPlayer.stop();
重置
mIjkMediaPlayer.reset();
释放
mIjkMediaPlayer.release();
快进、后退
mIjkMediaPlayer.seekTo(msec);
倍数播放
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", "1");mIjkMediaPlayer.setSpeed("2f");
屏幕常亮
mIjkMediaPlayer.setScreenOnWhilePlaying(true);
循环播放
mIjkMediaPlayer.setLoopCount(true);
设置音量
mIjkMediaPlayer.setVolume(leftVolume, rightVolume);
音频焦点监控
import { InterruptEvent, InterruptHintType } from '@ohos/ijkplayer/src/main/ets/ijkplayer/IjkMediaPlayer';import { Callback } from '@ohos.base';// 音频焦点变化回调处理let event: Callback<InterruptEvent> = (event) => {console.info(`event: ${JSON.stringify(event)}`);if (event.hintType === InterruptHintType.INTERRUPT_HINT_PAUSE) {this.pause();} else if (event.hintType === InterruptHintType.INTERRUPT_HINT_RESUME) {this.startPlayOrResumePlay();} else if (event.hintType === InterruptHintType.INTERRUPT_HINT_STOP) {this.stop();}}// 设置监听音频中断事件mIjkMediaPlayer.on('audioInterrupt', event);// 取消订阅音频中断事件mIjkMediaPlayer.off('audioInterrupt');
开启硬解码
// 开启h264与h265硬解码ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-all-videos", "1");// 开启h265硬解码ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-hevc", "1");
开启视频录制
let recordSaveFilePath = getContext(this).cacheDir + "/record.mp4";let result = this.mIjkMediaPlayer.startRecord(recordSaveFilePath);prompt.showToast({message: result ? "开启录制成功" : "开启录制失败"});
获取视频录制状态
let isRecord = this.mIjkMediaPlayer.isRecord();prompt.showToast({message: isRecord ? "正在录制中" : "录制没有开启哦!"});
停止视频录制
// 保存相册需要申请权限: ohos.permission.WRITE_IMAGEVIDEOthis.mIjkMediaPlayer.stopRecord().then((result) => {if(!result){prompt.showToast({message: "停止录制失败"});return;}let atManager = abilityAccessCtrl.createAtManager();atManager.requestPermissionsFromUser(getContext(that), ['ohos.permission.WRITE_IMAGEVIDEO']).then(async () => {let photoType: photoAccessHelper.PhotoType = photoAccessHelper.PhotoType.VIDEO;let extension:string = 'mp4';let options: photoAccessHelper.CreateOptions = {title: "record_"+new Date().getTime()+""}let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext(that));phAccessHelper.createAsset(photoType, extension, options, (err, uri) => {if (uri !== undefined) {let recordFile = fs.openSync(that.recordSaveFilePath);let albumFile = fs.openSync(uri,fs.OpenMode.READ_WRITE);fs.copyFileSync(recordFile.fd,albumFile.fd);fs.closeSync(recordFile);fs.closeSync(albumFile);prompt.showToast({message: "停止录制成功"});} else {prompt.showToast({message: "停止录制失败"});}});})})
截屏
// 保存相册需要申请权限: ohos.permission.WRITE_IMAGEVIDEOlet saveFilePath = getContext(this).cacheDir + "/screen.jpg";this.mIjkMediaPlayer.screenshot(saveFilePath).then((result) => {if(!result) {prompt.showToast({message: "截屏失败"});return;}let atManager = abilityAccessCtrl.createAtManager();atManager.requestPermissionsFromUser(getContext(that), ['ohos.permission.WRITE_IMAGEVIDEO']).then(async () => {let photoType: photoAccessHelper.PhotoType = photoAccessHelper.PhotoType.IMAGE;let extension:string = 'jpg';let options: photoAccessHelper.CreateOptions = {title: "screenshot_"+new Date().getTime()+""}let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext(that));phAccessHelper.createAsset(photoType, extension, options, (err, uri) => {if (uri !== undefined) {let screenshotFile = fs.openSync(saveFilePath);let albumFile = fs.openSync(uri,fs.OpenMode.READ_WRITE);fs.copyFileSync(screenshotFile.fd,albumFile.fd);fs.closeSync(screenshotFile);fs.closeSync(albumFile);prompt.showToast({message: "截屏成功"});} else {prompt.showToast({message: "截屏失败"});}});})});
接口说明
IjkMediaPlayer.getInstance()
| 接口名 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| setContext | context: object, id?: string | void | 设置XComponent回调的context, 设置XComponent的id属性值(可选), 播放视频时需要调用该接口 |
| setDebug | open: boolean | void | 设置日志开关 |
| native_setup | 无 | void | 初始化配置 |
| setDataSource | url: string | void | 设置视频源地址 |
| setDataSourceHeader | headers: Map<string, string> | void | 设置视频源的HTTP请求头 |
| setOption | category:string, key: string, value: string | void | 设置播放前预设参数(用于设置char类型参数) |
| setOptionLong | category:string, key: string, value: string | void | 设置播放前预设参数(用于设置int类型参数) |
| prepareAsync | 无 | void | 加载视频 |
| start | 无 | void | 播放视频 |
| stop | 无 | void | 停止播放 |
| pause | 无 | void | 暂停播放 |
| reset | 无 | void | 视频重置 |
| release | 无 | void | 释放资源 |
| seekTo | msec: string | void | 快进、后退 |
| setScreenOnWhilePlaying | on: boolean | void | 设置屏幕常亮 |
| setSpeed | speed: string | void | 设置播放倍数 |
| getSpeed | 无 | number | 获取设置的倍数 |
| isPlaying | 无 | boolean | 查看是否正在播放状态 |
| setOnVideoSizeChangedListener | listener: OnVideoSizeChangedListener | void | 设置获取视频宽高回调监听 |
| setOnPreparedListener | listener: OnPreparedListener | void | 设置视频准备就绪回调监听 |
| setOnInfoListener | listener: OnInfoListener | void | 设置播放器的各种状态回调监听 |
| setOnErrorListener | listener: OnErrorListener | void | 设置播放异常回调监听 |
| setOnBufferingUpdateListener | listener: OnBufferingUpdateListener | void | 设置buffer缓冲回调监听 |
| setOnSeekCompleteListener | listener: OnSeekCompleteListener | void | 设置快进后退回调监听 |
| setMessageListener | 无 | void | 设置视频监听器到napi用于接收回调 |
| getVideoWidth | 无 | number | 获取视频宽度 |
| getVideoHeight | 无 | number | 获取视频高度 |
| getVideoSarNum | 无 | number | 获取视频宽高比的分子 |
| getVideoSarDen | 无 | number | 获取视频宽高比的分母 |
| getDuration | 无 | number | 获取视频总的时长 |
| getCurrentPosition | 无 | number | 获取视频播放当前位置 |
| getAudioSessionId | 无 | number | 获取音频sessionID |
| setVolume | leftVolume: string,rightVolume:string | void | 设置音量 |
| setLoopCount | looping: boolean | void | 设置循环播放 |
| isLooping | 无 | boolean | 查看当前是否循环播放 |
| selectTrack | track: string | void | 选择轨道 |
| deselectTrack | track: string | void | 删除选择轨道 |
| getMediaInfo | 无 | object | 获取媒体信息 |
| setAudioId | id: string | void | 设置创建音频对象,设置id |
| on | type: ‘audioInterrupt’, callback: Callback< InterruptEvent > | void | 监听音频中断事件,使用callback方式返回结果 |
| off | type: ‘audioInterrupt’ | void | 取消订阅音频中断事件 |
| startRecord | saveFilePath: string | boolean | 开启视频录制 |
| isRecord | 无 | boolean | 获取视频录制状态 |
| stopRecord | 无 | Promise | 停止视频录制 |
| screenshot | saveFilePath: string | Promise | 截屏 |
参数说明
- InterruptEvent 播放中断时,应用接收的中断事件。
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| forceType | InterruptForceType | 是 | 操作是由系统执行或是由应用程序执行。 |
| hintType | InterruptHint | 是 | 中断提示。 |
- InterruptForceType 枚举,强制打断类型。
| 名称 | 值 | 说明 |
|---|---|---|
| INTERRUPT_FORCE | 0 | 由系统进行操作,强制打断音频播放。 |
| INTERRUPT_SHARE | 1 | 由应用进行操作,可以选择打断或忽略。 |
- InterruptHint 枚举,中断提示。
| 名称 | 值 | 说明 |
|---|---|---|
| INTERRUPT_HINT_NONE | 0 | 无提示。 |
| INTERRUPT_HINT_RESUME | 1 | 提示音频恢复。 |
| INTERRUPT_HINT_PAUSE | 2 | 提示音频暂停。 |
| INTERRUPT_HINT_STOP | 3 | 提示音频停止。 |
| INTERRUPT_HINT_DUCK | 4 | 提示音频躲避。(躲避:音量减弱,而不会停止) |
| INTERRUPT_HINT_UNDUCK | 5 | 提示音量恢复。 |
约束与限制
在下述版本验证通过:
- DevEco Studio: NEXT Beta1-5.0.3.806, SDK: API12 Release (5.0.0.66)
- DevEco Studio NEXT 5.0(5.0.3.427)--SDK:API12
监听音频中断事件需保证设备系统版本在22以上。 设置音量需保证SDK版本在12及以上。
目录结构
|---- ijkplayer
| |---- entry # 示例代码文件夹
| |---- ijkplayer # ijkplayer 库文件夹
| |---- cpp # native模块
| |----- ijkplayer # ijkplayer内部业务
| |----- ijksdl # ijkplayer内部业务
| |----- napi # 封装NAPI接口
| |----- proxy # 代理提供给NAPI调用处理ijkplayer内部业务
| |----- third_party #三方库依赖
| |----- utils #工具
| |---- ets # ets接口模块
| |----- callback #视频回调接口
| |----- common #常量
| |----- utils #工具
| |----- IjkMediaPlayer.ets #ijkplayer暴露的napi调用接口
| |---- README_zh.MD # 安装使用方法
相关文章:
【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-ijkplayer
简介 ijkplayer是OpenHarmony和HarmonyOS环境下可用的一款基于FFmpeg的视频播放器。 演示 下载安装 ohpm install ohos/ijkplayer使用说明 import { IjkMediaPlayer } from "ohos/ijkplayer";import type { OnPreparedListener } from "ohos/ijkplayer";i…...
GRU 和 LSTM 公式推导与矩阵变换过程图解
GRU 和 LSTM 公式推导与矩阵变换过程图解 GRULSTM 本文的前置篇链接: 单向/双向,单层/多层RNN输入输出维度问题一次性解决 GRU GRU(Gate Recurrent Unit)是循环神经网络(RNN)的一种,可以解决RNN中不能长期…...
现在中国三大运营商各自使用的哪些band频段
现在中国三大运营商4G和5G频段分配情况: 中国移动 4G频段: TD-LTE: Band 39:1880-1920MHz,实际使用1885-1915MHz。 Band 40:2300-2400MHz,实际使用2320-2370MHz。 Band 41:2515-26…...
使用Jenkins实现鸿蒙HAR应用的自动化构建打包
使用Jenkins实现鸿蒙HAR应用的自动化构建打包 在软件开发领域,自动化构建是提高开发效率和确保代码质量的重要手段。特别是在鸿蒙(OpenHarmony)应用开发中,自动化构建更是不可或缺。本文将详细介绍如何使用Jenkins命令行工具实现…...
AI时代,职场人如何开启学习之旅
为什么要学习 AI 在当今数字化时代,AI 正以前所未有的速度改变着我们的工作和生活方式。从智能客服到自动化生产,从数据分析到个性化推荐,AI 已经广泛渗透到各个行业和领域。学习 AI,对于工作人员来说,不仅是提升工作…...
MIT6.824 Lecture 2-RPC and Threads Lecture 3-GFS
Lecture 2-RPC and Threads Go语言在多线程、同步,还有很好用的RPC包 《Effective Go》 线程是实现并发的重要工具 在分布式系统里关注多线程的原因: I/O concurrencyParallelismConvenience Thread challenges 用锁解决race问题 Coordination channel…...
MySQL第五次作业
根据图片内容完成作业 1.建表 (1)建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...
【PDF提取内容】如何批量提取PDF里面的文字内容,把内容到处表格或者批量给PDF文件改名,基于C++的实现方案和步骤
以下分别介绍基于 C 批量提取 PDF 里文字内容并导出到表格,以及批量给 PDF 文件改名的实现方案、步骤和应用场景。 批量提取 PDF 文字内容并导出到表格 应用场景 文档数据整理:在处理大量学术论文、报告等 PDF 文档时,需要提取其中的关键信…...
智慧机房解决方案(文末联系,领取整套资料,可做论文)
智慧机房解决方案-软件部分 一、方案概述 本智慧机房解决方案旨在通过硬件设备与软件系统的深度整合,实现机房的智能化管理与服务,提升机房管理人员的工作效率,优化机房运营效率,确保机房设备的安全稳定运行。软件部分包括机房管…...
【C编程问题集中营】使用数组指针时容易踩得坑
【C编程问题集中营】使用数组指针时容易踩得坑 文章目录 【C编程问题集中营】使用数组指针时容易踩得坑一、获取数组首地址二、应用场景举例2.1 正常场景2.2 异常场景 三、总结 一、获取数组首地址 一维数组的首地址即数组第一个元素的指针,常用的获取一维数组首地…...
【Redis】Linux、Windows、Docker 环境下部署 Redis
一、Linux环境部署Redis 1、卸载 # 查看 Redis 是否还在运行 [appuserlocalhost redis]$ ps -ef|grep redis appuser 135694 125912 0 14:24 pts/1 00:00:00 ./bin/redis-server *:6379 appuser 135731 125912 0 14:24 pts/1 00:00:00 grep --colorauto redis# 停止…...
反函数定义及其推导
文章目录 定义存在条件举例说明总结 反函数是数学中一种特殊的函数,用于“逆转”另一个函数的映射关系。 定义 设有一个函数 f : X → Y f: X \to Y f:X→Y。如果存在一个函数 g : Y → X g: Y \to X g:Y→X,使得对于所有 x ∈ X x \in X x∈X 和 y…...
2025.2.9机器学习笔记:PINN文献阅读
2025.2.9周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 文献阅读 题目信息 题目: GPT-PINN:Generative Pre-Trained Physics-Informed Neural Networks toward non-intrusive Meta-learning of parametric PDEs期刊: Fini…...
Oracle数据连接 Dblink
拓展: oracle远程登陆数据库 1.oracle客户端或者服务端 2.修改你的电脑如下路径文件(服务器IP,服务器的数据库名,服务器的数据库端口号) c:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora orcl_109 (DESCRIPTION …...
fetch请求总结,fastadmin中后台接口强制返回json数据
fetch请求 提交图片,只支持formData方式,这样会自动变为multiform方式,而且一般的post大多都可以用这样的方式来完成请求 const formData new FormData(); formData.append(file, fileInput.files[0]); formData.append(pid, id); formData.append(dc, 1);fetch(/api/common…...
基于STM32的智能鱼缸水质净化系统设计
🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能鱼缸水质净化系统。 目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 1、设计要求…...
JAVA安全—FastJson反序列化利用链跟踪autoType绕过
前言 FastJson这个漏洞我们之前讲过了,今天主要是对它的链条进行分析一下,明白链条的构造原理。 Java安全—log4j日志&FastJson序列化&JNDI注入_log4j漏洞-CSDN博客 漏洞版本 1.2.24及以下没有对序列化的类做校验,导致漏洞产生 1.2.25-1.2.41增加了黑名单限制,…...
格式化字符串漏洞(Format String Vulnerability)
格式化字符串漏洞(Format String Vulnerability)是程序中因不当处理格式化字符串参数而导致的一类安全漏洞,常被攻击者利用来读取内存数据、篡改程序执行流程,甚至执行任意代码。以下是对其原理、利用方式及防御措施的详细解析&am…...
C++--iomanip库
目录 1. 设置字段宽度:std::setw() 2. 设置浮点数精度:std::setprecision() 3. 设置填充字符:std::setfill() 4. 控制对齐方式:std::left 和 std::right,std::internal 5. 控制进制输出:std::hex、std…...
Redis 集群原理、主从复制和哨兵模式的详细讲解
引言:本文记录了博主在学习Redis的过程中的原理,了解为什么使用与怎么样使用 Redis 集群,在使用 Redis 集群时出现的主从复制和哨兵模式的相关知识。本文并不涉及Redis安装。 文章目录 一、简单介绍什么是 Redis二、为什么要使用 Redis 集群三…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
