当前位置: 首页 > news >正文

【鸿蒙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()

接口名参数返回值说明
setContextcontext: object, id?: stringvoid设置XComponent回调的context, 设置XComponent的id属性值(可选), 播放视频时需要调用该接口
setDebugopen: booleanvoid设置日志开关
native_setupvoid初始化配置
setDataSourceurl: stringvoid设置视频源地址
setDataSourceHeaderheaders: Map<string, string>void设置视频源的HTTP请求头
setOptioncategory:string, key: string, value: stringvoid设置播放前预设参数(用于设置char类型参数)
setOptionLongcategory:string, key: string, value: stringvoid设置播放前预设参数(用于设置int类型参数)
prepareAsyncvoid加载视频
startvoid播放视频
stopvoid停止播放
pausevoid暂停播放
resetvoid视频重置
releasevoid释放资源
seekTomsec: stringvoid快进、后退
setScreenOnWhilePlayingon: booleanvoid设置屏幕常亮
setSpeedspeed: stringvoid设置播放倍数
getSpeednumber获取设置的倍数
isPlayingboolean查看是否正在播放状态
setOnVideoSizeChangedListenerlistener: OnVideoSizeChangedListenervoid设置获取视频宽高回调监听
setOnPreparedListenerlistener: OnPreparedListenervoid设置视频准备就绪回调监听
setOnInfoListenerlistener: OnInfoListenervoid设置播放器的各种状态回调监听
setOnErrorListenerlistener: OnErrorListenervoid设置播放异常回调监听
setOnBufferingUpdateListenerlistener: OnBufferingUpdateListenervoid设置buffer缓冲回调监听
setOnSeekCompleteListenerlistener: OnSeekCompleteListenervoid设置快进后退回调监听
setMessageListenervoid设置视频监听器到napi用于接收回调
getVideoWidthnumber获取视频宽度
getVideoHeightnumber获取视频高度
getVideoSarNumnumber获取视频宽高比的分子
getVideoSarDennumber获取视频宽高比的分母
getDurationnumber获取视频总的时长
getCurrentPositionnumber获取视频播放当前位置
getAudioSessionIdnumber获取音频sessionID
setVolumeleftVolume: string,rightVolume:stringvoid设置音量
setLoopCountlooping: booleanvoid设置循环播放
isLoopingboolean查看当前是否循环播放
selectTracktrack: stringvoid选择轨道
deselectTracktrack: stringvoid删除选择轨道
getMediaInfoobject获取媒体信息
setAudioIdid: stringvoid设置创建音频对象,设置id
ontype: ‘audioInterrupt’, callback: Callback< InterruptEvent >void监听音频中断事件,使用callback方式返回结果
offtype: ‘audioInterrupt’void取消订阅音频中断事件
startRecordsaveFilePath: stringboolean开启视频录制
isRecordboolean获取视频录制状态
stopRecordPromise停止视频录制
screenshotsaveFilePath: stringPromise截屏

参数说明

  1. InterruptEvent 播放中断时,应用接收的中断事件。
名称类型必填说明
forceTypeInterruptForceType操作是由系统执行或是由应用程序执行。
hintTypeInterruptHint中断提示。
  1. InterruptForceType 枚举,强制打断类型。
名称说明
INTERRUPT_FORCE0由系统进行操作,强制打断音频播放。
INTERRUPT_SHARE1由应用进行操作,可以选择打断或忽略。
  1. InterruptHint 枚举,中断提示。
名称说明
INTERRUPT_HINT_NONE0无提示。
INTERRUPT_HINT_RESUME1提示音频恢复。
INTERRUPT_HINT_PAUSE2提示音频暂停。
INTERRUPT_HINT_STOP3提示音频停止。
INTERRUPT_HINT_DUCK4提示音频躲避。(躲避:音量减弱,而不会停止)
INTERRUPT_HINT_UNDUCK5提示音量恢复。

约束与限制

在下述版本验证通过:

  • 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…...

jvm - GC篇

如何减慢一个对象进入老年代的速度&#xff0c;如何降低GC的次数 堆内存细分 年轻代&#xff08;Young Generation&#xff09;&#xff1a; 新创建的对象首先被分配在年轻代中。年轻代又被进一步划分为一个Eden区和两个Survivor区&#xff08;通常称为S0和S1&#xff09;。…...

