虚幻引擎流媒体插件开发:C++/C#实现Millicast低延迟视频集成
1. 项目概述为什么要在虚幻引擎中开发MillicastPlayer插件如果你正在用虚幻引擎做实时互动应用比如直播、云游戏或者远程协作那么流媒体传输这块硬骨头肯定绕不过去。传统的RTMP延迟太高WebRTC虽然好但直接集成到虚幻引擎里尤其是处理高并发、低延迟的直播流配置和优化起来相当麻烦。这就是Millicast这类基于WebRTC的商业化服务出现的背景它提供了更稳定的全球分发网络和更简化的API。但是Millicast官方提供的SDK通常是面向Web或原生桌面应用的。当我们需要在虚幻引擎中特别是要在蓝图和C/C#游戏逻辑里直接控制、渲染一个超低延迟的直播流时直接使用原生SDK就行不通了。我们需要一个“桥梁”这就是开发MillicastPlayer插件的核心价值将Millicast的流媒体接收、解码能力无缝地、高性能地嵌入到虚幻引擎的渲染管线与对象系统中。这个项目标题《虚幻引擎MillicastPlayer插件开发实战_C_C#》清晰地指出了技术栈和方向。C是核心用于编写虚幻引擎原生插件与引擎的渲染线程、RHI渲染硬件接口、音频系统进行底层交互实现最高效的视频帧注入。C#的角色则非常巧妙它可能通过两种方式介入一是利用UnrealCLR等第三方插件让开发者能用熟悉的C#编写游戏逻辑并调用我们C插件暴露的接口二是插件内部可能封装了Millicast的C# SDK并通过某种互操作机制如P/Invoke与C部分通信为蓝图提供更易用的功能节点。简单说这个插件就是为了让你在虚幻编辑器里拖一个“Millicast Player Actor”到场景中填上流名称和令牌就能实时播放来自Millicast服务器的超低延迟视频并且能通过蓝图或C#代码控制播放、暂停、音量甚至访问原始的像素数据去做AR叠加、视觉分析等高级应用。它解决的是“最后一公里”的集成问题将复杂的流媒体技术封装成游戏开发者熟悉的范式。2. 核心架构设计与技术选型解析开发这样一个插件绝不是简单地把Millicast的示例代码塞进虚幻引擎工程里。它需要一个深思熟虑的架构来平衡性能、易用性和引擎的兼容性。2.1 插件整体架构分层一个健壮的MillicastPlayer插件通常会采用分层架构隔离关注点原生SDK适配层C这是最底层负责封装Millicast官方C SDK或通过C# SDK的Native Interop。它的职责是建立网络连接、接收SRTP流、进行DTLS-SRTP解密、处理NACK/重传等WebRTC核心逻辑。这一层需要处理大量的异步事件和回调。解码与渲染层C这是性能关键层。收到编码后的视频帧通常是H.264或VP8/VP9后需要解码。这里有两个主流选择硬件解码利用DX11/DX12/Vulkan的硬件解码器如NVidia NVDEC、Intel Quick Sync Video。性能最优CPU占用极低是推荐方案。但这需要编写大量的图形API特定代码并处理纹理共享。软件解码使用FFmpeg的libavcodec。更通用兼容性好但CPU消耗高对于高清流如1080p60可能成为瓶颈。 解码后的RGB或YUV数据需要上传到GPU纹理。虚幻引擎提供了FTextureResource和RHI渲染硬件接口来创建和管理纹理。我们需要在渲染线程安全地将视频帧数据更新到UTexture2D或UTextureRenderTarget2D对象上。引擎对象抽象层C这一层将底层的视频流抽象成虚幻引擎的UObject。核心是一个UMillicastPlayerComponent或AMillicastPlayerActor。它负责向蓝图暴露属性流URL、令牌、是否自动播放和函数Play Stop SetVolume。管理底层适配层对象的生命周期。将视频纹理应用到某个UStaticMeshComponent或UMediaTexture上或者直接输出为纹理资源供蓝图使用。处理音频流将解码后的PCM数据送入虚幻引擎的音频引擎。蓝图与脚本接口层这是面向设计师和脚本程序员的层面。通过UCLASS、UFUNCTION、UPROPERTY宏将C类的功能暴露给蓝图。目标是让不懂C的同事也能轻松使用插件。C#桥接层可选如果项目决定使用C#通过UnrealCLR或未来官方的.NET集成则需要一个额外的桥接层。这层通常是一个C#类库它通过P/Invoke调用我们C插件暴露的C风格API或者直接引用Millicast C# SDK然后再提供一套符合UnrealCLR规范的C# API供游戏逻辑调用。2.2 关键技术选型与考量解码方案选择对于追求极致性能的桌面端项目硬件解码是必选项。在Windows上可以通过Microsoft的MFMedia Foundation或直接使用DXVA2/D3D11 VideoAPI。在插件中你需要根据RHI的类型DX11, DX12, Vulkan选择对应的解码器后端。这部分的代码复杂但带来的性能提升是数量级的。纹理更新策略视频帧是高频更新的如每秒60次。我们不能在游戏线程直接锁定纹理内存进行拷贝这会导致严重的卡顿。正确做法是在解码线程或接收回调线程将帧数据放入一个线程安全的队列。在渲染线程的BeginRendering或PreRender事件回调中从队列取出最新帧。使用RHI命令如RHIUpdateTexture2D或通过ID3D11DeviceContext直接更新纹理资源。这个过程必须确保纹理资源的生命周期和状态转换是安全的。音频同步音画同步至关重要。Millicast流通常包含独立的音频轨道。插件需要将音频PCM数据送入虚幻的FAudioDevice。你需要处理音频时钟与视频渲染时钟的同步简单的做法是跟随视频主时钟动态调整音频播放的缓冲或速率。注意线程安全是插件稳定的生命线。WebRTC的回调、解码、渲染可能分布在不同的线程。任何跨越线程边界的资源访问如纹理指针、状态标志都必须使用适当的同步原语如FScopeLock、std::atomic或任务队列FFunctionGraphTask来派发到游戏线程执行。3. 核心模块实现与C实战细节让我们深入到C实现的核心部分。假设我们的插件名为MillicastPlayer。3.1 创建插件与基础对象首先使用虚幻引擎的插件模板创建一个“空白”插件。然后创建核心的UObject类。// MillicastPlayerComponent.h #pragma once #include Components/ActorComponent.h #include MillicastPlayerComponent.generated.h class FMillicastVideoReceiver; // 前向声明具体实现在.cpp中 UCLASS(ClassGroup(Custom), meta(BlueprintSpawnableComponent)) class MILLICASTPLAYER_API UMillicastPlayerComponent : public UActorComponent { GENERATED_BODY() public: UMillicastPlayerComponent(); // 蓝图可调用开始播放 UFUNCTION(BlueprintCallable, Category Millicast) void Play(const FString StreamName, const FString Token); // 蓝图可调用停止播放 UFUNCTION(BlueprintCallable, Category Millicast) void Stop(); // 蓝图可读获取视频纹理 UPROPERTY(BlueprintReadOnly, Category Millicast, meta(DisplayNameVideo Texture)) UTexture2D* GetVideoTexture() const { return VideoTexture; } protected: virtual void BeginPlay() override; virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; private: // 内部初始化纹理 void InitializeTexture(int32 Width, int32 Height); // 被底层回调当视频帧解码完成时 void OnVideoFrameDecoded(const TArrayuint8 FrameData, int32 Width, int32 Height); private: UPROPERTY(Transient) UTexture2D* VideoTexture; TUniquePtrFMillicastVideoReceiver VideoReceiver; FThreadSafeBool bIsPlaying; };3.2 实现视频接收与解码器封装FMillicastVideoReceiver这个类是插件的真正核心它隔离了Millicast SDK的复杂性。// Private实现类 FMillicastVideoReceiver class FMillicastVideoReceiver : public TSharedFromThisFMillicastVideoReceiver { public: FMillicastVideoReceiver(UMillicastPlayerComponent* InOwnerComponent); ~FMillicastVideoReceiver(); bool Connect(const FString StreamName, const FString Token); void Disconnect(); // 设置视频帧回调 using FVideoFrameCallback TFunctionvoid(const TArrayuint8, int32, int32); void SetVideoFrameCallback(FVideoFrameCallback Callback); private: // Millicast SDK 实例指针假设为void*实际根据SDK类型而定 void* MillicastSubscriber; // 解码器上下文例如FFmpeg AVCodecContext或DXVA/D3D11解码器句柄 void* DecoderContext; // 用于将解码回调派发到游戏线程 FVideoFrameCallback OnVideoFrameDecodedDelegate; // 处理SDK的网络回调、解码线程 void OnTrackEvent(...); // Millicast SDK回调 void DecodeVideoFrame(const uint8* EncodedData, int32 DataSize); // 解码函数 };在Connect函数中你需要初始化Millicast SDK设置信令服务器地址并订阅指定的流。关键是将SDK的视频轨道回调绑定到类的成员函数上。解码器的初始化是一个关键步骤。以下是一个简化的软件解码FFmpeg初始化示例bool FMillicastVideoReceiver::InitializeDecoder(int32 CodecId) // CodecId 如 AV_CODEC_ID_H264 { AVCodec* Codec avcodec_find_decoder(CodecId); if (!Codec) return false; DecoderContext avcodec_alloc_context3(Codec); if (!DecoderContext) return false; if (avcodec_open2((AVCodecContext*)DecoderContext, Codec, nullptr) 0) { avcodec_free_context((AVCodecContext**)DecoderContext); return false; } return true; }3.3 渲染线程的纹理更新这是连接解码数据和虚幻渲染世界的桥梁。当OnVideoFrameDecoded在某个线程被调用时我们不能直接操作VideoTexture。void UMillicastPlayerComponent::OnVideoFrameDecoded(const TArrayuint8 FrameData, int32 Width, int32 Height) { // 1. 检查纹理尺寸是否匹配不匹配则重新创建 if (!VideoTexture || VideoTexture-GetSizeX() ! Width || VideoTexture-GetSizeY() ! Height) { InitializeTexture(Width, Height); } // 2. 将更新纹理的命令排入渲染线程 ENQUEUE_RENDER_COMMAND(UpdateMillicastTexture)( [TextureResource VideoTexture-GetResource(), FrameData, Width, Height](FRHICommandListImmediate RHICmdList) { // 获取纹理的RHI资源 FRHITexture2D* TextureRHI TextureResource-GetTexture2DRHI(); // 计算上传数据的大小假设是RGB8格式 uint32 Stride Width * 3; // 每个像素RGB 3字节 uint32 DataSize Stride * Height; // 更新纹理区域 RHIUpdateTexture2D( TextureRHI, // 目标纹理 0, // Mipmap索引 FUpdateTextureRegion2D(0, 0, 0, 0, Width, Height), // 更新区域 Stride, // 源数据行跨度 (const uint8*)FrameData.GetData() // 源数据 ); }); }InitializeTexture函数需要使用UTexture2D::CreateTransient来动态创建纹理并设置合适的像素格式如PF_B8G8R8A8。4. C#集成方案与UnrealCLR实战如果你的团队更擅长C#或者已有大量C#业务逻辑通过UnrealCLR集成是一个可行的选择。这里的C#并非直接编写插件核心而是作为插件的消费者和逻辑扩展层。4.1 项目设置与UnrealCLR配置安装UnrealCLR插件从GitHub获取最新版本放入引擎或项目的Plugins目录。创建C#类库项目在项目根目录创建Managed文件夹使用.NET SDK创建新的类库项目YourGame.Managed.csproj。配置项目文件在.uproject文件中启用UnrealCLR插件并正确设置Managed路径。编写C#绑定代码UnrealCLR提供了属性标记可以将C#类映射到虚幻引擎。4.2 编写C#端Millicast控制类假设我们的C插件已经暴露了一个简单的C函数接口通过extern C供外部调用。// Managed/MillicastPlayerProxy.cs using System.Runtime.InteropServices; using UnrealEngine; namespace YourGame.Managed { [UClass] public class AMillicastPlayerProxy : AActor { // 导入C插件暴露的Native函数 [DllImport(MillicastPlayer)] // 插件动态库名 private static extern IntPtr MillicastPlayer_Create(); [DllImport(MillicastPlayer)] private static extern void MillicastPlayer_Play(IntPtr handle, [MarshalAs(UnmanagedType.LPStr)] string streamName, [MarshalAs(UnmanagedType.LPStr)] string token); [DllImport(MillicastPlayer)] private static extern void MillicastPlayer_Stop(IntPtr handle); private IntPtr NativePlayerHandle; [UProperty] public string StreamName { get; set; } my-stream; [UProperty] public string Token { get; set; } your-token-here; protected override void BeginPlay() { base.BeginPlay(); NativePlayerHandle MillicastPlayer_Create(); if (NativePlayerHandle ! IntPtr.Zero) { MillicastPlayer_Play(NativePlayerHandle, StreamName, Token); } } protected override void EndPlay() { if (NativePlayerHandle ! IntPtr.Zero) { MillicastPlayer_Stop(NativePlayerHandle); // 假设有销毁函数 // MillicastPlayer_Destroy(NativePlayerHandle); } base.EndPlay(); } [UFunction] public void ChangeStream(string newStreamName, string newToken) { // 先停止旧的再播放新的 MillicastPlayer_Stop(NativePlayerHandle); StreamName newStreamName; Token newToken; MillicastPlayer_Play(NativePlayerHandle, StreamName, Token); } } }这个C#类AMillicastPlayerProxy在虚幻引擎中会生成一个对应的蓝图类。设计师可以将它拖入场景设置StreamName和Token属性它就会在游戏开始时自动播放流。ChangeStream函数也可以被蓝图或其它C#代码调用。4.3 C端的C接口封装为了让C#通过P/Invoke调用C插件需要提供一组简单的C接口。// MillicastPlayerCAPI.h #ifdef __cplusplus extern C { #endif MILLICASTPLAYER_API void* MillicastPlayer_Create(); MILLICASTPLAYER_API void MillicastPlayer_Destroy(void* Handle); MILLICASTPLAYER_API void MillicastPlayer_Play(void* Handle, const char* StreamName, const char* Token); MILLICASTPLAYER_API void MillicastPlayer_Stop(void* Handle); #ifdef __cplusplus } #endif// MillicastPlayerCAPI.cpp #include MillicastPlayerCAPI.h #include MillicastPlayerInstance.h // 一个内部管理类 void* MillicastPlayer_Create() { return new FMillicastPlayerInstance(); } void MillicastPlayer_Destroy(void* Handle) { delete static_castFMillicastPlayerInstance*(Handle); } void MillicastPlayer_Play(void* Handle, const char* StreamName, const char* Token) { auto Instance static_castFMillicastPlayerInstance*(Handle); if (Instance) { Instance-Play(FString(UTF8_TO_TCHAR(StreamName)), FString(UTF8_TO_TCHAR(Token))); } } // ... 其他函数实现这种方式的优点是逻辑清晰C#侧只负责业务调用性能关键的媒体处理全在C侧完成。缺点是增加了额外的封装层并且需要处理C#与C之间的字符串编码转换和内存管理。5. 常见问题、性能优化与调试技巧实录在实际开发中你会遇到各种各样的问题。以下是一些典型问题及其解决思路。5.1 编译与链接问题问题链接错误找不到Millicast SDK的符号。原因没有正确配置第三方库的链接路径。解决在插件的Build.cs文件中确保PublicAdditionalLibraries和PublicIncludePaths包含了Millicast SDK的.lib文件和头文件目录。对于动态库.dll还需要确保运行时能找到它们可以拷贝到Binaries目录。// MillicastPlayer.Build.cs PublicAdditionalLibraries.Add(Path.Combine(LibPath, millicast_sdk.lib)); PublicIncludePaths.Add(Path.Combine(SdkPath, include));问题UnrealCLR编译成功但C#类在编辑器中不显示。原因C#项目未成功编译或UnrealCLR的热重载未触发。解决检查Managed文件夹下的.csproj是否被正确加载。尝试在VS中手动编译C#项目。重启虚幻编辑器有时也能解决。5.2 运行时问题问题播放视频时画面卡顿或延迟极高。排查检查解码方式首先确认是否使用了硬件解码。在任务管理器中查看GPU视频解码器如“Video Decode”的占用率。如果很高且CPU占用低说明硬件解码在工作如果CPU占用极高可能是软件解码。检查纹理更新在渲染线程更新纹理的命令ENQUEUE_RENDER_COMMAND是否过于频繁或耗时确保只更新变化的区域并且上传的数据格式与纹理格式匹配避免不必要的格式转换。检查网络使用Millicast Dashboard或Wireshark查看网络抖动和丢包。WebRTC有抗抖动缓冲但如果网络太差延迟会累积。优化启用低延迟模式在初始化Millicast订阅者时设置lowLatency标志。调整渲染策略不是每一帧都必须渲染。对于极高帧率的流可以尝试在游戏线程做帧率同步丢弃一些中间帧只渲染最新的。使用纹理池避免频繁创建和销毁纹理。预先创建好固定尺寸的纹理池循环使用。问题音频有但画面是黑的。排查检查纹理创建InitializeTexture是否成功检查UTexture2D::CreateTransient的返回值。检查帧数据格式解码器输出的像素格式如YUV420P与纹理期望的格式如RGB是否匹配需要颜色空间转换。检查RHI更新RHIUpdateTexture2D调用后纹理资源是否被意外标记为易失或无效确保在渲染线程外没有对纹理RHI进行非法访问。调试可以在OnVideoFrameDecoded回调中将帧数据保存为.ppm或.bmp文件到磁盘用图片查看器确认解码数据是否正确。问题内存泄漏长时间运行后崩溃。排查检查Native对象生命周期C中new的对象是否在EndPlay或析构函数中被正确delete特别是FMillicastVideoReceiver和DecoderContext。检查UnrealCLR托管对象C#的AMillicastPlayerProxy是否被正确垃圾回收确保没有循环引用。在EndPlay中显式释放Native句柄。使用工具在开发配置下使用Visual Studio的内存分析工具或虚幻引擎自带的Memory Profiler来追踪泄漏点。5.3 平台兼容性考虑Windows重点测试DX11和DX12后端。硬件解码推荐使用D3D11 VideoAPI它与虚幻的RHI集成较好。macOS/iOS使用VideoToolbox框架进行硬件解码。纹理更新需要使用Metal RHI。Android使用MediaCodec进行硬件解码。注意GLES纹理的更新需要在正确的GL上下文中进行。Web/HTML5通过Emscripten编译这非常复杂。更可行的方案是在Web平台放弃此插件直接使用浏览器的Millicast JavaScript SDK和HTML5 Video元素通过虚幻引擎的Pixel Streaming或WebGL的某种桥接方式传递控制命令但这已超出单个插件的范畴。开发这样的插件是一个系统工程涉及网络、编解码、图形渲染、引擎框架和跨语言编程。它考验的是开发者对虚幻引擎底层机制和流媒体技术栈的深度融合理解。成功实现后它将为你的虚幻引擎项目打开一扇通往专业级、超低延迟实时视频应用的大门。

