You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派3运行PJSUA停止视频流时触发段错误问题求助

解决Raspberry Pi上PJSIP挂断时Segmentation Fault的问题

我之前在树莓派3B的Stretch Lite环境下折腾PJSIP视频通话时,也碰到过几乎一模一样的挂断段错误问题——通话音视频都正常,就是一挂就崩。结合你的场景,给你几个实战过的排查和修复方向:

1. 优先排查V4L2摄像头资源的释放逻辑

挂断时崩溃大概率是摄像头设备资源没有被正确释放,尤其是Pi Camera这种需要通过V4L2驱动映射的设备。

  • 先确认编译PJSIP时的配置:检查config_site.h里是否开启了#define PJMEDIA_HAS_VIDEO4LINUX2 1,并且编译时确实链接了系统的V4L2库(可以用ldd pjsua查看是否有libv4l2.so)。
  • 手动在挂断回调里强制释放视频资源:在PJSUA的on_call_state回调函数中,当通话状态变为PJSIP_INV_STATE_DISCONNECTED时,主动调用pjmedia_vid_dev_stop()pjmedia_vid_dev_close(),确保摄像头设备被正确关闭后再结束通话。

2. 检查OpenH264的兼容性与编译参数

PJSIP 2.7.1对OpenH264的版本兼容性要求比较严格,如果你的OpenH264版本太新,很容易出现释放时的段错误:

  • 建议降级到OpenH264 1.7.x系列版本(这是PJSIP 2.7.1官方推荐的匹配版本),重新编译时要加上ARM架构优化参数:
    ./configure --prefix=/usr --enable-static --disable-shared --arch=arm
    make && sudo make install
    
  • 编译PJSIP时要确保正确指定OpenH264的路径,比如在./configure时加上--with-openh264=/usr

3. 适配SDL2的无UI环境

因为你用的是Lite版系统(无X11),SDL2默认的图形后端可能在资源释放时出问题:

  • 重新编译SDL2时,关闭不需要的图形组件,强制用V4L2作为视频后端:
    ./configure --prefix=/usr --disable-video-x11 --enable-video-v4l2 --disable-audio --disable-input
    make && sudo make install
    
  • 运行PJSUA前设置SDL的环境变量,让它在无UI环境下正常工作:
    export SDL_VIDEODRIVER=dummy
    ./pjsua
    
    或者用fbcon作为后端(如果你的树莓派启用了帧缓冲):export SDL_VIDEODRIVER=fbcon

4. 用gdb精准定位崩溃点

你提到有gdb调试片段,建议用以下步骤深挖具体崩溃位置:

  1. 启动gdb:gdb ./pjsua
  2. 运行程序:run
  3. 完成通话挂断,触发段错误后,输入bt查看调用栈,找到崩溃的具体函数。
    比如如果崩溃在WelsDestroyDecoder(),那就是OpenH264解码器实例重复释放的问题;如果在pjmedia_v4l2_dev_close(),就是V4L2设备的资源释放逻辑有bug。

5. 尝试升级PJSIP版本或应用补丁

PJSIP 2.7.1是比较旧的版本(2018年的),针对树莓派ARM架构的视频资源释放有已知的bug。你可以:

  • 升级到PJSIP 2.10.x或更高的稳定版本,新版本对ARM和V4L2的支持更完善。
  • 去PJSIP的官方代码仓库查找相关的补丁,比如搜索“raspberry pi segmentation fault hangup”,找到对应提交后手动补丁到你的2.7.1版本上。

内容的提问来源于stack exchange,提问作者zuchie

火山引擎 最新活动