edu小程序挖掘严重支付逻辑漏洞

edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号&#xff0c;直接搜索引擎搜索即可得到&#xff0c;这就不用多说了&#xff0c;但是这里的手机号可以任意输入&#xff0c;只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…...

职责链模式

介绍 避免将请求发送者和接收者耦合在一起&#xff0c;让多个对象都有机会接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止。 处理请求的对象组成一条链&#xff08;职责链&#xff09;&#xff0c;职责链可…...

数据分析:企业数字化转型的金钥匙

引言&#xff1a;数字化浪潮下的数据金矿 在数字化浪潮席卷全球的背景下&#xff0c;有研究表明&#xff0c;只有不到30%的企业能够充分利用手中掌握的数据&#xff0c;这是否让人深思&#xff1f;数据已然成为企业最为宝贵的资产之一。然而&#xff0c;企业是否真正准备好从数…...

将Windows下的USB设备共享给WSL(ubuntu)

前言 本文用于学习记录&#xff0c;文中提到的方法也来自于网上资料&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 微软官方参考链接&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb 如果没有特殊标注&#xff0c;以下命令均在Windows终…...

UG NX二次开发(Python)-API函数介绍与应用实例(三)-UFLayer类操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1 前言2、UFLayer类说明3、获取当前工作图层4、移动对象到特定的图层1 前言 采用Python语言进行UG NX二次开发的帮助材料很少,采用录制的方法是一种比较容易实现的方式,但是使用UFun函数更容易上…...

【PostgreSQL内核学习 —— (WindowAgg(三))】

WindowAgg set_subquery_pathlist 部分函数解读check_and_push_window_quals 函数find_window_run_conditions 函数执行案例总结 计划器模块&#xff08;set_plan_refs函数&#xff09;set_windowagg_runcondition_references 函数执行案例 fix_windowagg_condition_expr 函数f…...

案例1.spark和flink分别实现作业配置动态更新案例

