XCCC: Poor Quality Video in Multicast Conference Over Low Bandwidth Connection (812839)



The information in this article applies to:

  • Microsoft Exchange 2000 Enterprise Server
  • Microsoft Exchange 2000 Server
  • Microsoft Exchange 2000 Conferencing Server

SUMMARY

When you create a multicast conference that contains both audio and video, some participants may receive "jittery" or intermittent sound and poor quality or "choppy" video performance.

If the remote client turns off the video portion of the conference, the sound quality improves.

CAUSE

This issue may occur if your network does not have enough bandwidth for the multicast session.

Audio and video quality may be poor in a multicast conference that is held over a 512 kilobits per second (512 Kbps) or less wide area network (WAN) link.

WORKAROUND

To work around this issue, modify the Session Description Protocol blob to set a limit on the bandwidth used by the conference participants. For example, set the upper bandwidth limit to 60 Kbps or 80 Kbps. To do this, modify the Exchange Conferencing Server Web access page (Xipconf.asp) to set a bit rate for connected clients.

The following example of the Xipconf.asp file has been modified to include a "strBitRate" parameter between the <SCRIPT> tags. Edit the strBitRate value by using a text editor such as Notepad to set the bit rate that you want, currently set at 50 Kbps, to the maximum value that you want to permit. This example of the Xipconf.asp file is from Exchange Conferencing Server Service Pack 2 (SP2). If you are not using Exchange Conferencing Server SP2, copy the two <SCRIPT> sections from this example and paste them into the Xipconf.asp file from your version of Exchange Conferencing Server.

Microsoft provides programming examples for illustration only, without warranty either expressed or implied, including, but not limited to, the implied warranties of merchantability and/or fitness for a particular purpose. This article assumes that you are familiar with the programming language being demonstrated and the tools used to create and debug procedures. Microsoft support professionals can help explain the functionality of a particular procedure, but they will not modify these examples to provide added functionality or construct procedures to meet your specific needs. If you have limited programming experience, you may want to contact a Microsoft Certified Partner or the Microsoft fee-based consulting line at (800) 936-5200. For more information about Microsoft Certified Partners, see the following Microsoft Web site: For additional information about the support options available from Microsoft, visit the following Microsoft Web site:
<% @ CodePage=1252 Language=VBScript %>
<%
OPTION EXPLICIT
Response.Expires = 0

'This page expects the following parameters:
'?SDP=<SDP>                   Attempt to join the meeting with the passed conference ID
'?DS=7              Pre-join request
'?DS=8              Post-join request
'?DS=9              No MADCAP servers currently available
'?DS=10             Too many users (currently not used)
'?DS=11             All MADCAP servers failed
'?DS=12             No MADCAP servers matching the required advertising scope were found
'?DS=13             No MADCAP servers configured with the multicast scope list specified by the resource were found
'?DS=14             The resource has no specified multicast scopes 

' ================================ CONSTANTS =================================================
CONST L_PreJoinTitle_Text                = "The video conference you are trying to join has not yet started. Please wait; you will be joined automatically when the conference starts." 'Title for screenshot 7
CONST L_PostJoinTitle_Text               = "The video conference you are trying to join has ended. Check the date and time of the conference you are trying to join."                                                 'Title for screenshot 8
CONST L_TooManyUsersTitle_Text           = "The maximum number of participants allowed in this video conference has been reached. Wait a few minutes, and then try again."

CONST L_NoMadcapServersTitle_Text        = "The videoconference was not started because no multicast address allocation (MADCAP) servers are running or configured. Contact your system administrator for assistance."
CONST L_AllMadcapServersFailedTitle_Text = "The videoconference was not started because none of the available multicast address allocation (MADCAP) servers can issue a multicast address. Contact your system administrator for assistance."

CONST L_NoScopeMatch1_Text               = "The videoconference was not started because no multicast address allocation (MADCAP) server is within the advertising scope specified by the conference resource. The advertising scope is "
CONST L_NoScopeMatch2_Text               = " and the Time-To-Live (TTL) value for IP multicast packets is "
CONST L_NoScopeMatch3_Text               = ". Please note these values and forward them to your system administrator."

