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

告别编译噩梦:在Windows 10/11上用VS2019/2022搞定PJSIP 2.11.1(含FFmpeg/SDL2/OpenH264)

告别编译噩梦:在Windows 10/11上用VS2019/2022搞定PJSIP 2.11.1(含FFmpeg/SDL2/OpenH264)

如果你正在Windows上尝试编译PJSIP,大概率已经经历过几次失败——依赖项缺失、配置错误、莫名其妙的链接问题,甚至编译通过后发现视频功能无法使用。这篇文章不会重复官方文档的步骤,而是聚焦那些真正导致编译失败的细节,以及如何一次性构建完整的音视频开发环境。

1. 环境准备:避开90%的常见错误

在开始之前,先确认你的系统满足以下条件:

  • Visual Studio版本:VS2019或VS2022(社区版即可)
  • Windows SDK:版本需与VS工具链匹配(推荐10.0.19041.0或更高)
  • 基础工具
    • Git for Windows(用于获取源码)
    • CMake(3.15+)
    • Python 3.x(部分脚本依赖)

注意:避免使用中文路径,所有工具和源码建议放在C:\dev这类简单路径下

1.1 依赖项精准安装

PJSIP的编译失败往往源于依赖项版本不匹配。以下是经过验证的组合:

依赖项推荐版本下载方式
FFmpeg4.4.1 (shared)官方预编译包
SDL22.0.18源码编译
OpenH2642.1.1Cisco官方GitHub仓库

关键操作

# 获取OpenH264(需科学上网环境) git clone https://github.com/cisco/openh264.git cd openh264 make -j8 make install

2. 源码配置:那些文档没告诉你的细节

2.1 config_site.h的黄金配置

pjlib/include/pj/下创建config_site.h,这是整个编译过程的核心。以下是支持完整音视频功能的最小配置:

// 视频支持(必须) #define PJMEDIA_HAS_VIDEO 1 #define PJMEDIA_HAS_OPENH264_CODEC 1 #define PJMEDIA_HAS_LIBYUV 1 // 设备支持 #define PJMEDIA_VIDEO_DEV_HAS_SDL 1 #define PJMEDIA_VIDEO_DEV_HAS_DSHOW 1 // FFmpeg集成 #define PJMEDIA_HAS_FFMPEG 1 #define PJMEDIA_FFMPEG_USE_SWSCALE 1 // 禁用测试项目(减少90%的编译错误) #define PJ_EXCLUDE_UA_TEST_MODULE 1

2.2 VS项目属性精调

在Visual Studio中打开pjproject-vs14.sln后,需要调整以下关键设置:

  1. 平台工具集

    • 所有项目统一为"Visual Studio 2019 (v142)"或"Visual Studio 2022 (v143)"
  2. 运行时库

    • 改为/MD(与FFmpeg动态库匹配)
  3. 附加包含目录

    C:\dev\ffmpeg\include C:\dev\SDL2\include C:\dev\openh264\include
  4. 附加库目录

    C:\dev\ffmpeg\lib C:\dev\SDL2\lib\x64 C:\dev\openh264\lib

3. 编译实战:从报错到成功的完整路径

3.1 处理顽固性链接错误

即使配置正确,仍可能遇到以下典型错误:

  • LNK2001: unresolved external symbol: 通常是因为FFmpeg库版本不匹配。解决方案:

    # 删除旧版本,重新下载release-shared版本 Remove-Item -Recurse -Force C:\dev\ffmpeg curl -o ffmpeg.zip https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-lgpl-shared.zip Expand-Archive ffmpeg.zip -DestinationPath C:\dev\ffmpeg
  • SDL2_main.lib缺失: 这是因为SDL2需要手动编译:

    cmake -S . -B build -DCMAKE_INSTALL_PREFIX=C:\dev\SDL2 cmake --build build --config Release --target install

3.2 测试项目处理技巧

默认解决方案包含的pjsystest等测试项目经常报错,两种处理方式:

  1. 彻底移除(推荐):

    • 右键解决方案 → 卸载项目
  2. 快速修复

    • 为测试项目单独添加opensslportaudio的库引用

4. 音视频功能验证:不只是能编译

4.1 基础通话测试

编译完成后,在pjsip-apps\bin目录下运行:

# 启动基础SIP客户端 pjsua-x86_64-vc14-Debug.exe

基本命令测试:

# 注册到SIP服务器 register sip:example.com # 拨打测试电话 call sip:100@example.com

4.2 视频功能深度验证

确保视频流正常工作需要额外配置:

# 在pjsua中启用视频 vid enable set vid autotx on set vid autorx on # 发起视频呼叫 call sip:100@example.com

