@@ -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