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

火山RTC 6 自定义视频

文档:

自定义视频采集--实时音视频-火山引擎

这个点,相关的文档 关于PC上的资料只有寥寥几句,没有代码、没有DEMO,自己琢磨了几天,没走对方向,和客服你来我往拉锯了几天加投诉下,才给了点内部代码参考。

一、自定义视频发送

1、涉及的数据类型

1)、流属性


/*** @locale zh* @type keytype* @brief 流属性*/
/*** @locale en* @type keytype* @brief Stream type*/
enum StreamIndex {/*** @locale zh* @brief 主流。包括:<br>*        + 由摄像头/麦克风通过内部采集机制,采集到的视频/音频; <br>*        + 通过自定义采集,采集到的视频/音频。*//*** @locale en* @brief Mainstream, including: <br>*       + Video/audio captured by the the camera/microphone using internal capturing; <br>*       + Video/audio captured by custom method.*/kStreamIndexMain = 0,/*** @locale zh* @brief 屏幕流。屏幕共享时共享的视频流,或来自声卡的本地播放音频流。*//*** @locale en* @brief Screen-sharing stream. Video/Audio streams for screen sharing.*/kStreamIndexScreen = 1,/*** @hidden for internal use only*/kStreamIndex3rd,/*** @hidden for internal use only*/kStreamIndex4th,/*** @hidden for internal use only*/kStreamIndex5th,/*** @hidden for internal use only*/kStreamIndex6th,/*** @hidden for internal use only*/kStreamIndex7th,/*** @hidden for internal use only*/kStreamIndexMax,
};

2)、视频输入类型

/*** @locale zh* @type keytype* @brief 视频输入源类型*/
/*** @locale en* @type keytype* @brief Video source type*/
enum VideoSourceType {/*** @locale zh* @brief 自定义采集视频源*//*** @locale en* @brief Custom video source*/kVideoSourceTypeExternal = 0,/*** @locale zh* @brief 内部采集视频源*//*** @locale en* @brief Internal video capture*/kVideoSourceTypeInternal = 1,/*** @locale zh* @brief 自定义编码视频源。  <br>*        你仅需推送分辨率最大的一路编码后视频流,SDK 将自动转码生成多路小流*//*** @locale en* @brief Custom encoded video source.   <br>*        Push the encoded video stream with the largest resolution, and the SDK will automatically transcode to generate multiple lower-quality streams for Simulcast.*/kVideoSourceTypeEncodedWithAutoSimulcast = 2,/*** @locale zh* @brief 自定义编码视频源。  <br>*        SDK 不会自动生成多路流,你需要自行生成并推送多路流*//*** @locale en* @brief Custom encoded video source.   <br>*         The SDK does not automatically generate multiple streams for Simulcast, you need to generate and push streams of different qualities.*/kVideoSourceTypeEncodedWithoutAutoSimulcast = 3,
};

3)、设置视频帧