目录 目录 一、背景 二、解决 1.方法1:spark broadcast广播变量 a. 思路 b. 案例 ① 需求 ② 数据 ③ 代码 2.方法2:flink RichSourceFunction a. 思路 b. 案例 ① 需求 ② 数据 ③ 代码 ④ 测试验证 测试1 测试2 测试3 一、背景 在实时作业(如 Spark Str…...

一键掌握多平台短视频矩阵营销/源码部署

短视频矩阵系统的介绍与应用 随着数字化营销策略的不断演进&#xff0c;传统的短视频矩阵操作方法可能已显陈旧。为此&#xff0c;一款全新的短视频矩阵系统应运而生&#xff0c;它通过整合多个社交媒体账户、创建多样化的任务、运用先进的智能视频编辑工具、实现多平台内容的…...

如何利用maven更优雅的打包

最近在客户现场部署项目&#xff0c;有两套环境&#xff0c;无法连接互联网&#xff0c;两套环境之间也是完全隔离&#xff0c;于是问题就来了&#xff0c;每次都要远程到公司电脑改完代码&#xff0c;打包&#xff0c;通过网盘&#xff08;如果没有会员&#xff0c;上传下载慢…...

Win11非虚拟机安装ISE14.7

官网下载6.18GB 的 Full Installer for Windows 7/XP/Server解压后运行安装程序不勾选Enable WebTalk to send software, IP ...安装程序卡死在ISE:Configure WebTalk&#xff0c;此时打开任务管理器&#xff0c;在详情中找到xwebtalk&#xff0c;右键结束任务。安装程序继续进…...

大彩讲堂:掌握虚拟屏调试的方法

一、适合范围 适合全系列大彩协议串口屏产品 二、开发环境版本 1. VisualTFT软件版本&#xff1a;V3.0.0.1037及以上的版本&#xff0c;版本查看方式&#xff1a; (1) 打开VisualTFT软件启动页面如图2-1所示&#xff0c;右上角显示的软件版本号&#xff1b; 图2-1 软件版本 (…...

k8sollama部署deepseek-R1模型,内网无坑

这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…...

2025职业发展规划

2025职业发展规划 我是一名大公司的高级移动应用开发技术专家&#xff0c;目前参与了鸿蒙App开发&#xff0c;对鸿蒙的TS语言也有所了解。现在需要制定2025年的职业发展规划&#xff0c;包括学习内容和方向&#xff0c;并以思维导图的形式呈现。我需要梳理出合适的发展路径。首…...

VDN 微服务架构搭建篇(三)基于 Nacos 的 Spring Cloud Gateway 动态路由管理

VDN 微服务架构搭建篇&#xff08;三&#xff09;&#xff1a;基于 Nacos 的 Spring Cloud Gateway 动态路由管理 在微服务架构中&#xff0c;网关 是整个系统的入口&#xff0c;负责 流量管理、请求路由、安全控制等关键功能。 Spring Cloud Gateway 作为 Spring 生态官方推荐…...

(3)yaml语法

yaml语法 YAML 是 “YAML Ain’t a Markup Language”&#xff08;YAML 不是一种标记语言&#xff09;的递归缩写。在开发的这种语言时&#xff0c;YAML 的意思其实是&#xff1a;“Yet Another Markup Language”&#xff08;仍是一种标记语言&#xff09;。 通俗的来说yaml…...

SpringAI系列 - 使用LangGPT编写高质量的Prompt

目录 一、LangGPT —— 人人都可编写高质量 Prompt二、快速上手2.1 诗人 三、Role 模板3.1 Role 模板3.2 Role 模板使用步骤3.3 更多例子 四、高级用法4.1 变量4.2 命令4.3 Reminder4.4 条件语句4.5 Json or Yaml 方便程序开发 一、LangGPT —— 人人都可编写高质量 Prompt La…...

Linux提权--John碰撞密码提权

​John the Ripper​&#xff08;简称 John&#xff09;是一个常用的密码破解工具&#xff0c;可以通过暴力破解、字典攻击、规则攻击等方式&#xff0c;尝试猜解用户密码。密码的弱度是提权攻击中的一个重要因素&#xff0c;如果某个用户的密码非常简单或是默认密码&#xff0…...

系分成长指南

持续改进的核心理念&#xff1a;持续发现问题并改进&#xff0c;通过反馈和反馈循环优化工作流程。 如何制定反馈渠道&#xff1a;通过线上表格填写问卷、内部会议记录、即时消息等方式。 如何保持动力&#xff1a;设定具体目标、使用 KPI 测量进展、奖励机制、建立支持体系。 …...

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的&#xff0c;效率低的&#xff1b; 1.HTTP协议端口默认80&#xff0c;HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册&#xff0c;1024以后的则需…...

绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 本文主要介绍如何在绿联NAS中使用ssh远程连接后&#xff0c;使用一行代码快速安装cpolar内网穿透工具&#xff0c;轻松实现随时随地远程访问本地内网中的绿联NAS&#xff0c;无需公网…...

Temperature、Top-P、Top-K、Frequency Penalty详解

在生成式AI&#xff08;比如ChatGPT&#xff09;中&#xff0c;Temperature、Top-P、Top-K、Frequency Penalty 这些参数用于控制文本生成的多样性、随机性和重复度&#xff0c;它们的作用如下&#xff1a; 1. Temperature&#xff08;温度&#xff09; 作用&#xff1a;控制输…...

2.6作业

1.思维导图 2.代码解释 struct A{double a; }; struct B{char b[8]; };int main(int argc,const char *argv[]) {struct A x;struct B y;x.a 3.14;y *(struct B*)&x;printf("y.b %lf\n",*(double *)y.b);return 0; } 注释&#xff1a; 1. 定义struct A类型变…...

面试笔记-多线程篇

为什么不直接调用run方法而是调用start方法? start方法会先创建一条线程&#xff0c;再用创建出的新线程去执行对应的run方法&#xff0c;这样才是起到多线程效果&#xff0c;如果直接调用run方法&#xff0c;则只是在原线程执行。 线程的sleep方法和wait方法的区别&#xf…...

stacking 框架

stacking stacking介绍 Stacking是个多层的多模型集合方法。每一层都可包括多个模型&#xff0c;下一层利用上一层模型的结果进行学习。可以只使用一层&#xff0c;然后用元学习器融合&#xff0c;也可以多层融合。 单层融合 多层融合 如上图所示&#xff0c;Stacking结构中…...

面向对象编程简介

面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;强调通过“对象”来设计软件。对象是数据和功能的封装&#xff0c;使得程序更易于理解和维护。本文将介绍面向对象的基本概念、特性以及其在软件开发中的重要性。 1. 面向对象的基本概念 1.1 对象 对象是…...

【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据

说明&#xff1a; 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy&#xff08;好几年前的文章&#xff09;&#xff0c;从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy&#xff0c;需要注意不同版本对应的arcpy函数是存在差异的 数据准备&#xff1a;准备一…...

云计算——AWS Solutions Architect – Associate(saa)1、什么是云,AWS介绍

什么是云? 什么是云? 云计算(cloud computing)是基于互联网的相关服务的增加、使用和交付模式&#xff0c;通常涉及通过互联网来提供动态易护展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。 简单理解为&#xff1a;云是 共享资源&#xff0c;按需付费&#xff0…...

快手ip属地是定位吗?怎么改

在当今数字化时代&#xff0c;随着网络平台的不断发展&#xff0c;用户隐私和数据安全成为了公众关注的焦点。各大社交媒体平台纷纷推出的“IP属地”功能&#xff0c;无疑为网络环境增添了一抹新的色彩。其中&#xff0c;快手的IP属地显示功能尤为引人注目。那么&#xff0c;快…...

graylog初体验

最近graylog比较火&#xff0c;部署了一个来测试下&#xff0c;看下后续能不能代替目前占用资源比较多的elk&#xff0c;目前未对graylog性能进行深入测试&#xff0c;只是简单体验了下&#xff0c;graylog的UI比较简陋&#xff0c;但是在报警以及权限方面优于ELK&#xff0c;整…...

MySQL实战-解决方案

1. MySQL 主从集群同步延迟问题的解决方案 在主从复制架构中&#xff0c;主库执行写操作后&#xff0c;将更新事件写入 Binlog&#xff0c;从库通过 I/O 线程将 Binlog 数据同步到本地的 Relay Log&#xff0c;再由 SQL 线程解析并执行&#xff0c;从而保持数据一致性。然而&a…...

使用 CSS 实现透明效果

在 CSS 中&#xff0c;实现透明效果有几种方法&#xff0c;具体使用哪种方法取决于具体需求。以下是一些常见的方法&#xff1a; 使用 opacity 属性&#xff1a; opacity 属性可以设置整个元素的透明度&#xff0c;包括其所有的子元素。 .transparent { opacity: 0.5; /* 0 表…...

LabVIEW2025中文版软件安装包、工具包、安装教程下载

下载链接&#xff1a;LabVIEW及工具包大全-三易电子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2025安装图文教程》 1、解压后&#xff0c;双击install.exe安装 2、选中“我接受上述2条许可协议”&#xff0c;点击下一步 3、点击下一步&#xff0c;安装NI Packa…...

2025.2.5——五、[网鼎杯 2020 青龙组]AreUSerialz

题目来源&#xff1a;BUUCTF [网鼎杯 2020 青龙组]AreUSerialz 一、打开靶机&#xff0c;整理信息 直接得到一串php代码&#xff0c;根据题目可以看到还有序列化 二、解题思路 step 1&#xff1a;代码审计 <?phpinclude("flag.php");highlight_file(__FILE__…...

Oracle Life DBA的一天

/***************************************************************************************************************** Navicat Premium Data Transfer Source File : Oracle Life DBA的一天.sql Source Server Type : Oracle Source Server Version : 190…...

手写MVVM框架-实现简单v-bind

v-bind 有两种情况&#xff1a; 1.绑定的是一个简单的属性 <div :class"customClass">简单v-bind</div> 2.绑定的元素上面有表达式 <div :class"{customClass: a 1 > 2}">简单v-bind</div> 这一章我们先说第一种情况&…...

【力扣】240.搜索二维矩阵 II

题目 我的代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for(int i0;i<matrix.size();i){for(int j0;j<matrix[0].size();j){if(targetmatrix[i][j]){return true;}else if(target<matrix[i][j]){brea…...

PlanLLM: 首个支持开放词汇与封闭集任务的跨模态视频程序规划框架

2025年1月7号&#xff0c;由杨德杰、赵子敬、刘洋联合提出PlanLLM&#xff0c;一种基于可微调大型语言模型&#xff08;LLM&#xff09;的跨模态联合学习框架&#xff0c;用于解决视频程序规划任务。通过引入LLM增强规划模块和互信息最大化模块&#xff0c;PlanLLM突破了现有方…...

使用服务器部署DeepSeek-R1模型【详细版】

文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中&#xff0c;模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别&#xff0c;如何高效、稳定地将深度学习模型部署到…...

TCP三次握手、四次挥手过程及原理

TCP 协议简述 TCP 提供面向有连接的通信传输&#xff0c;面向有连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。 无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接…...

AWS App2Container

AWS App2Container 是一个由 Amazon Web Services (AWS) 提供的工具&#xff0c;它帮助用户将现有的传统应用程序&#xff08;特别是运行在虚拟机或物理服务器上的应用&#xff09;转化为容器化的应用&#xff0c;从而可以在 AWS 上更方便地部署、管理和扩展。具体来说&#xf…...

《一》深入了解软件测试工具 JMeter-自我介绍

深入了解软件测试工具 JMeter 在当今的数字化时代&#xff0c;软件已经渗透到我们生活的方方面面&#xff0c;从日常使用的手机应用到复杂的企业级系统&#xff0c;软件的质量和性能直接影响着用户体验和业务的成功。而软件测试作为保障软件质量的关键环节&#xff0c;其中的性…...

(算法竞赛)图论+DFS深搜——图的dfs遍历1

题目描述 给定一个无向图&#xff0c;包含 n 个顶点&#xff08;编号为 1 到 n&#xff09;和 e 条边。要求从顶点 1 开始进行深度优先搜索&#xff08;DFS&#xff09;&#xff0c;并按照访问顺序输出遍历结果。注意&#xff1a;当存在多个邻接点时&#xff0c;优先访问编号较…...

二级C语言题解:十进制转其他进制、非素数求和、重复数统计

目录 一、程序填空&#x1f4dd; --- 十进制转其他进制 题目&#x1f4c3; 分析&#x1f9d0; 二、程序修改&#x1f6e0;️ --- 非素数求和 题目&#x1f4c3; 分析&#x1f9d0; 三、程序设计&#x1f4bb; --- 重复数统计 题目&#x1f4c3; 分析&#x1f9d0; 前言…...

快速搭建GPU环境 | docker、k8s中使用gpu

目录 一、裸机部署安装 GPU Driver安装 CUDA Toolkit测试 二、Docker 环境安装 nvidia-container-toolkit配置使用该 runtime 三、 k8s 环境安装 device-plugin安装 GPU 监控 一、裸机部署 裸机中要使用上 GPU 需要安装以下组件&#xff1a; GPU DriverCUDA Toolkit 二者的关…...

基于docker搭建Kafka集群,使用KRaft方式搭建,摒弃Zookeeper

KAFKA基于docker使用KRaft进行集群搭建 环境&#xff1a;已成功搭建kafka服务 可点击链接跳转至安装kafka-3.8.0版本 并启用SASL认证 教程 使用基于Zookeeper方式搭建集群教程 kafka-3.8.0版本 并启用SASL认证 教程 搭建kafka-ui可视化工具 192.168.2.91 192.168.2.92 192…...

分库分表详解

分库分表确实有垂直切分和水平切分两种&#xff0c;针对给出的描述&#xff0c;以下是对这两种切分方式的详细分析和验证&#xff1a; 垂直切分 描述&#xff1a;将表按照功能模块、关系密切程度划分出来&#xff0c;部署到不同的库上。 分析&#xff1a;垂直切分主要是根据…...

【重生之学习C语言----水仙花篇】

目录 ​编辑 ----------------------------------------begin-------------------------------------- 一、什么是水仙花数&#xff1f; 二、问题分析 确定数字的位数&#xff1a;计算输入数字的位数 n。 分离每一位数字&#xff1a;例如将 153 分离为 1、5、3。 计算各…...

云端IDE如何重定义开发体验

豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE&#xff0c;旨在提高开发效率和质量。它支持多种编程语言和IDE&#xff0c;提供智能代码补全、代码解释、单元测试生成和问题修复等功能&#xff0c;同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…...