ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RVMedia源码修复版在Delphi 12.3 Win64下的编译与摄像头预览实践

RVMedia源码修复版在Delphi 12.3 Win64下的编译与摄像头预览实践 简介RVMedia v9.3 完整源码修复版是一套面向 Delphi、CBuilder 与 Lazarus 开发者的视频音频流组件专门用于在 Delphi 12.3 64 位环境下快速集成摄像头接入、画面预览、语音对讲、云端推流、本地录制及云台控制等功能。该版本修复了原有组件在 Delphi 12.3 下的编译问题补充了 BPL 工程文件安装后即可正常编译与调试。压缩包共包含 1896 个文件大小约 108.07MB其中以 Pascal 源文件、头文件、资源文件、工程文件、窗体定义和包文件为主并附有完整示例、帮助文档与动态链接库目录结构层次分明。该资源内含基于 FFmpeg 的 libav 系列库文件可支撑音视频解码、编码与推流等底层处理配合组件自带的多格式支持能力能有效缩短多媒体应用开发周期。目前已有 128 人学习下载适合需要搭建视频会议、监控客户端或远程教学系统的中高级开发者。借助这套修复版源码可避免自行修补组件的繁琐过程直接获得可运行的开发环境并参考示例代码与开发文档快速完成项目落地。1. RVMedia 源码修复版为什么拿到的是 .7z 而不是安装 exe拿到 RVMedia Components v9.3 FS Delphi 12.3 64bit 完整源码修复版.7z 时很多人的第一反应是去找 setup.exe可解压出来是一堆 .pas、.dpk 和 Demo 工程心里多少有点没底。实际上这种「源码修复版」比安装版更适合干活安装版把 DCU、BPL 打成黑匣子出了 64 位编译错误你连改的机会都没有源码版至少能让你打开单元看问题出在哪儿甚至自己动手补一行条件编译。它解决的是 RVMedia 在 Delphi 12.3、64 位 Windows 下从编译到预览播放的这一串实际问题适合要接摄像头、做视频预览、把老工程迁到 Win64 的 Delphi 开发者。FS 一般就是 Full Source 的意思你把它理解成「带全部源码的完整包」就行。2. 拆包与编译让完整源码在 Delphi 12.3 Win64 下跑起来2.1 解压后的目录结构Source、Packages、Demos 和第三方依赖先分清解压这个 7z 包我不建议用系统自带的压缩文件夹功能文件多了容易中断而且包里文件路径较长用 7-Zip 更稳。我一般把输出目录固定成一个不带空格的路径比如C:\RVMedia。这一步看着基础但包工程时路径里带空格后面 msbuild 拼接变量很容易翻车。7z x RVMedia_Components_v9.3_FS_Delphi_12.3_64bit_完整源码修复版.7z -oC:\RVMedia -y参数说明x是解压到指定目录保目录结构-o后面紧跟输出路径不需要加空格-y表示遇到同名文件自动覆盖适合重复解压。解压完成后先别急着打开 IDE打开C:\RVMedia看一眼一级目录。完整源码修复版只要没有被二次打包改乱通常会是下面这个结构目录内容第一优先级Source核心单元 .pas、.dfm、.inc全部保留后续加 Library 路径靠它Packages各版本 Delphi 的 .dpk、.dproj找带 120 标识的工程文件Demos示例工程是冒烟测试模板编译通过后立即跑它Docs帮助文档、ReadMe、历史更新说明选看出问题再翻修复版和原始版最大的区别通常在 Source 目录里会多出几个带Win64或Fix字样的单元/补丁文件或者现有 .inc 里多了 64 位条件编译分支。这一步我建议用文件搜索看一眼比如*.inc文件里搜WIN64能大概知道作者修过哪些地方。不要上来就双击 .dpk先知道包依赖了什么东西后面报错才不慌。2.2 编译运行期包与安装设计期包先 Build 后 InstallRVMedia 是分「运行期包」和「设计期包」的。运行期包编译成 .bpl给你的业务工程引用设计期包负责把组件图标注册到 IDE 面板上。顺序反了设计期包安装时就会报找不到运行期包。我在多个群里看到有人直接把 Design 包先 Install结果 IDE 启动直接弹错误对话框这就是没分清主次。我常用的命令行方式是打开 Delphi 的rsvars.bat设置好环境变量再用 msbuild 编运行期包set BDS%ProgramFiles(x86)%\Embarcadero\Studio\29.0 call %BDS%\bin\rsvars.bat msbuild Packages\RVMedia_120.dproj /t:Build /p:ConfigRelease /p:PlatformWin64这里的29.0是 Delphi 12 对应 RAD Studio 的安装目录版本号如果你装的位置不是默认路径改成自己机器上的实际目录。/t:Build表示执行编译/p:ConfigRelease选用 Release 配置/p:PlatformWin64指定 64 位平台这是整个命令行里最关键的一项。如果 msbuild 报找不到工程就先去Packages目录确认 .dproj 的实际名称我示例里的RVMedia_120.dproj是一种常见命名但最终以你解压到的文件名为准。编译运行期包成功后再打开设计期包。设计期包文件名通常带 Design 字样比如RVMediaDesign_120.dproj。在 IDE 里打开这个工程Project Manager 上右键选 Install。装完组件面板会多出一页 RVMedia 的标签。没有这一步你的 Form 上放不了任何 RVMedia 控件。这里我开始也犯过一个错用命令行的msbuild /t:Install去安装设计期包结果时灵时不灵。后来就不折腾了设计期包的安装固定用 IDE 右键 Install。命令行只用来编运行期包效率和可靠性都够。2.3 最容易漏掉的 Library 路径让 IDE 找到 DCU 和 BPL编译通过不等于你的业务工程就能用了。很多人在新工程里写uses RVMedia;时弹出 Unit not found: RVMedia不是刚才没编译而是 IDE 的 Library 路径里没有 Source 目录。源码包不像安装版会自动配路径这一步必须手动加。打开 IDE 菜单 Tools Options Language Delphi Library在 Library Path 里追加C:\RVMedia\Source;C:\RVMedia\Source\Packages;这里每个路径用分号分隔。要点是路径指向放 .pas/.dcu 的目录不是包工程目录。加完最好点一下旁边的 Browse 逐个确认存在省得打错字母。如果你同时要编 32 位还要切到 Win32 平台再把同样的路径加一遍因为 Delphi 12.3 对 32/64 位平台分别维护 Library 路径。我自己的习惯是把输出目录也一并固定成C:\RVMedia\Source\Win64这样每次在工程里查 .dcu 是否存在非常直观。若你希望编译产物统一管理在 dproj 里把 DCC_DcuOutput 改成固定路径即可不改也行默认会落在包工程目录下只是 32/64 位混着放容易看花眼。3. 组件选型与最小可用代码TRVCamera、TRVMediaPlayer 怎么接进界面3.1 TRVCamera 摄像头预览从 StartPreview 到 OnFrame 回调RVMedia 不是一个单一控件而是一组「视频/音频采集与播放」控件的集合。其中 TRVCamera 是大家用得最多的一个负责摄像头画面预览。它内部封装了设备枚举、视频格式协商和帧回调这些能力都暴露成属性/事件不需要你自己写 DirectShow。把控件拖到 Form 上后最小可用代码就这么几行。procedure TForm1.btnPreviewClick(Sender: TObject); begin RVCamera1.CameraIndex : 0; // 使用系统枚举到的第一个摄像头 RVCamera1.VideoWindow : Panel1; // 预览画面输出到 Panel1 RVCamera1.PreviewMode : True; // 处于预览模式 RVCamera1.StartPreview; // 开始采集 end;逻辑说明CameraIndex从 0 开始表示按系统设备枚举顺序选摄像头0 通常是指向最常用的那个VideoWindow指定预览画面渲染到哪个窗口控件放 TPanel 最省事直接填Self也可以但画面会铺满整个窗口StartPreview打开设备并启动预览设备被占用时这里会抛异常实际项目里要用 try/except 包住至少给出一个「摄像头被占用」的提示。停止预览更简单调用StopPreview即可释放设备资源。老代码里常见的问题是在FormDestroy里忘了停导致摄像头指示灯一直亮、别的程序也拿不到设备。建议在FormClose里无论是否预览都执行一次StopPreview因为重复停止是安全的。分辨率、帧率这类参数一般通过VideoFormat或摄像头设置属性来调不同驱动支持的格式表不一样先用默认值跑通再往高了调一次拉 4K 很容易把老 USB 摄像头卡死。3.2 TRVMediaPlayer 与 TRVWebPlayer本地文件和网络媒体的接法TRVMediaPlayer 负责播放本地视频文件基本用法和普通媒体播放控件类似设置文件路径后调用 Play。它封装的是 DirectShow 链路所以「能不能播放」这件事一半在组件另一半在你系统里有没有对应解码器。RVMediaPlayer1.FileName : D:\Videos\sample.mp4; RVMediaPlayer1.Play;逻辑说明FileName接受完整路径播放器会自动打开文件、创建渲染器、开始播放。对一个不常见格式如果播放到一半停住或只有声音没有画面优先怀疑系统解码器而不是 RVMedia。Win10/11 自带 H.264 解码但老式 WMV、AVI 里的某些编码格式可能缺少解码器装上 K-Lite 这类解码包再试多数能解决。TRVWebPlayer 则是面向网络媒体源的控件适合播放网页里嵌的视频或 HTTP/RTSP 流。它的使用思路是把 URL 交给内部浏览器渲染内核而不是像 TRVMediaPlayer 那样做本地文件解码。想播 RTSP 摄像头流时我见过有人硬把rtsp://地址塞给 TRVMediaPlayer结果毫无反应务实做法是先用 TRVWebPlayer 或走 FFmpeg 绕一层效率更高。源码包 Demos 里一般都有相关示例建议直接打开找对应工程比自己试快得多。3.3 录像、抓拍与多路预览这些能力在源码里怎么找录像和抓拍是 RVMedia 的另一块重要功能但它在源码里的入口不像 StartPreview 那么明显。抓拍最稳的方式是走 OnFrame 回调因为每一帧到达时你都能拿到实时画面。下面这段代码不依赖具体抓拍 API只做帧计数用于验证回调是否真的在跑。procedure TForm1.RVCamera1Frame(Sender: TObject); begin Inc(FFrameCount); // 每来一帧加一 if FFrameCount mod 150 0 then // 约 3 秒刷新一次避免每帧刷新界面 Caption : Format(frames: %d, [FFrameCount]); end;逻辑说明OnFrame在采集线程中高频触发做耗时操作会把回调线程堵死导致画面卡顿甚至黑屏。所以这里只做了整数累加并每 150 帧才更新一次窗口标题大约按 50fps 计算就是每 3 秒刷新一下。如果你想在这个事件里保存图片正确姿势是把帧数据复制到自己分配的内存/位图再丢给后台线程去写磁盘直接在回调里SaveToFile很多机器上会出现一卡一顿的情况。多路预览的思路也类似一个 TRVCamera 只能绑一路设备要显示四路摄像头就放四个 TRVCamera分别设置CameraIndex和不同的VideoWindow。多路同时预览对 USB 带宽和 CPU 压力很大分辨率调低一档往往就能从 15fps 拉回 30fps。这些经验 Svn 上有很多人分享实际踩过一遍就明白。4. 从 32 位迁到 64 位修复版源码里那几处关键差异4.1 Win64 平台的编译开关条件编译指令与项目平台选择Delphi 从 10.x 开始对 64 位支持已经很成熟但第三方控件的源码不一定跟上。RVMedia 老版本在 32 位下好好的切到 Win64 就报编译错最常见的原因就是源码里用了内联汇编而 Delphi 的 64 位编译器不支持 asm。修复版源码做的事就是把这些差异用条件编译挡住。{$IFDEF WIN64} {$DEFINE RVMedia_USE_64BIT} {$ENDIF} {$IFDEF RVMedia_USE_64BIT} // 64 位专用实现指针、句柄、字符串转换 {$ELSE} // 32 位兼容路径 {$ENDIF}逻辑说明WIN64是 Delphi 预定义的条件编译符号只要当前目标平台是 64 位 Windows它就会自动定义。上面代码先判断是否 64 位再自定义一个RVMedia_USE_64BIT宏后面具体实现就可以按宏来分流。你在源码里搜索WIN64看到密集的IFDEF WIN64分支就说明这个包已经做过 64 位适配搜不到就得自己补。另一个重点是 64 位下指针长度从 4 变成 8所有Pointer、THandle、WPARAM类型都不能再用LongInt去强转。Win32 时代很多人习惯写Integer(Ptr)在 64 位下这个强转会把高位截掉运行时直接访问冲突。正确做法是用NativeInt或NativeUInt保存指针值。修复版源码里如果有一批NativeInt出现基本就是为此做的调整。4.2 修复版源码改了哪些地方从 DCU 报错反推我们可以从常见报错反推修复版到底修了什么。下面这个表格是我把新旧版本的典型表现放在一起方便你对照老源码在 Win64 下的表现修复版源码的处理编译到某个单元报asm指令不支持把汇编段包进IFNDEF WIN64或整体改写为 Pascal摄像头回调里字符串参数乱码回调签名从PChar换成PAnsiChar再做编码转换音频设备句柄编译不过统一用THandle并加 64 位分支64 位下缺少某个 .dcu 单元补对应的 .pas 源文件并把输出路径理顺这些改动你很难从 README 里全部看到更多是编译时一个个试出来的修复版作者的血泪经验。比如PChar这个问题32 位下String和PChar转换还算宽容64 位下调用约定变了回调里一旦出现UnicodeString与PChar混用轻则乱码重则栈不平衡。修复版一般会把这类参数收敛成固定的PAnsiChar因为摄像头驱动回调的数据大多是 ANSI/OEM 编码用 UnicodeString 直接对接才容易坏。另外还要留意 Delphi 12.3 自己的 Unicode 行为变化。修复版若是从老版本 XE 系列一路改上来的往往会在源码里看到TEncoding.UTF8这类显式转换这说明作者已经被字符串编码坑过一轮了。你在自己的业务工程里引组件时不要再去封装一层 String 拼接直接按组件暴露的参数来能少踩不少坑。4.3 验证 64 位产物看输出目录比看报错更可靠编译报错消失不算完事还要确认你跑出来的确实是 64 位产物。IDE 的 Project Manager 里如果Target Platform显示的是64-bit Windows那么编译产物理应也构建成 64 位。但我习惯再验证一下 DCU 输出目录防止 IDE 缓存了旧的 32 位结果。dir /b C:\RVMedia\Source\Win64\*.dcu逻辑说明这个命令列出Win64目录下的所有 DCU 文件只要你能看到 RVMedia 相关单元且时间戳是刚才编译那一刻就说明产物落到了 64 位输出目录。如果目录是空的或时间戳没变多半是 dproj 里把输出路径写错或者 IDE 没有真正执行 Win64 编译回到 2.2 步重新确认平台参数。业务工程里同样检查一下Output目录有 Win64 子目录基本就没问题了。这一步比看编译日志还靠谱因为 msbuild 多次执行时可能走了缓存日志全绿但实际用的还是旧 DCU。我见过有人在 64 位工程里引到 32 位 DCU编译不报错一运行启动就报模块加载失败查了半天才发现在 Library Path 里先匹配到了 32 位目录。所以「看输出目录」这个习惯很值得保留。5. 避坑RVMedia 源码编译与运行最常见的五个翻车点5.1 编译期翻车DPK 加载失败、BPL 找不到、asm 冲突坑1打开RVMedia_120.dproj编译到一半中断报F2613或找不到某个 DCU 单元。现象工程文件能打开但 Build 时提示缺少基础单元文件编译器直接停止。原因RVMedia 依赖 TRichView 基础运行期包你没有先编译或安装那个底层包IDE 的 Library Path 里找不到依赖单元。解决先把 TRichView 相关的运行期包编译安装再把其 Source 目录加入当前平台的 Library Path然后回来编 RVMedia 就能继续。顺序不要颠倒否则还会报同样错误。坑2Win64 下编译报asm相关错误比如 instruction not supported。现象错误行号定位到某个 .pas 文件里的asm ... end;块32 位平台正常切到 64 位就挂。原因Delphi 64 位编译器不支持内联汇编。解决优先确认修复版是否已用{$IFNDEF WIN64}把汇编块包住如果还没有自己动手把这一段替换成 Pascal 写法或者看它是不是只做简单字节拷贝可以用Move替代。改完后要全量重新编译避免旧 .dcu 混进来。坑3设计期包安装成功重启 IDE 后报cannot load package ...提示找不到某个 BPL。现象组件面板刚装上时能用重启后就弹错误IDE 加载设计期包失败。原因运行期 BPL 文件没有被 IDE 找到按 Windows 的 DLL 搜索顺序IDE 去系统路径里找没找到就放弃加载。解决把包含RVMedia_120.bpl的目录加入 Windows 的PATH环境变量或把 BPL 复制到 Delphi 安装目录的bin下更推荐在 IDE 里用 Tools Options 配置 BPL 搜索路径这样只影响 IDE不污染系统。5.2 运行期翻车黑屏、访问冲突、回调卡顿坑4StartPreview 没有报错但预览画面黑屏换 Win32 编译同样的代码却正常。现象64 位编译运行都不报异常摄像头指示灯也亮了但 VideoWindow 上始终是黑屏。原因很多老摄像头驱动提供的 DirectShow 滤镜只支持 32 位进程64 位应用拿不到视频帧数据。解决换一个驱动较新、支持 64 位的 UVC 摄像头或者检查设备管理器的驱动版本更新到 64 位驱动再试。这个坑跟组件关系不大但最容易让人误判是 RVMedia 的 bug。坑5预览正常OnFrame 回调里做图像处理时偶发 Access Violation32 位下从未出现。现象程序不固定崩溃崩溃栈指向 RVCamera 的帧回调内部。原因64 位调用约定更严格回调里如果直接用了TStringList、动态数组或界面对象可能出现线程访问冲突或参数声明不匹配。解决OnFrame 里只做快速复制把帧数据拷贝到预先分配的内存块再通过线程安全队列交给工作线程处理不要在回调里创建对象、弹窗、写文件。如果组件回调签名和你的事件声明不匹配回到 4.2 检查 PChar/PAnsiChar 是否被修复版改过。这五个坑基本覆盖了源码包从安装在 IDE 到 64 位运行的全链路。前三个是环境问题后两个是代码习惯问题。只要按顺序排查大多数情况下不用去翻源码先改环境和调用方式已经能解决至少八成。6. 验证安装是否成功三个信号和一次全流程冒烟测试6.1 三个肉眼可见的信号装完这个修复版我会用三个信号判断它是否真正生效组件面板出现 RVMedia 页签Demos 里的 64 位工程能编译通过摄像头预览后 OnFrame 计数持续增长。前两个只能证明编译链路通第三个才证明采集链路真正跑通了。很多人在第一个信号就停了结果业务工程一运行发现根本没画面。6.2 冒烟测试从预览到停止的最小流程每次装完源码包我会在 Demo 里放一个按钮执行下面这段代码。它不处理业务逻辑只验证「打开设备、取帧、停设备」这条最核心链路是否稳定。procedure TForm1.btnSmokeClick(Sender: TObject); var I: Integer; begin RVCamera1.CameraIndex : 0; RVCamera1.VideoWindow : Panel1; RVCamera1.StartPreview; for I : 1 to 10 do begin Sleep(100); // 等 10 帧给设备初始化留时间 Application.ProcessMessages; // 派发预览绘制消息 end; RVCamera1.StopPreview; ShowMessage(smoke ok); end;逻辑说明Sleep(100)是刻意让出时间给摄像头初始化新插上的 USB 摄像头在 StartPreview 后前几百毫秒可能不出帧立刻停会误报失败ProcessMessages让窗口消息正常处理否则画面永远不会绘制。这段代码只适合装包后的自检正式项目里在主线程 Sleep 加 ProcessMessages 是反面教材会让界面失去响应还容易造成消息重入。从那以后我每次装这类源码包都强制先跑一遍全流程冒烟测试确认设备能出帧再动手迁移自己的业务代码省下了大量排查时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表