/*** @locale zh* @type keytype* @brief 设置视频帧*/
/*** @locale en* @type keytype* @brief Sets the video frame*/
class IVideoFrame {
public:/*** @locale zh* @brief 获取视频帧类型,参看 VideoFrameType{@link #VideoFrameType}*//*** @locale en* @brief Gets video frame type, see VideoFrameType{@link #VideoFrameType}*/virtual VideoFrameType frameType() const = 0;/*** @locale zh* @brief 获取视频帧格式,参看 VideoPixelFormat{@link #VideoPixelFormat}*//*** @locale en* @brief Gets video frame format, see VideoPixelFormat{@link #VideoPixelFormat}*/virtual VideoPixelFormat pixelFormat() const = 0;/*** @locale zh* @brief 获取视频内容类型,参看 VideoContentType{@link #VideoContentType}。*//*** @locale en* @brief Gets video content type, see VideoContentType{@link #VideoContentType}.*/virtual VideoContentType videoContentType() const = 0;/*** @locale zh* @brief 获取视频帧时间戳,单位:微秒*//*** @locale en* @brief Gets video frame timestamp in microseconds*/virtual int64_t timestampUs() const = 0;/*** @locale zh* @brief 获取视频帧宽度,单位:px*//*** @locale en* @brief Gets video frame width in px*/virtual int width() const = 0;/*** @locale zh* @brief 获取视频帧高度,单位:px*//*** @locale en* @brief Gets video frame height in px*/virtual int height() const = 0;/*** @locale zh* @brief 获取视频帧旋转角度,参看 VideoRotation{@link #VideoRotation}*//*** @locale en* @brief Gets the video frame rotation angle, see VideoRotation{@link #VideoRotation}*/virtual VideoRotation rotation() const = 0;/*** @locale zh* @hidden for internal use only* @brief 获取镜像信息* @return 是否需要镜像<br>*        + True: 是  <br>*        + False: 否*//*** @locale en* @hidden for internal use only* @brief Gets mirror information* @return Is there a need to mirror the video:  <br>*        + True: Yes  <br>*        + False: No*/virtual bool flip() const = 0;/*** @locale zh* @brief 获取视频帧颜色空间,参看 ColorSpace{@link #ColorSpace}*//*** @locale en* @brief Gets video frame color space, see ColorSpace{@link #ColorSpace}*/virtual ColorSpace colorSpace() const = 0;/*** @locale zh* @brief 视频帧颜色 plane 数量* @note yuv 数据存储格式分为打包(packed)存储格式和平面(planar)存储格式,planar 格式中 Y、U、V 分平面存储,packed 格式中 Y、U、V 交叉存储*//*** @locale en* @brief Video frame color plane number* @note YUV formats are categorized into planar format and packed format.  <br>*        In a planar format, the Y, U, and V components are stored separately as three planes, while in a packed format, the Y, U, and V components are stored in a single array.*/virtual int numberOfPlanes() const = 0;/*** @locale zh* @brief 获取 plane 数据指针* @param plane_index plane 数据索引*//*** @locale en* @brief Gets plane data pointer* @param plane_index Plane data index*/virtual uint8_t* getPlaneData(int plane_index) = 0;/*** @locale zh* @brief 获取 plane 中数据行的长度* @param plane_index plane 数据索引*//*** @locale en* @brief Gets the length of the data line in the plane* @param plane_index Plane data index*/virtual int getPlaneStride(int plane_index) = 0;/*** @locale zh* @brief 获取扩展数据指针* @param size 扩展数据字节数*//*** @locale en* @brief Gets extended data pointer* @param size Size of extended data in bytes*/virtual uint8_t* getExtraDataInfo(int& size) const = 0;  // NOLINT/*** @locale zh* @brief 获取补充数据指针* @param size 补充数据字节数*//*** @locale en* @brief Gets supplementary data pointer* @param size Size of supplementary data in bytes*/virtual uint8_t* getSupplementaryInfo(int& size) const = 0;  // NOLINT/*** @locale zh* @brief 获取本地缓冲区指针*//*** @locale en* @brief Gets local buffer pointer*/virtual void* getHwaccelBuffer() = 0;/*** @locale zh* @brief 获取硬件加速Context对象(AKA Opengl Context, Vulkan Context)*//*** @locale en* @brief Get hardware accelerate context(AKA Opengl Context, Vulkan Context)*/virtual void* getHwaccelContext() = 0;
#ifdef __ANDROID__/*** @locale zh* @brief 获取硬件加速Context的Java对象(Only for Android, AKA Opengl Context)* @return 返回JavaLocalRef, 当不再使用时,需要手动执行DeleteLocalRef(env, jobject)方法释放该对象*//*** @locale en* @brief Get hardware accelerate context's java object(Only for Android, AKA Opengl Context)* @return return JavaLocalRef, need delete manually by use DeleteLocalRef(env, jobject)*/virtual jobject getAndroidHwaccelContext() = 0;
#endif/*** @locale zh* @brief 获取纹理矩阵(仅针对纹理类型的frame生效)*//*** @locale en* @brief Get Texture matrix (only for texture type frame)*/virtual void getTexMatrix(float matrix[16]) = 0;/*** @locale zh* @brief 获取纹理ID(仅针对纹理类型的frame生效)*//*** @locale en* @brief Get Texture ID (only for texture type frame)*/virtual uint32_t getTextureId() = 0;/*** @locale zh* @brief 浅拷贝视频帧并返回指针*//*** @locale en* @brief Makes shallow copies of video frame and return pointer*/virtual IVideoFrame* shallowCopy() = 0;/*** @locale zh* @brief 释放视频帧* @note 调用 pushExternalVideoFrame{@link #IRTCVideo#pushExternalVideoFrame} 推送视频帧后,你不需要再调用此方法释放资源。*//*** @locale en* @brief Releases video frame* @note After calling pushExternalVideoFrame{@link #IRTCVideo#pushExternalVideoFrame} to push the video frame, you must not call this API to release the resource.*/virtual void release() = 0;/*** @locale zh* @brief 转换为i420格式的视频帧*//*** @locale en* @brief Converts video frames to i420 format*/virtual void toI420() = 0;/*** @locale zh* @brief 获取视频帧的摄像头信息,参看 CameraID{@link #CameraID}*//*** @locale en* @brief Get cameraId of the frame, see CameraID{@link #CameraID}*/virtual CameraID getCameraId() const = 0;/*** @locale zh* @hidden for internal use only on Windows and Android* @type api* @brief 获取全景视频的 Tile 信息* @return FoV(可视范围)随本端的头位姿实时更新获取到的视频帧,包括高清视野和低清背景。参见 FovVideoTileInfo{@link #FovVideoTileInfo}。*//*** @locale en* @hidden for internal use only on Windows and Android* @type api* @brief Get Tile information from the panoramic video frames to enable the FoV (Field of View).* @return Video frames in the FoV(filed of view) accroding to the head pose. Refer to FovVideoTileInfo{@link #FovVideoTileInfo} for more details.*/virtual FovVideoTileInfo getFovTile() = 0;
/*** @hidden constructor/destructor*/
protected:/*** @locale zh* @hidden constructor/destructor* @brief 析构函数*//*** @locale en* @hidden constructor/destructor* @brief Destructor*/virtual ~IVideoFrame() = default;
};