相关新闻

AI项目别让GPU全天候空转:用“热、温、冷”三层算力搭建解决方案

AI项目别让GPU全天候空转:用“热、温、冷”三层算力搭建解决方案

很多团队设计GPU方案时,会先选择一款显卡,然后让所有任务都在这台实例上运行。 模型推理使用GPU,数据清洗使用GPU,下载安装环境时GPU也在计费;白天业务有请求,夜间没有请求,实例仍然保持运行。…

2026/8/11 7:49:44 阅读更多 →
智慧无人机海洋海岸线语义分割数据集 U-Net模型 代码 用于无人机图像海岸线二值分割

智慧无人机海洋海岸线语义分割数据集 U-Net模型 代码 用于无人机图像海岸线二值分割

数据集文字描述: 智慧无人机海洋海岸线语义分割数据集 :用于无人机图像海岸线二值分割的数据集。 数量:230张图像 类别数量:2 类别类型:海岸线、其他 用途:目标检测、分类分割、多模态111📊 数据集总体信息…

2026/8/11 7:49:44 阅读更多 →
Redis事务与Lua脚本的原子性对比与实践

Redis事务与Lua脚本的原子性对比与实践

1. Redis事务的原子性真相 第一次接触Redis事务时,我和大多数人一样被"原子性"这个术语迷惑了。官方文档说Redis事务具有原子性,但实际测试后发现:当某个命令执行失败时,其他命令依然会继续执行。这和我们熟悉的数据库事…

