if (rt->transport == RTSP_TRANSPORT_RDT) trans_pref = "x-pn-tng"; else if (rt->transport == RTSP_TRANSPORT_RAW){ trans_pref = "RAW/RAW"; } else { if (lower_transport == RTSP_LOWER_TRANSPORT_TCP) trans_pref = "RTP/AVP"; else trans_pref = "MP2T/RTP"; }
时间: 2024-04-29 16:21:36 浏览: 10
根据你提供的代码,我猜测这是一段针对 RTSP 协议传输方式的处理逻辑。如果 RTSP 的传输方式为 RDT,则设置传输协议为 "x-pn-tng";如果传输方式为 RAW,则设置传输协议为 "RAW/RAW";如果传输方式不是 RDT 也不是 RAW,则根据 lower_transport 的值来设置传输协议,如果 lower_transport 为 TCP,则设置传输协议为 "RTP/AVP",否则设置传输协议为 "MP2T/RTP"。
相关问题
switch(rt->state) { default: case RTSP_STATE_IDLE: break; case RTSP_STATE_STREAMING: if (rtsp_read_pause(s) != 0) return -1; /* flush inbound media packets */ rtsp_read_flush(s); rt->state = RTSP_STATE_SEEKING; if (rtsp_read_play(s) != 0){ av_log(NULL, AV_LOG_ERROR, "[%s:%d]rtsp_read_play failed\n",__FUNCTION__,__LINE__); return -1; } break; case RTSP_STATE_PAUSED: if (rt->playback_rate_permille == rt->playback_rate_permille_next) { rt->state = RTSP_STATE_IDLE; } else { /* trick mode */ /* flush inbound media packets */ rtsp_read_flush(s); rt->state = RTSP_STATE_SEEKING; if (rtsp_read_play(s) != 0) { return -1; } } break; }
这段代码是关于 RTSP 协议的状态转换和处理的,主要是根据当前的状态来执行不同的操作。其中,RTSP_STATE_IDLE 表示空闲状态,RTSP_STATE_STREAMING 表示正在传输状态,RTSP_STATE_PAUSED 表示暂停状态,RTSP_STATE_SEEKING 表示寻找状态。具体来说,当状态为 RTSP_STATE_STREAMING 时,会暂停读取媒体包,并切换到 RTSP_STATE_SEEKING 状态,然后执行 rtsp_read_play 操作;当状态为 RTSP_STATE_PAUSED 时,会判断播放速率是否为下一次的播放速率,如果相同则切换到 RTSP_STATE_IDLE 状态,否则会执行 trick mode 操作,也就是切换到 RTSP_STATE_SEEKING 状态并执行 rtsp_read_play 操作。
if ( (timeshift = strstr(rtspCtx->ctx->filename, "timeshift")) != NULL && (startpos = strstr(rtspCtx->ctx->filename, "startpos")) != NULL) { rt->timeshift = atoi(timeshift + strlen("timeshift=")); if (rt->timeshift) { av_strlcpy(rt->start_timestamp, startpos+strlen("startpos="), 17); char* url_prefix = NULL; if (( url_prefix = strstr(rtspCtx->ctx->filename, "?")) != NULL) { *url_prefix = '\0'; av_log(NULL, AV_LOG_INFO, "[%s:%d]rtsp url:%s, timeshift=%d, startpos=%s", __FUNCTION__, __LINE__, rtspCtx->ctx->filename, rt->timeshift, rt->start_timestamp); } } }如何获取start_timestamp
在该代码段中,可以通过调用 `av_strlcpy()` 函数将 `startpos` 指针指向的字符串(即包含时间戳的部分)复制到一个名为 `start_timestamp` 的字符数组中。这个字符数组的大小为 17 个字节,这是因为 `av_strlcpy()` 函数将确保在复制字符串时不会超过目标数组的大小。所以, `start_timestamp` 就是从 `rtspCtx->ctx->filename` 中解析出的起始时间戳,其长度不会超过 16 个字符。