二 、发送自定义视频的方法

1、进入房间前后,设置自定义视频

推送外部视频帧前,必须调用 setVideoSourceType{@link #setVideoSourceType} 开启外部视频源采集。

        int ret1 = m_video->setVideoSourceType(static_cast<bytertc::StreamIndex>(0), static_cast<bytertc::VideoSourceType>(0));// int ret1 = m_video->setVideoSourceType(bytertc::kStreamIndexScreen, bytertc::kVideoSourceTypeExternal/*kVideoSourceTypeExternal*/);

2、自定义发送

0)、pushExternalVideoFrame 接口

   /*** @locale zh* @type api* @region 视频管理* @brief 推送外部视频帧。* @param frame 设置视频帧,参看 IVideoFrame{@link #IVideoFrame}。* @return 方法调用结果:<br>*        + 0:成功;<br>*        + <0:失败。具体失败原因参看 ReturnStatus{@link #ReturnStatus}。* @note  *       + 支持格式:I420, NV12, RGBA, BGRA, ARGB  <br>*       + 该函数运行在用户调用线程内  <br>*       + 推送外部视频帧前,必须调用 setVideoSourceType{@link #setVideoSourceType} 开启外部视频源采集。*//*** @locale en* @type api* @region  Video Management* @brief Pushes external video frames.* @param frame Set the video frame. See IVideoFrame{@link #IVideoFrame}.* @return API call result:<br>*        + 0: Success.<br>*        + <0: Failure. See ReturnStatus{@link #ReturnStatus} for specific reasons.* @note  *        + Support for I420, NV12, RGBA, BGRA, and ARGB.<br>*        + This function runs in the user calling thread. <br>*        + Before pushing external video frames, you must call setVideoSourceType{@link #setVideoSourceType} to turn on external video source capture.*/virtual int pushExternalVideoFrame(IVideoFrame* frame) = 0;

1)、发送RGBA 数据