CONST L_NoScopesFound_Text               = "The videoconference was not started because no multicast address allocation (MADCAP) servers configured with a multicast scope specified by the conference resource could be found. Contact your system administrator for assistance."

CONST L_NoScopesInResource_Text          = "The videoconference was not started because no mutlicast scopes were specified by the conference resource. Contact your system administrator for assistance."

CONST L_DisplayOlderH323Client_Text      = "This audio video conference is in session. You can now use your H.323 client program (for example, NetMeeting) to participate in the conference. If you are not in the conference, try one of the following: Try to rejoin the conference. Verify that your T.120 client program is running. Check your network connection or protocol settings."
CONST L_DisplayNoAudioVideoClient_Text   = "An audio video connection to the Exchange Conferencing Server could not be automatically established.  Either client, server, or network capabilities could not be negotiated or the conference capacity may have been reached."
CONST L_DisplayNoAudioVideoActiveX_Text  = "An audio video connection to the Exchange Conferencing Server could not be automatically established.  Verify that your browser security settings permit the download of ActiveX controls."

CONST L_LocalVideoWindowTitle_Text       = "Local Video"
CONST L_RemoteVideoWindowTitle_Text      = "Remote Video"

CONST PROVIDER_CLASS_ID                  = "{42749791-A1E6-11D2-9BA4-00AA00BD8C91}"


' ================================ VARIABLES =================================================
'REQUEST STRING VARIABLES:
DIM inDisplayState
DIM inScope
DIM inTimeToLive
DIM inH323
DIM NoScopeMatchMessage

' =============================== INITIALIZATION ==============================================
inDisplayState   = Request.QueryString("DS")
inScope          = Request.QueryString("SCOPE")
inTimeToLive     = Request.QueryString("TTL")
inH323           = Request.QueryString("H323")

%>
<!-- #include file="utils.inc" -->
<HTML>
<HEAD>
<!-- Microsoft Exchange 2000 Conferencing Server
     Video Conferencing Join Page
     Copyright (c) 2000, Microsoft Corporation -->
<META http-equiv="Expires" content="0">
<META http-equiv="Content-Type" content="text/html; charset=windows-1252">
<LINK href="confpanel.css" rel="stylesheet" type="text/css">
<%
' =============================== HTML ====================================================
SELECT CASE inDisplayState
    CASE DISPLAY_PREJOIN, DISPLAY_POSTJOIN, DISPLAY_TOO_MANY_USERS, DISPLAY_NO_MADCAP_SERVERS,  DISPLAY_ALL_MADCAP_SERVERS_FAILED, _
         DISPLAY_NO_MADCAP_SCOPES_FOUND, DISPLAY_NO_SCOPES_IN_RESOURCE, DISPLAY_OLDER_H323_CLIENT, DISPLAY_NO_AUDIOVIDEO_CLIENT, _
         DISPLAY_NO_AUDIOVIDEO_ACTIVEX, DISPLAY_NO_MADCAP_SERVERS_MATCH_SCOPE %>
