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

张开发
2026/4/21 14:20:23 15 分钟阅读

分享文章

告别编译噩梦:在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用于获取源码CMake3.15Python 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 install2. 源码配置那些文档没告诉你的细节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 12.2 VS项目属性精调在Visual Studio中打开pjproject-vs14.sln后需要调整以下关键设置平台工具集所有项目统一为Visual Studio 2019 (v142)或Visual Studio 2022 (v143)运行时库改为/MD与FFmpeg动态库匹配附加包含目录C:\dev\ffmpeg\include C:\dev\SDL2\include C:\dev\openh264\include附加库目录C:\dev\ffmpeg\lib C:\dev\SDL2\lib\x64 C:\dev\openh264\lib3. 编译实战从报错到成功的完整路径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\ffmpegSDL2_main.lib缺失 这是因为SDL2需要手动编译cmake -S . -B build -DCMAKE_INSTALL_PREFIXC:\dev\SDL2 cmake --build build --config Release --target install3.2 测试项目处理技巧默认解决方案包含的pjsystest等测试项目经常报错两种处理方式彻底移除推荐右键解决方案 → 卸载项目快速修复为测试项目单独添加openssl和portaudio的库引用4. 音视频功能验证不只是能编译4.1 基础通话测试编译完成后在pjsip-apps\bin目录下运行# 启动基础SIP客户端 pjsua-x86_64-vc14-Debug.exe基本命令测试# 注册到SIP服务器 register sip:example.com # 拨打测试电话 call sip:100example.com4.2 视频功能深度验证确保视频流正常工作需要额外配置# 在pjsua中启用视频 vid enable set vid autotx on set vid autorx on # 发起视频呼叫 call sip:100example.com常见视频问题排查黑屏无画面检查config_site.h中的PJMEDIA_VIDEO_DEV_HAS_DSHOW确认OpenH264动态库openh264-2.1.1-win64.dll在PATH中高CPU占用在pjsua中调整视频分辨率set vid txsize 640x480 set vid rxsize 640x480延迟明显关闭QoS设置set qos none5. 进阶技巧打造生产级开发环境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-count4 --clock-rate48000 --snd-clock-rate48000 --ec-tail2005.3 与MicroSip集成若基于MicroSip开发需要特别注意库版本一致性MicroSip使用的PJSIP版本必须与你编译的完全一致注册回调函数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);视频窗口集成pjsua_vid_win_id wid; pjsua_vid_win_create(0, PJMEDIA_VID_DEV_CAP_FORMAT, wid);经过这些步骤你应该已经获得了一个功能完整的PJSIP开发环境。比起盲目跟随官方文档理解每个配置项背后的实际影响才是避免反复折腾的关键。如果在具体项目中遇到特殊问题可以尝试调整视频缓冲参数或启用更详细的日志pjsua-x86_64-vc14-Debug.exe --log-level5

更多文章