void startPushFrames(bytertc::IRTCVideo* m_video) {std::thread([m_video]() {const int width = 320;const int height = 240;const int frameIntervalMs = 40;const size_t bufferSize = static_cast<size_t>(width) * height * 4; // RGBA// 1) 外部只分配一次auto rgbaBuffer = std::make_unique<uint8_t[]>(bufferSize);for (int i = 0; i < 2'500'000; ++i) {// 2) 填充纯色(R→G→B 循环)int color = i % 3;for (int p = 0; p < width * height; ++p) {rgbaBuffer[p * 4 + 0] = (color == 0) ? 255 : 0;  // RrgbaBuffer[p * 4 + 1] = (color == 1) ? 255 : 0;  // GrgbaBuffer[p * 4 + 2] = (color == 2) ? 255 : 0;  // BrgbaBuffer[p * 4 + 3] = 255;                     // A}// 3) 构造 VideoFrameBuilderbytertc::VideoFrameBuilder builder;builder.width = width;builder.height = height;builder.data[0] = rgbaBuffer.get();builder.linesize[0] = width * 4;builder.data[1] = nullptr;builder.linesize[1] = 0;builder.data[2] = nullptr;builder.linesize[2] = 0;// 4) 交由调用方管理,不让 SDK 释放builder.memory_deleter = nullptr;builder.pixel_fmt = bytertc::kVideoPixelFormatRGBA;builder.rotation = bytertc::kVideoRotation0;builder.timestamp_us = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();builder.color_space = bytertc::kColorSpaceYCbCrBT601FullRange;// 5) 构建并推送帧bytertc::IVideoFrame* pFrame = bytertc::buildVideoFrame(builder);int ret = m_video->pushExternalVideoFrame(pFrame);if (ret != 0) {std::cerr << "pushExternalVideoFrame failed: " << ret << std::endl;}// 6) 控制帧率std::this_thread::sleep_for(std::chrono::milliseconds(frameIntervalMs));}// rgbaBuffer 在此 lambda 结束时自动释放}).detach();
}

2)、发送i420数据


void startPushI420Frames(bytertc::IRTCVideo* m_video) {std::thread([m_video]() {const int width = 320;const int height = 240;const int frameIntervalMs = 40;// I420 格式参数计算const size_t ySize = static_cast<size_t>(width) * height;const size_t uvSize = ySize / 4;  // 4:2:0 采样比例const size_t totalSize = ySize + uvSize * 2;// 使用预分配的环形缓冲区(示例使用 vector 模拟)std::vector<uint8_t> yuvBuffer(totalSize * 3);  // 预分配 3 帧空间size_t frameIndex = 0;for (int i = 0; i < 2'500'000; ++i) {// 计算当前帧缓冲区位置auto buffer = yuvBuffer.data() + frameIndex * totalSize;// 生成 YUV 数据(示例:纯色填充)uint8_t yValue = 0xBf;  // BT.601 灰度值 18%uint8_t uvValue = 0xE0; // BT.601 中性色度值// 填充 Y 平面(亮度)std::fill_n(buffer, ySize, yValue);// 填充 U/V 平面(色度)std::fill_n(buffer + ySize, uvSize, uvValue);         // U 平面std::fill_n(buffer + ySize + uvSize, uvSize, uvValue); // V 平面// 构造 VideoFrameBuilderbytertc::VideoFrameBuilder builder;builder.width = width;builder.height = height;// 设置 I420 数据指针和行对齐builder.data[0] = buffer;                // Y 平面builder.data[1] = buffer + ySize;        // U 平面builder.data[2] = buffer + ySize + uvSize;// V 平面builder.linesize[0] = width;             // Y 行字节数builder.linesize[1] = width / 2;         // U 行字节数(半宽)builder.linesize[2] = width / 2;         // V 行字节数(半宽)// 设置元数据builder.memory_deleter = nullptr;        // 由 vector 自动管理内存builder.pixel_fmt = bytertc::kVideoPixelFormatI420;builder.rotation = bytertc::kVideoRotation0;builder.timestamp_us = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();builder.color_space = bytertc::kColorSpaceYCbCrBT601LimitedRange;// 构建并推送帧bytertc::IVideoFrame* pFrame = bytertc::buildVideoFrame(builder);if (!pFrame) {std::cerr << "Failed to build I420 video frame" << std::endl;continue;}int ret = m_video->pushExternalVideoFrame(pFrame);if (ret != 0) {std::cerr << "pushExternalVideoFrame failed: " << ret << std::endl;}// 更新帧索引(环形缓冲区)frameIndex = (frameIndex + 1) % 3;// 控制帧率std::this_thread::sleep_for(std::chrono::milliseconds(frameIntervalMs));}}).detach();
}

 startPushI420Frames(m_video);

3、编码参数

调用该方法前,SDK 默认仅发布一条分辨率为 640px × 360px,帧率为 15fps 的视频流。

/*** @locale zh* @type api* @region 视频管理* @brief <span id="IRTCVideo-setvideoencoderconfig-1"></span> 视频发布端设置期望发布的最大分辨率视频流参数,包括分辨率、帧率、码率、网络不佳时的回退策略等。  <br>*        该接口支持设置一路视频流参数,设置多路参数请使用重载 API:[setVideoEncoderConfig](#IRTCVideo-setvideoencoderconfig-2)。* @param max_solution 期望发布的最大分辨率视频流参数。参看 VideoEncoderConfig{@link #VideoEncoderConfig}。* @return 方法调用结果: <br>*        + 0:成功  <br>*        + !0:失败  * @note  *        + 你可以同时使用 enableSimulcastMode{@link #IRTCVideo#enableSimulcastMode} 方法来发布多路分辨率不同的流。具体而言,若期望发布多路不同分辨率的流,你需要在发布流之前调用本方法以及 enableSimulcastMode{@link #IRTCVideo#enableSimulcastMode} 方法开启多路流模式,SDK 会根据订阅端的设置智能调整发布的流数(最多发布 4 条)以及各路流的参数。其中,调用本方法设置的分辨率为各路流中的最大分辨率。具体规则参看[推送多路流](https://www.volcengine.com/docs/6348/70139)文档。<br>*        + 调用该方法前,SDK 默认仅发布一条分辨率为 640px × 360px,帧率为 15fps 的视频流。  <br>*        + 使用自定义采集时,必须调用该方法设置编码参数,以保证远端收到画面的完整性。<br>*        + 该方法适用于摄像头采集的视频流,设置屏幕共享视频流参数参看 setScreenVideoEncoderConfig{@link #IRTCVideo#setScreenVideoEncoderConfig}(Linux 不适用)。*//*** {en}* @type api* @region Video Management* @brief <span id="IRTCVideo-setvideoencoderconfig-1"></span> Video publisher call this API to set the parameters of the maximum resolution video stream that is expected to be published, including resolution, frame rate, bitrate, and fallback strategy in poor network conditions.<br>*        You can only set configuration for one stream with this API. If you want to set configuration for multiple streams, Call [setVideoEncoderConfig](#IRTCVideo-setvideoencoderconfig-2).* @param max_solution The maximum video encoding parameter. See VideoEncoderConfig{@link #VideoEncoderConfig}.* @return  API call result: <br>*        + 0: Success <br>*        + ! 0: Failure * @note  *        + You can use enableSimulcastMode{@link #IRTCVideo#enableSimulcastMode} simultaneously to publish streams with different resolutions. Specifically, if you want to publish multiple streams with different resolutions, you need to call this method and enable the simulcast mode with enableSimulcastMode{@link #IRTCVideo#enableSimulcastMode} before publishing your streams. The SDK will intelligently adjust the number of streams to be published (up to 4) and their parameters based on the settings of the subscribing end. The resolution set by calling this method will be the maximum resolution among the streams. For specific rules, please refer to [Simulcasting](https://docs.byteplus.com/en/byteplus-rtc/docs/70139).<br>*        + Without calling this API, SDK will only publish one stream for you with a resolution of 640px × 360px and a frame rate of 15fps.  <br>*        + In custom capturing scenario, you must call this API to set encoding configurations to ensure the integrity of the picture received by the remote users.<br>*        + This API is applicable to the video stream captured by the camera, see setScreenVideoEncoderConfig{@link #IRTCVideo#setScreenVideoEncoderConfig} for setting parameters for screen sharing video stream.*/virtual int setVideoEncoderConfig(const VideoEncoderConfig& max_solution) = 0;

        bytertc::VideoEncoderConfig encodeConfig;encodeConfig.width = width;encodeConfig.height = height;encodeConfig.frame_rate = 25;encodeConfig.encoder_preference = bytertc::kVideoEncodePreferenceBalance;m_video->setVideoEncoderConfig(encodeConfig);

相关文章:

火山RTC 6 自定义视频

文档&#xff1a; 自定义视频采集--实时音视频-火山引擎 这个点&#xff0c;相关的文档 关于PC上的资料只有寥寥几句&#xff0c;没有代码、没有DEMO&#xff0c;自己琢磨了几天&#xff0c;没走对方向&#xff0c;和客服你来我往拉锯了几天加投诉下&#xff0c;才给了点内部…...

[Java][Leetcode middle] 121. 买卖股票的最佳时机

暴力循环 总是以最低的价格买入&#xff0c;以最高的价格卖出: 例如第一天买入&#xff0c;去找剩下n-1天的最高价格&#xff0c;计算利润 依次计算到n-1天买入&#xff1b; 比较上述利润 // 运行时间超时。 o(n^2)public int maxProfit1(int[] prices) {int profit 0;for (i…...

《数据结构初阶》【堆 + 堆排序 + TOP-K】

【堆 堆排序 TOP-K】目录 前言&#xff1a;什么是堆&#xff1f;堆的实现方式有哪些&#xff1f;我们要选择哪种方式进行实现&#xff1f; ----------------堆的实现----------------什么是向上调整算法&#xff0c;要怎么实现&#xff1f;什么是向下调整算法&#xff0c;要怎…...

sqlilab-Less-18

知识铺垫 User-Agent 首部包含了一个特征字符串&#xff0c;用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。user-agent的作用。通过识别用户身份&#xff0c;响应合适的web界面&#xff0c;所以更改可以让电脑返回一个手机界…...

mapbox进阶,使用mapbox-plugins插件加载饼状图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀使用mapbox-plugins插件加载饼状图1. ☘…...

【Java继承】——面向对象编程的基石

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 【前言】 在Java面向对象编程中&#xff0c;继承是一个非常重要的概念。它允许我们创建一个新类&…...

【数据结构】——队列

一、队列的概念和结构 概念&#xff1a; 只允许在⼀端进⾏插⼊数据操作&#xff0c;在另⼀端进⾏删除数据操作的特殊线性表&#xff0c;队列具有先进先 出FIFO(First In First Out)。 入队&#xff1a;进行数据插入的一端叫做队尾 出队&#xff1a;进行删除操作的一端叫做队…...

如何找出所有不重复的三位偶数:详细解法与思考过程

问题描述 给定一个包含数字&#xff08;0-9&#xff09;的数组digits&#xff0c;其中可能包含重复元素。我们需要找出所有满足以下条件且互不相同的整数&#xff1a; 该整数由digits中的三个元素按任意顺序依次连接组成 该整数不含前导零&#xff08;即必须是100-999之间的数…...

每日Prompt:超现实交互场景

提示词 一幅铅笔素描画&#xff0c;描绘了 一个女孩 与 一朵玫瑰 互动的场景&#xff0c;其中 一朵玫瑰 以逼真的全彩风格呈现&#xff0c;与 一个女孩及背景的手绘素描风格形成超现实的对比。...

基于大模型预测的多发性硬化综合诊疗方案研究报告大纲

目录 一、引言二、文献综述三、大模型预测系统构建四、术前预测与手术方案制定五、术中监测与决策支持六、术后护理与并发症预测七、麻醉方案智能优化八、统计分析与技术验证九、实验验证与证据支持十、健康教育与指导系统十一、结论与展望一、引言 (一)研究背景与意义 多发…...

五、Hive表类型、分区及数据加载

在 Hive 中高效构建、管理和查询数据仓库&#xff0c;核心在于精准运用表类型&#xff08;内部/外部&#xff09;与分区策略&#xff08;静态/动态/多重&#xff09;。这不仅决定数据的生命周期归属&#xff0c;更是优化海量数据查询性能的关键手段。 一、表的身份权责&#x…...

在选择合适的实验室铁地板和铸铁试验平板,帮分析​

铸铁测试底板是一种采用铸铁材料经过加工制成的基准测量工具&#xff0c;主要用于工业检测、机械加工和实验室等高精度要求的场合。其核心功能是为各类测量、检验、装配工作提供稳定的水平基准面&#xff0c;确保测量数据的准确性和一致性。 一、铸铁测试底板的基本特性 1.材质…...

阿里云人工智能大模型通义千问Qwen3开发部署

本文主要描述阿里云人工智能大模型开源社区ModelScope提供的通义千问Qwen3开发部署。 与阿里云一起 轻松实现数智化 让算力成为公共服务&#xff1a;用大规模的通用计算&#xff0c;帮助客户做从前不能做的事情&#xff0c;做从前做不到的规模。让数据成为生产资料&#xff1a;…...

网络基础知识梳理和Muduo库使用

文章目录 网络基础知识梳理和Muduo库使用1.知识储备2.阻塞、非阻塞、同步、异步我的总结 3.Unix/Linux上的五种IO模型0.铺垫1.阻塞IO&#xff08;blocking&#xff09;2.非阻塞IO&#xff08;non-blocking&#xff09;3.IO复用&#xff08;IO multiplexing&#xff09;4.信号驱…...

IDEA 插件推荐:提升编程效率

通过安装和使用合适的插件&#xff0c;可以大幅提升开发效率和代码质量。本文将从多个维度推荐实用的 IDEA 插件&#xff0c;并提供安装与使用指南。 一、代码辅助类插件 1. Key Promoter X —— 快捷键学习利器 功能介绍&#xff1a;当你使用鼠标点击某个功能时&#xff0c;…...

001大模型-认识大模型以及大模型应用场景

大模型是一种基于海量数据训练的人工智能系统&#xff0c;具备强大的语言理解和生成能力。其工作原理是通过深度学习算法&#xff0c;分析大量文本数据&#xff0c;学习语言模式和知识&#xff0c;从而能够处理复杂的任务。大模型的应用广泛&#xff0c;包括自然语言处理、机器…...

Qt进阶开发:QTcpServer的的详解

文章目录 一、QTcpServer 简介二、常用成员函数的使用三、信号函数的使用四、虚函数的使用五、连接多客户端-服务端示例一、QTcpServer 简介 QTcpServer 是 Qt 网络模块中的一个核心类,用于实现 基于 TCP 协议的服务端(Server),它负责监听端口、接收客户端连接请求,并通过…...

Spark,集群搭建之Yarn模式

以下是Spark基于Yarn模式的集群搭建关键步骤&#xff08;需先部署Hadoop Yarn集群&#xff09;&#xff1a; 一、环境准备 1. 确认Hadoop已运行 - 确保HDFS、Yarn ResourceManager和NodeManager正常启动。 2. 安装Java - 所有节点安装JDK 8&#xff0c;配置 JAVA_HOME 环境变量…...

fiddler 配置ios手机代理调试

平时做移动移动端开必的时候经常需要抓包手机&#xff0c;用于接口请求跟踪&#xff0c;但iOS的抓包经常性的配不成功&#xff0c;经过踩过不少坑后终于知道了整个配置流程&#xff0c;此文记录Fiddler抓包iOS手机的配置流程。 Step 1&#xff1a;Fiddler配置 通过工具栏Tool…...

iOS即时通信的技术要点

iOS即时通信开发的关键技术要点总结&#xff1a; 一、通讯协议选择 Socket通信 基础实现&#xff1a;使用原生BSD Socket或CFNetwork框架&#xff08;复杂&#xff09;&#xff0c;推荐第三方库如CocoaAsyncSocket&#xff08;封装GCDAsyncSocket&#xff09;&#xff0c;简化T…...

Windows 安装 Milvus

说明 操作系统&#xff1a;Window 中间件&#xff1a;docker desktop Milvus&#xff1a;Milvus Standalone&#xff08;单机版&#xff09; 安装 docker desktop 参考&#xff1a;Window、CentOs、Ubuntu 安装 docker-CSDN博客 安装 Milvus 参考链接&#xff1a;Run Mil…...

5G网络:能源管理的“智能电网“革命,Python如何成为关键推手?

5G网络&#xff1a;能源管理的"智能电网"革命&#xff0c;Python如何成为关键推手&#xff1f; 大家好&#xff0c;我是Echo_Wish。今天咱们聊一个既硬核又接地气的话题——5G网络如何用Python代码重构全球能源管理。 不知道你们有没有注意过&#xff1a; • 家里装…...

解决WSL、Ubuntu的.ico图标不正确显示缩略图

解决WSL、Ubuntu的.ico图标不正确显示缩略图 问题描述 Win10系统中由于更新了某些软件&#xff0c;篡改了默认的图像显示软件&#xff0c;导致WSL等软件未能成功显示图标&#xff0c;表现如下&#xff1a; 解决方法 将ico文件的默认打开方式更改为“画图”&#xff0c;如下…...

Redis+Caffeine构造多级缓存

一、背景 项目中对性能要求极高&#xff0c;因此使用多级缓存&#xff0c;最终方案决定是RedisCaffeine。其中Redis作为二级缓存&#xff0c;Caffeine作为一级本地缓存。 二、Caffeine简单介绍 Caffeine是一款基于Java 8的高性能、灵活的本地缓存库。它提供了近乎最佳的命中…...

Redis+Caffeine构建高性能二级缓存

大家好&#xff0c;我是摘星。今天为大家带来的是RedisCaffeine构建高性能二级缓存&#xff0c;废话不多说直接开始~ 目录 二级缓存架构的技术背景 1. 基础缓存架构 2. 架构演进动因 3. 二级缓存解决方案 为什么选择本地缓存&#xff1f; 1. 极速访问 2. 减少网络IO 3…...

【机器人】复现 UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025

UniGoal的提出了一个通用的零样本目标导航框架&#xff0c;能够统一处理多种类型的导航任务。 支持 对象类别导航、实例图像目标导航和文本目标导航&#xff0c;而无需针对特定任务进行训练或微调。 本文分享UniGoal复现和模型推理的过程&#xff5e; 查找沙发&#xff0c;模…...

LeetCode 373 查找和最小的 K 对数字题解

LeetCode 373 查找和最小的 K 对数字题解 题目描述 给定两个以升序排列的整数数组 nums1 和 nums2&#xff0c;以及一个整数 k。定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2。请找到和最小的 k 个数对。 解题思路 最小堆优化法…...

搜索二维矩阵 II 算法讲解

搜索二维矩阵 II 算法讲解 一、问题描述 给定一个 m x n 的二维矩阵 matrix ,需要在其中搜索一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。要求编写一个高效的算法来完成搜索任务。 二、解题思路 方法一:暴力枚举 …...

三层交换机,单臂路由(用DHCP自动配置ip+互通+ACL

三层交换机&#xff0c;单臂路由&#xff08;用DHCP自动配置ip互通ACL 任务 1.用DHCP自动配置ip 2.三层交换机SVI、 3.单臂路由 4.互通 5.ACL三层交换机SVI 交换机 Switch>en Switch#conf t Enter configuration commands, one per line. End with CNTL/Z. Switch(conf…...

OpenCV CUDA 模块中在 GPU 上对图像或矩阵进行 翻转(镜像)操作的一个函数 flip()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::flip 是 OpenCV 的 CUDA 模块中的一个函数&#xff0c;用于在 GPU 上对图像或矩阵进行 翻转&#xff08;镜像&#xff09;操作。它类似…...

链表面试题7之相交链表

来了来了&#xff0c;这道题才是值得我们奇思妙想的题,链接在下面。 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 看完题目一脸懵吗&#xff0c;没关系&#xff0c;我们还得看示例 还是一脸懵怎么办&#xff1f;&#xff1f; 两个链表相交的方式有几种&#xff1f;…...

Excel-to-JSON插件专业版功能详解:让Excel数据转换更灵活

前言 在数据处理和系统集成过程中&#xff0c;Excel和JSON格式的转换是一个常见需求。Excel-to-JSON插件提供了一套强大的专业版功能&#xff0c;能够满足各种复杂的数据转换场景。本文将详细介绍这些专业版功能的应用场景和使用方法。 订阅说明 在介绍具体功能之前&#xf…...

【C++】”如虎添翼“:模板初阶

泛型编程&#xff1a; C中一种使用模板来实现代码重用和类型安全的编程范式。它允许程序员编写与数据类型无关的代码&#xff0c;从而可以用相同的代码逻辑处理不同的数据类型。模板是泛型编程的基础 模板分为两类&#xff1a; 函数模板&#xff1a;代表了一个函数家族&#x…...

【K8S学习之探针】详细了解就绪探针 readinessProbe 和存活探针 livenessProbe 的配置

参考 Pod健康检查 Kubernetes 学习笔记Kubernetes 就绪探针&#xff08;Readiness Probe&#xff09; - 人艰不拆_zmc - 博客园Kubernetes存活探针&#xff08;Liveness Probe&#xff09; - 人艰不拆_zmc - 博客园 Pod健康检查 Pod的健康状态由两类探针来检查&#xff1a;…...

WSL 安装 Debian 12 后,Linux 如何安装 redis ?

在 WSL 的 Debian 12 上安装 Redis 的步骤如下&#xff1a; 1. 更新系统包列表 sudo apt update && sudo apt upgrade -y2. 安装 Redis sudo apt install redis-server -y3. 启动 Redis 服务 sudo systemctl start redis4. 设置开机自启 sudo systemctl enable red…...

python打卡day22

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 就是很简单很草率地走了一遍机器学习的经典流程&am…...

国产化Excel处理控件Spire.XLS系列教程:如何通过 C# 删除 Excel 工作表中的筛选器

在 Excel 文件中&#xff0c;筛选器&#xff08;Filter&#xff09;是一个常用的数据处理工具&#xff0c;可以帮助用户快速按条件筛选数据行。但在数据整理完成、导出、共享或打印之前&#xff0c;往往需要 删除 Excel 工作表中的筛选器&#xff0c;移除列标题中的下拉筛选按钮…...

使用 DMM 测试 TDR

TDR&#xff08;时域反射计&#xff09;可能是实验室中上升时间最快的仪器&#xff0c;但您可以使用直流欧姆表测试其准确性。 TDR 测量什么 在所有高速通道中&#xff0c;反射都很糟糕。我们尝试设计一个通道来减少反射&#xff0c;这些反射都会导致符号间干扰 &#xff08;…...

基于卡尔曼滤波的传感器融合技术的多传感器融合技术(附战场环境模拟可视化代码及应用说明)

基于卡尔曼滤波的传感器融合技术的多传感器融合技术(附战场环境模拟可视化代码及应用说明) 1 目标运动状态空间建模1.1 状态向量定义1.2 状态转移方程1.3 观测模型构建2 卡尔曼滤波核心算法实现2.1 初始化2.2 预测步骤2.3 更新步骤3 多传感器融合仿真验证3.1 传感器模型模拟3…...

M8040A/M8199助力数据中心收发信机测试

随着数字通信和大数据的不断发展&#xff0c;误码率测试变得越来越重要。高性能误码率测试仪作为一种关键的测试设备&#xff0c;可以对数字信号进行高速、高精度的误码率测试&#xff0c;广泛应用于通信、数据中心、半导体等行业。 M8040A误码仪系统当前不仅在上游IP和顶层芯…...

傲云源墅:以五傲价值重构北京主城别墅格局

在高端别墅市场中&#xff0c;产品自身的品质与特色是吸引客户的关键。北京傲云源墅以其独特的 “五傲” 价值&#xff0c;重新定义了北京主城别墅的标准。 首先是低密之傲&#xff0c;傲云源墅的容积率低至约 0.9&#xff0c;与市场上 1.0 以上容积率的别墅相比&#xff0c;为…...

精益数据分析(56/126):创业阶段的划分与精益数据分析实践

精益数据分析&#xff08;56/126&#xff09;&#xff1a;创业阶段的划分与精益数据分析实践 在创业和数据分析的探索之旅中&#xff0c;理解创业阶段的划分以及与之对应的精益数据分析方法至关重要。今天&#xff0c;依旧怀揣着与大家共同进步的心态&#xff0c;深入研读《精…...

[redis进阶六]详解redis作为缓存分布式锁

目录 一 什么是缓存 缓存总结板书: 二 使⽤Redis作为缓存 三 缓存的更新策略 1) 定期⽣成 2) 实时⽣成 四 面试重点:缓存预热,缓存穿透,缓存雪崩 和缓存击穿 1)缓存预热 2)缓存穿透 3)缓存雪崩 4)缓存击穿 五 分布式锁 板书: 1)什么是分布式锁 2)分布式锁的基…...