</HEAD>
<BODY BGCOLOR=#0066CC TOPMARGIN=0 LEFTMARGIN=0 RIGHTMARGIN=0 BOTTOMMARGIN=0 MARGINHEIGHT=0 MARGINWIDTH=0>
<% If (DISPLAY_PREJOIN = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_PreJoinTitle_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_POSTJOIN = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_PostJoinTitle_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_TOO_MANY_USERS = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_TooManyUsersTitle_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_NO_MADCAP_SERVERS = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_NoMadcapServersTitle_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_ALL_MADCAP_SERVERS_FAILED = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_AllMadcapServersFailedTitle_Text%></FONT></CENTER>
<% ElseIf ( DISPLAY_NO_MADCAP_SCOPES_FOUND = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_NoScopesFound_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_NO_SCOPES_IN_RESOURCE = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_NoScopesInResource_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_OLDER_H323_CLIENT = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_DisplayOlderH323Client_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_NO_AUDIOVIDEO_CLIENT = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_DisplayNoAudioVideoClient_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_NO_AUDIOVIDEO_ACTIVEX = inDisplayState) Then %>
<CENTER><FONT CLASS="menuselected"><%=L_DisplayNoAudioVideoActiveX_Text%></FONT></CENTER>
<% ElseIf (DISPLAY_NO_MADCAP_SERVERS_MATCH_SCOPE = inDisplayState) Then %>
<% NoScopeMatchMessage = L_NoScopeMatch1_Text & inScope & L_NoScopeMatch2_Text & inTimeToLive & L_NoScopeMatch3_Text %>
<CENTER><FONT CLASS="menuselected"><%=NoScopeMatchMessage%></FONT></CENTER>
<% End If %>

<%  CASE DISPLAY_MULTICAST_CLIENT%>
</HEAD>
<BODY BGCOLOR=#0066CC TOPMARGIN=0 LEFTMARGIN=0 RIGHTMARGIN=0 BOTTOMMARGIN=0 MARGINHEIGHT=0 MARGINWIDTH=0>

<OBJECT classid=clsid:1533A74E-B073-11D2-8F7E-0080C7852DA3 codeBase="/<%=VROOT_CONFBIN%>/xipcctl.cab#Version=###BUILD_VERSION###" type="application/x-cabinet" height="100%" id=ExConf style="HEIGHT: 100%; WIDTH: 100%" width="100%"></OBJECT>

<SCRIPT language="JavaScript">
<!--
    var strSDP;
    strSDP = "<%=Request.QueryString%>";

    //debugging output
    //document.write("<BR>");
    //document.write(strSDP);

    var strTimeField;
    strTimeField = "&t%3d";

    //bitrate in kilobits per second
    strBitRate = "50";

    var idxStartTimeField

    idxStartTimeField = strSDP.indexOf(strTimeField);

    //debugging output
    //alert("start " + idxStartTimeField);

    strSDP = strSDP.slice(0, idxStartTimeField) + "&b%3dCT:" + strBitRate + strSDP.slice(idxStartTimeField);

    //debugging output
    //document.write("<BR>");
    //document.write(strSDP);
//-->
</SCRIPT>



<SCRIPT language="JavaScript">

<!--
    if ("undefined" == typeof(ExConf))
    {
        L_ControlNotInstalled_ErrorMessage = "The ActiveX control required for videoconferencing is not installed on your computer. Rejoin the conference, and then click Yes if you are prompted to install the control. (Whether you will be prompted depends on your browser's security setting.)";
        
        alert(L_ControlNotInstalled_ErrorMessage);
    }
    else
    {

	//debugging output       
        //alert("joining SDP: " + strSDP);
        
        ExConf.Join(strSDP);
        ExConf.BackColor = 0x8000000F;
    }
//-->
</SCRIPT>

</BODY>
</HTML>

<%  CASE DISPLAY_H323_CLIENT%>

<SCRIPT Language=Javascript>
<!--
function SetAutoScrollbars()
{
    window.parent.document.all.tags("FRAME").item(window.name).scrolling="auto"
}
-->
</SCRIPT>

</HEAD>
<BODY scroll=auto onload="SetAutoScrollbars();" BGCOLOR=#0066CC TOPMARGIN=0 LEFTMARGIN=0 RIGHTMARGIN=0 BOTTOMMARGIN=0 MARGINHEIGHT=0 MARGINWIDTH=0>
    <TABLE COLS="2" ROWS="2">
        <TR>
            <TD ALIGN="CENTER"><%=(L_TitleBoldBegin_HTMLText & L_RemoteVideoWindowTitle_Text & L_TitleBoldEnd_HTMLText)%></TD>
            <TD ALIGN="CENTER"><%=(L_TitleBoldBegin_HTMLText & L_LocalVideoWindowTitle_Text & L_TitleBoldEnd_HTMLText)%></TD>
        </TR>
        <TR>
            <TD>
                <OBJECT ID=NetMeetingRemote CLASSID="CLSID:3E9BAF2D-7A79-11d2-9334-0000F875AE17">
                <PARAM NAME="MODE" VALUE="RemoteOnly">
                </OBJECT>
            </TD>

            <TD>
                <OBJECT ID=NetMeetingLocal CLASSID="CLSID:3E9BAF2D-7A79-11d2-9334-0000F875AE17">
                <PARAM NAME="MODE" VALUE="PreviewOnly">
                </OBJECT>
            </TD>
        </TR>
    </TABLE>
    <SCRIPT FOR=window event=onunload>
       if (typeof(NetMeetingLocal) != "undefined")
       {
           NetMeetingLocal.LeaveConference();
       }
       if (typeof(NetMeetingRemote) != "undefined")
       {
           NetMeetingRemote.LeaveConference();
       }
    </SCRIPT>
</BODY>
</HTML>

<%
    CASE ELSE 'Standard join page
        IF (0 = ErrorCount AND "" = inDisplayState) THEN 'Decide between H323 and multicast
%>
</HEAD>
<BODY BGCOLOR=#0066CC TOPMARGIN=0 LEFTMARGIN=15 RIGHTMARGIN=15 BOTTOMMARGIN=15 MARGINHEIGHT=0 MARGINWIDTH=15>

<OBJECT ID="NetMeetingCAC" CLASSID="CLSID:9A04E3F0-3BB2-11d2-91E2-00C04FAEC46B" HEIGHT="0" WIDTH="0" codebase="/<%=VROOT_CONFBIN%>/xcliacc.cab#Version=###BUILD_VERSION###" TYPE="application/x-cabinet"></OBJECT>
<SCRIPT language="JavaScript">
<!--
    if ("undefined" == typeof(NetMeetingCAC) || "1" != NetMeetingCAC.IsLoaded)
    {
        location.replace("xipconf.asp?DS=<%=DISPLAY_NO_AUDIOVIDEO_ACTIVEX%>&<%=Request.QueryString%>");
    }
    else
    {
        var strP = NetMeetingCAC.OptimalConferencingProtocol("VIDEO", "<%=Request.QueryString%>");

        if ("MULTICAST" == strP)
        {
            location.replace("xipconf.asp?DS=<%=DISPLAY_MULTICAST_CLIENT%>&<%=Request.QueryString%>");
        }
        <% IF ("1" = inH323) THEN %>
        else if ("H323.A" == strP)
        {
            location.replace("xipconf.asp?DS=<%=DISPLAY_H323_CLIENT%>&<%=Request.QueryString%>");
        }
        else if ("H323.B" == strP)
        {
            location.replace("xipconf.asp?DS=<%=DISPLAY_OLDER_H323_CLIENT%>&<%=Request.QueryString%>");
        }
        <% END IF %>
        else
        {
            location.replace("xipconf.asp?DS=<%=DISPLAY_NO_AUDIOVIDEO_CLIENT%>&<%=Request.QueryString%>");
        }
    }
//-->
</SCRIPT>

</BODY>
</HTML>
<%
        ELSE 'Error has occurred, send error page (this code is currently never reached)
            CONST L_InvalidDisplayStateTitle_ErrorMessage  = "Invalid Display URL"
            CONST L_InvalidDisplayStateReason_ErrorMessage = "The URL for this page was mistyped or incorrectly entered."
            CONST L_InvalidDisplayStateFix1_ErrorMessage   = "Click Back on your browser, and then try to send your last command again."
            CONST L_InvalidDisplayStateFix2_ErrorMessage   = "If you copied the URL from another message, verify that you are using the correct URL."
                
            CALL SetError(L_InvalidDisplayStateTitle_ErrorMessage, CDbl(inDisplayState), "displayState", "Invalid Display URL")
            CALL SetReason(L_InvalidDisplayStateReason_ErrorMessage)
            CALL AddFix(L_InvalidDisplayStateFix1_ErrorMessage)
            CALL AddFix(L_InvalidDisplayStateFix2_ErrorMessage)
            CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")
            CALL DisplayErrorPage
        END IF
END SELECT
%>

MORE INFORMATION

For additional information, click the following article numbers to view the articles in the Microsoft Knowledge Base:

280444 XCCC: How to Configure Exchange 2000 Conferencing Server for Internet Attendees

326184 XCCC: White Paper - Using Microsoft Exchange 2000 Conferencing Server over the Internet

247474 XCCC: How to Manually Add Audio/Video ActiveX Controls for Exchange Conferencing Server

290174 XCCC: Bandwidth Considerations for Conferencing over the Internet

273891 XCCC: How to Select Another Video Camera for Use in an Online Video Conference

314630 XCCC: Allocating Multicast Addresses for Audio and Video Conferences


Modification Type:MinorLast Reviewed:10/26/2005
Keywords:kbprb KB812839