2026/8/11 7:48:44 阅读更多 →

最新新闻

C++贪吃蛇实战:从控制台到图形界面的游戏开发入门指南

C++贪吃蛇实战:从控制台到图形界面的游戏开发入门指南

1. 项目概述:为什么选择C小游戏作为入门实践? 很多刚学完C基础语法的新手朋友,都会面临一个共同的困惑:书本上的例题都懂了,但感觉离“做出一个东西”还很遥远。指针、类、继承这些概念,单独看都明白&#…

2026/8/11 8:31:00 阅读更多 →
基于VC++6.0与OpenCV1.0的摄像机标定工具:原理、实现与工程实践

基于VC++6.0与OpenCV1.0的摄像机标定工具:原理、实现与工程实践

1. 项目概述与核心价值 最近在整理一些老项目的代码,翻出来一个十几年前用VC 6.0和OpenCV 1.0做的摄像机标定工具。现在看这个技术栈,估计很多年轻点的开发者会觉得有点“古董”了。但恰恰是这种“老古董”项目,最能体现计算机视觉领域一些基…

2026/8/11 8:31:00 阅读更多 →
贵州企业如何低成本实现AI搜索获客?GEO优化解决方案深度解析

贵州企业如何低成本实现AI搜索获客?GEO优化解决方案深度解析

