如何在无摄像头和显示器下运行pjsua:文件发流与收流录制
解决方案
一、接收视频录制到文件
命令行方式
直接用pjsua内置的录制参数即可实现:
- 添加
--record-video=<output_file>参数,指定输出的AVI文件路径,pjsua会自动把接收到的视频流写入该文件。 - 注意:编译pjsua时要开启
PJMEDIA_HAS_VIDEO_RECORD=1编译选项,否则该功能无法使用。
自定义开发方式
如果是基于pjsua API做二次开发:
- 初始化视频设备后,调用
pjmedia_vid_dev_set_rec_file()函数,传入视频设备句柄、输出文件路径和格式参数,就能启用录制功能。 - 要是需要更灵活的控制,也可以在视频帧回调里自行处理帧数据并写入文件,但这种方式复杂度高,优先推荐用内置的录制功能。
二、禁用摄像头与显示设备(实现null-video功能)
没错,你需要像null-audio那样用null视频设备替代真实的摄像头和显示组件,具体分两种场景实现:
命令行方式
通过参数直接指定null设备:
- 用
--vid-src=null强制视频输入采用null设备,避免调用真实摄像头。 - 用
--vid-render=null指定视频渲染采用null设备,不会创建任何显示窗口。 - 如果命令行参数不生效,可以修改pjsua配置文件
pjsua.cfg,在[video]段中添加:vid_src = null vid_render = null
自定义开发方式
需要手动注册并使用null视频设备:
- 初始化pjsua前,调用
pjmedia_null_vid_dev_init()注册null视频设备驱动(编译时要开启PJMEDIA_HAS_NULL_VIDEO_DEV=1)。 - 枚举视频设备,找到名称为"Null Video Device"的设备ID,分别设为视频输入和输出设备ID。
- 在
pjsua_vid_config配置结构体中,把auto_show设为PJ_FALSE,禁止自动弹出显示窗口。
三、完整命令行示例
结合你已掌握的视频发送参数,完整命令如下:
pjsua --play-avi=input.avi --record-video=output.avi --vid-src=null --vid-render=null
四、开发参考
自定义开发时,可参考pjsip的核心文件:
pjmedia/include/pjmedia/null_vid_dev.h:null视频设备的初始化与使用接口说明。pjmedia/include/pjmedia/vid_dev.h:视频设备录制相关函数(如pjmedia_vid_dev_set_rec_file())的定义。pjsip/include/pjsua-lib/pjsua_vid.h:pjsua视频配置结构体pjsua_vid_config的详细说明。
内容的提问来源于stack exchange,提问作者Sanjib Pradhan
相关产品推荐
相关产品推荐