常见视频问题排查

  1. 黑屏无画面

    • 检查config_site.h中的PJMEDIA_VIDEO_DEV_HAS_DSHOW
    • 确认OpenH264动态库(openh264-2.1.1-win64.dll)在PATH中
  2. 高CPU占用

    • pjsua中调整视频分辨率:
      set vid txsize 640x480 set vid rxsize 640x480
  3. 延迟明显

    • 关闭QoS设置:
      set qos none

5. 进阶技巧:打造生产级开发环境

5.1 自定义编解码器优先级

修改pjmedia/src/pjmedia-codec/ffmpeg_vid_codecs.c,调整编码器选择顺序:

static const enum AVCodecID ffmpeg_codecs[] = { AV_CODEC_ID_H264, // 优先使用H264 AV_CODEC_ID_VP8, AV_CODEC_ID_VP9, AV_CODEC_ID_NONE };

5.2 性能优化参数

pjsua启动时添加以下参数可显著提升性能:

--thread-count=4 --clock-rate=48000 --snd-clock-rate=48000 --ec-tail=200

5.3 与MicroSip集成

若基于MicroSip开发,需要特别注意:

  1. 库版本一致性

    • MicroSip使用的PJSIP版本必须与你编译的完全一致
  2. 注册回调函数

    pjsua_callback cb; memset(&cb, 0, sizeof(cb)); cb.on_call_state = &on_call_state; cb.on_call_media_state = &on_call_media_state; pjsua_register_callbacks(&cb);
  3. 视频窗口集成

    pjsua_vid_win_id wid; pjsua_vid_win_create(0, PJMEDIA_VID_DEV_CAP_FORMAT, &wid);

经过这些步骤,你应该已经获得了一个功能完整的PJSIP开发环境。比起盲目跟随官方文档,理解每个配置项背后的实际影响才是避免反复折腾的关键。如果在具体项目中遇到特殊问题,可以尝试调整视频缓冲参数或启用更详细的日志:

pjsua-x86_64-vc14-Debug.exe --log-level=5
http://www.jsqmd.com/news/676969/

相关文章:

  • 2026年变频串联谐振耐压试验装置厂家推荐:变频串联谐振装置/串联谐振耐压装置专业供应 - 品牌推荐官
  • 不止是共享:我把Chfs改造成了团队的简易软件制品库和文档中心
  • 告别Visio!用Python+D3.js自动绘制你的网络拓扑图(附完整代码)
  • 3分钟掌握Postman便携版:Windows免安装API测试终极指南
  • 别急着甩锅给网络!手把手教你用tcpdump和netstat定位curl的(56) Recv failure报错
  • 盘点2026年隔音门定制厂家,龙电特种门窗服务完善 - myqiye
  • Fluke 8060A数字万用表LCD屏幕定制与替换方案
  • 2026年生产ERP+MES系统开发商深度测评:如何为制造企业匹配最佳方案? - 速递信息
  • 为什么BERT/GPT都爱用Transformer?详解Self-Attention的并行计算优势与位置编码玄机
  • extract-text-webpack-plugin实战技巧:10个常见问题与解决方案
  • nli-MiniLM2-L6-H768效果展示:短文本(<10字)与长文本(>500字)精度对比
  • IC学习党必备:手把手教你配置EDA虚拟机中的工艺库(以SMIC18和TSMC180为例)
  • 终极指南:如何使用tiny11builder打造轻量级Windows 11虚拟机镜像
  • PixelXpert安全与兼容性:如何避免系统冲突和确保稳定运行
  • 用手机热点和网络调试助手,5分钟搞定ESP8266模块的首次联网测试(附AT指令清单)
  • FastLED LED动画库终极指南:从零开始快速上手Arduino灯光控制
  • 2026年PMP报考条件是什么?学历经验要求 - 众智商学院官方
  • BiliDownloader深度解析:如何用这款开源工具实现B站视频批量高速下载?
  • enen项目部署完全手册:从零搭建京东自动化环境
  • 避坑指南:Smart3D照片建模从导入到生成的5个关键设置(CC 10.16版)
  • TrafficMonitor插件大全:打造你的终极桌面监控中心
  • 别再手动敲晶格了!用Atomsk+LAMMPS搞定石墨烯、纳米管建模(附完整命令)
  • 如何高效使用Obsidian Better Export PDF插件:5个专业秘诀打造完美文档
  • (官方通告)2026年4月百达翡丽官方维修服务中心全国实地考察全记录 - 速递信息
  • APK Installer:如何在Windows上实现Android应用的无缝安装?
  • 如何彻底解决Windows窗口尺寸锁定问题:WindowResizer终极窗口管理工具使用指南
  • 自动化测试工程师缺口扩大3倍:从业者的挑战、机遇与18个月黄金窗口期应对策略
  • 2026全国LED显示屏生产商排行榜 五大实力品牌推荐,全场景选型指南 - 深度智识库
  • 告别理论!用Minitab实战拆解CPK与PPK:从公式差异到实际生产报告解读
  • VSCode settings.json配置同步与备份全攻略:换电脑再也不怕重头配置