你是否遇到过这样的场景:明明产品过硬,服务到位,但客户用豆包、Kimi、通义千问这类AI工具提问时,出现的总是竞争对手的名字,而你的企业仿佛隐形了一样?这不是个例。博昇AI在贵州一线调研中发现,…

2026/8/11 8:31:00 阅读更多 →
博克CAD实战:男衬衫领子参数化制版全流程解析

博克CAD实战:男衬衫领子参数化制版全流程解析

这次我们来看一个服装制版领域的专业工具——博克CAD。如果你从事服装设计、打版工作,或者对服装结构感兴趣,这个软件可能是你提升效率和精度的关键。它不是AI模型,而是一款专业的计算机辅助设计软件,尤其在男衬衫领子这类复杂结构…

2026/8/11 8:31:00 阅读更多 →
动态外开过渡训练:解决舞蹈姿态切换中的控制难题

动态外开过渡训练:解决舞蹈姿态切换中的控制难题

你有没有过这样的体验:在舞蹈课上,老师喊“外开”,你努力把脚转开,感觉还不错;下一秒老师要求回到平行脚位,再迅速切换回外开,身体却突然不听使唤,重心摇晃,核心松散&…

2026/8/11 8:31:00 阅读更多 →
【物业管理软件如何让投诉分级处理从“一刀切“变成“精准施策“】

【物业管理软件如何让投诉分级处理从“一刀切“变成“精准施策“】

物业管理软件如何让投诉分级处理从"一刀切"变成"精准施策"很多物业公司处理投诉的方式是"来一个处理一个"——不管业主投诉的是电梯困人还是绿化修剪,都是前台登记、口头派单、等处理完再说。结果是什么?紧急的事情没人优…

2026/8/11 8:29:59 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →