Skip to content

Commit d5b83e1

Browse files
committed
fixed:webrtc auto choice media index
1 parent a81069c commit d5b83e1

File tree

1 file changed

+55
-22
lines changed

1 file changed

+55
-22
lines changed

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PullStream/PullStream_ClientWebRtc.cpp

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -155,20 +155,20 @@ bool PullStream_ClientProtocol_Handle(LPCXSTR lpszClientAddr, XSOCKET hSocket, L
155155

156156
return true;
157157
}
158-
bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, LPCXSTR lpszClientID, bool bVideo, XENGINE_PROTOCOL_AVINFO* pSt_AVInfo)
158+
bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, LPCXSTR lpszClientID, bool bVideo, int nAVIndex, STREAMMEDIA_SDPPROTOCOL_MEDIAINFO* pSt_SDPMediaInfo)
159159
{
160160
XCHAR** pptszAVList;
161161
BaseLib_OperatorMemory_Malloc((XPPPMEM)&pptszAVList, 1, MAX_PATH);
162162

163163
if (bVideo)
164164
{
165-
_tcsxcpy(pptszAVList[0], _X("106"));
165+
_xstprintf(pptszAVList[0], "%d", nAVIndex);
166166
SDPProtocol_Packet_AddMedia(xhPacket, _X("video"), _X("UDP/TLS/RTP/SAVPF"), &pptszAVList, 1, 1, 9);
167167
SDPProtocol_Packet_ClientInet(xhPacket);
168168
}
169169
else
170170
{
171-
_tcsxcpy(pptszAVList[0], _X("111"));
171+
_xstprintf(pptszAVList[0], "%d", nAVIndex);
172172
SDPProtocol_Packet_AddMedia(xhPacket, _X("audio"), _X("UDP/TLS/RTP/SAVPF"), &pptszAVList, 1, 0, 9);
173173
SDPProtocol_Packet_ClientInet(xhPacket);
174174
}
@@ -194,19 +194,7 @@ bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, LPCXSTR lpszClientID
194194
{
195195
SDPProtocol_Packet_OnlyRWFlag(xhPacket, true);
196196
SDPProtocol_Packet_RtcpComm(xhPacket, true, true);
197-
198-
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtpmap"), _X("106 H264/90000"));
199-
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtcp-fb"), _X("106 transport-cc"));
200-
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtcp-fb"), _X("106 nack"));
201-
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtcp-fb"), _X("106 nack pli"));
202-
203-
STREAMMEDIA_SDPPROTOCOL_MEDIAINFO st_SDPMedia = {};
204-
205-
st_SDPMedia.st_FmtpVideo.nPacketMode = 1;
206-
st_SDPMedia.st_FmtpVideo.tszLeaveId[0] = 0x42;
207-
st_SDPMedia.st_FmtpVideo.tszLeaveId[1] = 0xe0;
208-
st_SDPMedia.st_FmtpVideo.tszLeaveId[2] = 0x1f;
209-
SDPProtocol_Packet_VideoFmt(xhPacket, 106, &st_SDPMedia, true);
197+
SDPProtocol_Packet_VideoFmt(xhPacket, nAVIndex, pSt_SDPMediaInfo, true);
210198

211199
XCHAR tszSSrcStr[128] = {};
212200
_xstprintf(tszSSrcStr, _X("2124085007"));
@@ -221,9 +209,7 @@ bool PullStream_ClientWebRtc_SDKPacket(XNETHANDLE xhPacket, LPCXSTR lpszClientID
221209
{
222210
SDPProtocol_Packet_OnlyRWFlag(xhPacket, true);
223211
SDPProtocol_Packet_RtcpComm(xhPacket, true, true);
224-
225-
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtpmap"), _X("111 opus/48000/2"));
226-
SDPProtocol_Packet_OptionalAddAttr(xhPacket, _X("rtcp-fb"), _X("111 transport-cc"));
212+
SDPProtocol_Packet_AudioFmt(xhPacket, nAVIndex, pSt_SDPMediaInfo, true);
227213

228214
XCHAR tszSSrcStr[128] = {};
229215
_xstprintf(tszSSrcStr, _X("2124085006"));
@@ -289,6 +275,53 @@ bool PullStream_ClientWebRtc_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam,
289275
SDPProtocol_Parse_AttrBundle(&ppSt_ListAttr, nListCount, &nIndex1, &nIndex2);
290276
SDPProtocol_Parse_AttrICEUser(&ppSt_ListAttr, nListCount, tszICEUser, tszICEPass);
291277
SDPProtocol_Parse_AttrFinger(&ppSt_ListAttr, nListCount, tszAlgType, tszHMacStr);
278+
//查找合适的视频和音频流索引信息
279+
STREAMMEDIA_SDPPROTOCOL_MEDIAINFO st_SDPAudioInfo = {};
280+
STREAMMEDIA_SDPPROTOCOL_MEDIAINFO st_SDPVideoInfo = {};
281+
282+
int nVideoIndex = 0;
283+
int nAudioIndex = 0;
284+
int nAVCount = 0;
285+
STREAMMEDIA_SDPPROTOCOL_AVMEDIA** ppSt_AVMedia;
286+
SDPProtocol_Parse_GetAVMedia(xhParse, &ppSt_AVMedia, &nAVCount);
287+
for (int i = 0; i < nAVCount; i++)
288+
{
289+
LPCXSTR lpszAudioStr = _X("audio");
290+
LPCXSTR lpszVideoStr = _X("video");
291+
if (0 == _tcsxnicmp(lpszAudioStr, ppSt_AVMedia[i]->tszAVType, _tcsxlen(lpszAudioStr)))
292+
{
293+
//查找列表
294+
for (int j = 0; j < ppSt_AVMedia[i]->nListCount; j++)
295+
{
296+
STREAMMEDIA_SDPPROTOCOL_MEDIAINFO st_SDPMeida = {};
297+
SDPProtocol_Parse_RTPMapAudio(&ppSt_ListAttr, nListCount, _ttxoi(ppSt_AVMedia[i]->pptszAVList[j]), &st_SDPMeida);
298+
//多个条件选择
299+
if ((2 == st_SDPMeida.st_RTPMap.nChannel) && (0 == _tcsxnicmp(st_SDPMeida.st_RTPMap.tszCodecName, "opus", 4)))
300+
{
301+
nAudioIndex = _ttxoi(ppSt_AVMedia[i]->pptszAVList[j]);
302+
st_SDPAudioInfo = st_SDPMeida;
303+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBRTC:%s,找到了合适的音频信息索引:%s"), lpszClientAddr, ppSt_AVMedia[i]->pptszAVList[j]);
304+
}
305+
}
306+
}
307+
else if (0 == _tcsxnicmp(lpszVideoStr, ppSt_AVMedia[i]->tszAVType, _tcsxlen(lpszVideoStr)))
308+
{
309+
//查找列表
310+
for (int j = 0; j < ppSt_AVMedia[i]->nListCount; j++)
311+
{
312+
STREAMMEDIA_SDPPROTOCOL_MEDIAINFO st_SDPMeida = {};
313+
SDPProtocol_Parse_RTPMapVideo(&ppSt_ListAttr, nListCount, _ttxoi(ppSt_AVMedia[i]->pptszAVList[j]), &st_SDPMeida);
314+
//多个条件选择
315+
if ((1 == st_SDPMeida.st_FmtpVideo.nPacketMode) && (0x42 == st_SDPMeida.st_FmtpVideo.tszLeaveId[0]) && (0 == _tcsxnicmp(st_SDPMeida.st_RTPMap.tszCodecName, "H264", 4)))
316+
{
317+
nVideoIndex = _ttxoi(ppSt_AVMedia[i]->pptszAVList[j]);
318+
st_SDPVideoInfo = st_SDPMeida;
319+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBRTC:%s,找到了合适的视频信息索引:%s"), lpszClientAddr, ppSt_AVMedia[i]->pptszAVList[j]);
320+
}
321+
}
322+
}
323+
}
324+
292325
SDPProtocol_Parse_Destory(xhParse);
293326
BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListAttr, nListCount);
294327
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBRTC:%s,请求的SDP信息属性解析完毕,总共解析了:%d 个属性"), lpszClientAddr, nListCount);
@@ -323,12 +356,12 @@ bool PullStream_ClientWebRtc_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam,
323356

324357
if (nIndex1 >= 0 && nIndex2 >= 0)
325358
{
326-
PullStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, false, &st_AVInfo);
327-
PullStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, true, &st_AVInfo);
359+
PullStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, false, nAudioIndex, &st_SDPAudioInfo);
360+
PullStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, true, nVideoIndex, &st_SDPVideoInfo);
328361
}
329362
else
330363
{
331-
PullStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, true, &st_AVInfo);
364+
PullStream_ClientWebRtc_SDKPacket(xhPacket, tszUserStr, true, nVideoIndex, &st_SDPVideoInfo);
332365
}
333366

334367
SDPProtocol_Packet_GetPacket(xhPacket, tszRVBuffer, &nRVLen);

0 commit comments

Comments
 (0)