【RabbitMQ】应用问题、仲裁队列(Raft算法)和HAProxy负载均衡

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、幂等性保障 什么是幂等性&#xff1f; 幂等性是指对一个系统进行重复调用&#xff08;相同参数&#xff09;&#xff0c;无论同一操作执行多少次&#xff0c;这些请求…...

国产密码新时代!华测国密 SSL 证书解锁安全新高度

在数字安全被提升到国家战略高度的今天&#xff0c;国产密码算法成为筑牢网络安全防线的关键力量。华测国密SSL证书凭借其强大性能与贴心服务&#xff0c;为企业网络安全保驾护航&#xff0c;成为符合国家安全要求的不二之选&#xff01;​ 智能兼容&#xff0c;告别浏览器适配…...

【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)

本篇文章将以一个小白视角&#xff0c;通俗易懂带你了解信号在产生&#xff0c;保存之后如何进行捕捉&#xff1b;以及在信号这个话题中&#xff1b;OS扮演的角色及背后是如何进行操作的&#xff1b;如何理解用户态内核态&#xff1b;还有一些可以引出的其他知识点&#xff1b;…...

C# 基础 try-catch代码块

​ try-catch代码块是C#中用于异常处理的核心机制。异常是在程序执行过程中可能出现的错误&#xff0c;而try-catch代码块允许您在执行代码时捕获并处理这些异常。 一、基础结构 try {//可能抛出异常的代码 } catch (ArgumentException ex) {//处理特定异常 } catch (Excepti…...

为什么 mac os .bashrc 没有自动加载?

原因说明 在macOS中&#xff0c;默认情况下&#xff0c;终端使用的是Bash或Zsh作为shell。对于较新版本的macOS&#xff08;从Catalina开始&#xff09;&#xff0c;默认的shell已经切换为Zsh。因此&#xff0c;如果你正在使用Zsh&#xff0c;.bashrc文件不会自动生效&#xf…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二十二)

目录 1 -> 开发静态共享包 1.1 -> 创建库模块 1.2 -> 编译库模块 2 -> 开发动态共享包 2.1 -> 使用约束 2.2 -> 开发动态共享包 2.2.1 -> 创建HSP模块 2.2.2 -> 编译HSP模块 3 -> 发布共享包 1 -> 开发静态共享包 HAR(Harmony Archive…...

QT6.8安装教程

官网下载 链接&#xff1a; Index of /official_releases/online_installers 这个比较慢 建议去 清华大学开源软件镜像站&#xff1a;Index of /qt/archive/online_installers/4.9/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 根据自己什么系统选择 点击打开…...