应用程序在使用 PJSIP 连续暂停和启动视频流时崩溃
App is getting crash on continuous pausing and starting video stream using PJSIP
如果我在进行视频通话时连续暂停和开始,我的应用程序会崩溃我使用了以下代码来暂停和恢复视频流。
PJSIP 版本:2.9
func pauseVideo(_ value: Bool) {
guard let id = SIPAccount.account?.calls.last?.call_id else { return }
let operation = value ? PJSUA_CALL_VID_STRM_STOP_TRANSMIT : PJSUA_CALL_VID_STRM_START_TRANSMIT
var param = pjsua_call_vid_strm_op_param()
pjsua_call_vid_strm_op_param_default(¶m)
param.med_idx = pjsua_call_get_vid_stream_idx(pjsua_call_id(id))
param.dir = value ? PJMEDIA_DIR_NONE : PJMEDIA_DIR_ENCODING_DECODING
pjsua_call_set_vid_strm(pjsua_call_id(id), operation, ¶m)
}
日志:
PJSIP_log: in pauseVideo
pjsua_vid.c Call 0: set video stream, op=5
vid_conf.c .Updating render state for port id 2 (1 sources)..
vid_conf.c .Created render state for connection 3->2
vid_conf.c .src#0=BGRA/352x288->352x264@0,12 dst=320x240@0,0
vid_conf.c .Port 3 (Front Camera) transmitting to port 2 (vstenc0x12c093028)
vstenc0x12c093028 .Encoder stream resumed
PJSIP_log: video pause status 0
vstenc0x12c093028 !Forcing encoder to generate keyframe
PJSIP_log: in pauseVideo
pjsua_vid.c !Call 0: set video stream, op=6
vstenc0x12c093028 .Encoder stream paused
vid_conf.c .Cleaned up render state for connection 3->2
vid_conf.c .Port 3 (Front Camera) stop transmitting to port 2 (vstenc0x12c093028)
PJSIP_log: video pause status 0
silencedet.c !Re-adjust threshold (in silence)to 0
PJSIP_log: in pauseVideo
pjsua_vid.c !Call 0: set video stream, op=5
strm0x12ca03228 !Jitter buffer starts returning normal frames (after 249 empty/lost)
strm0x12ca03228 Jitter buffer empty (prefetch=0), plc invoked
strm0x12ca03228 Start talksprut..
strm0x12ca03228 Starting silence
silencedet.c Re-adjust threshold (in silence)to 0
之后 pjsua_vid.c !Call 0: set video stream, op=5
应用挂起,这 3 行将被记录多次
strm0x12ca03228 Start talksprut..
strm0x12ca03228 Starting silence
silencedet.c Re-adjust threshold (in silence)to 0
使用 pjsua_schedule_timer2()
解决了这个问题
如果我在进行视频通话时连续暂停和开始,我的应用程序会崩溃我使用了以下代码来暂停和恢复视频流。
PJSIP 版本:2.9
func pauseVideo(_ value: Bool) {
guard let id = SIPAccount.account?.calls.last?.call_id else { return }
let operation = value ? PJSUA_CALL_VID_STRM_STOP_TRANSMIT : PJSUA_CALL_VID_STRM_START_TRANSMIT
var param = pjsua_call_vid_strm_op_param()
pjsua_call_vid_strm_op_param_default(¶m)
param.med_idx = pjsua_call_get_vid_stream_idx(pjsua_call_id(id))
param.dir = value ? PJMEDIA_DIR_NONE : PJMEDIA_DIR_ENCODING_DECODING
pjsua_call_set_vid_strm(pjsua_call_id(id), operation, ¶m)
}
日志:
PJSIP_log: in pauseVideo
pjsua_vid.c Call 0: set video stream, op=5
vid_conf.c .Updating render state for port id 2 (1 sources)..
vid_conf.c .Created render state for connection 3->2
vid_conf.c .src#0=BGRA/352x288->352x264@0,12 dst=320x240@0,0
vid_conf.c .Port 3 (Front Camera) transmitting to port 2 (vstenc0x12c093028)
vstenc0x12c093028 .Encoder stream resumed
PJSIP_log: video pause status 0
vstenc0x12c093028 !Forcing encoder to generate keyframe
PJSIP_log: in pauseVideo
pjsua_vid.c !Call 0: set video stream, op=6
vstenc0x12c093028 .Encoder stream paused
vid_conf.c .Cleaned up render state for connection 3->2
vid_conf.c .Port 3 (Front Camera) stop transmitting to port 2 (vstenc0x12c093028)
PJSIP_log: video pause status 0
silencedet.c !Re-adjust threshold (in silence)to 0
PJSIP_log: in pauseVideo
pjsua_vid.c !Call 0: set video stream, op=5
strm0x12ca03228 !Jitter buffer starts returning normal frames (after 249 empty/lost)
strm0x12ca03228 Jitter buffer empty (prefetch=0), plc invoked
strm0x12ca03228 Start talksprut..
strm0x12ca03228 Starting silence
silencedet.c Re-adjust threshold (in silence)to 0
之后 pjsua_vid.c !Call 0: set video stream, op=5
应用挂起,这 3 行将被记录多次
strm0x12ca03228 Start talksprut..
strm0x12ca03228 Starting silence
silencedet.c Re-adjust threshold (in silence)to 0
使用 pjsua_schedule_timer2()
解决了这个问题