How to achieve visibility and meeting join for my appHostedMediaConfig bot

AshJaffer 0 Reputation points
2025-08-02T00:06:08.47+00:00

I'm developing a Teams bot using the Microsoft Graph Communications SDK (C#) with application-hosted media. The bot successfully joins meetings and can receive video (VideoReceiveStatusChanged fires), but:

  1. Bot missing from participant roster (used to appear, broke after code changes)
  2. VideoSendStatusChanged event never fires (prevents video tile from appearing)
  3. Bot sends 300+ H.264 frames successfully but Teams doesn't recognize it as video participant

Environment:

  • SDK: Microsoft.Skype.Bots.Media v1.31.0.225 (latest)
  • Framework: .NET 8.0
  • Deployment: Windows VM, production certificates
  • Manifest: supportsCalling: true, supportsVideo: true

Current Implementation:

VideoSocket Configuration:

csharp

var videoSocketSettings = new VideoSocketSettings
{
    StreamDirections = StreamDirection.Sendrecv,
    SupportedSendVideoFormats = new List<VideoFormat>
    {
        VideoFormat.H264_320x180_15Fps,
        VideoFormat.H264_424x240_15Fps, 
        VideoFormat.H264_640x360_30Fps,
        VideoFormat.H264_1280x720_30Fps,
        VideoFormat.H264_1920x1080_30Fps
    },
    ReceiveColorFormat = VideoColorFormat.H264,
    MaxConcurrentSendStreams = 1
};

Meeting Join:

ILocalMediaSession mediaSession = _communicationsClient.CreateMediaSession(audioSocketSettings, videoSocketSettings);
var joinMeetingParams = new JoinMeetingParameters(chatInfo, meetingInfo, mediaSession);
ICall createdCall = await _communicationsClient.Calls().AddAsync(joinMeetingParams);

Expected vs Actual Behavior:

Expected:

  1. Bot appears in Teams participant roster
  2. VideoSendStatusChanged fires with MediaSendStatus.Active
  3. Video tile appears in meeting gallery after sending H.264 frames

Actual:

  1. ✅ Meeting join succeeds (Successfully initiated meeting join via SDK)
  2. ✅ VideoReceiveStatusChanged fires (MediaReceiveStatus=Active)
  3. ✅ H.264 frames sent successfully (330+ frames logged)
  4. ❌ VideoSendStatusChanged NEVER fires
  5. ❌ Bot missing from participant roster
  6. ❌ No video tile appears

Generated Media Config Analysis:

POST request shows:

json

"videoSinkEncodingFormats":["H264"]  // ✅ Present (receive)
// Missing: "videoSourceEncodingFormats" - could this be the issue?

What We've Tried:

  1. Verified all Graph API permissions (admin consented)
  2. Confirmed bot manifest has correct properties
  3. Implemented bypass: force sending frames without waiting for VideoSendStatusChanged
  4. Checked SDK version (77 days old - within 90 day limit)
  5. Verified certificates and network connectivity

Specific Questions:

  1. Why would VideoSendStatusChanged never fire despite successful join and proper H.264 config?
  2. Why is videoSourceEncodingFormats missing from the generated media config blob?
  3. What's the difference between "connected" and "participant" status in Teams?
  4. Any specific VideoSocket configuration required for participant roster visibility?

Sample Logs:

[23:07:55] ✅ Successfully initiated meeting join via SDK
[23:07:56] 📹 VideoReceiveStatusChanged: MediaReceiveStatus=Active  
[23:07:56] 🎥 Starting to send video frames at 1280x720 @ 30fps
[23:07:56] ✅ Frame 0 sent to VideoSocket (port 3480 expected)
[23:08:08] 🎥 Sent 300 video frames (10s) for call
// VideoSendStatusChanged NEVER logged

Any insights on what could cause Teams to not recognize the bot as a video sender despite successful frame transmission? Are there specific requirements for participant roster viI'm developing a Teams bot using the Microsoft Graph Communications SDK (C#) with application-hosted media. The bot successfully joins meetings and can receive video (VideoReceiveStatusChanged fires), but:

  1. Bot missing from participant roster (used to appear, broke after code changes)
  2. VideoSendStatusChanged event never fires (prevents video tile from appearing)
  3. Bot sends 300+ H.264 frames successfully but Teams doesn't recognize it as video participant

Environment:

  • SDK: Microsoft.Skype.Bots.Media v1.31.0.225 (latest)
  • Framework: .NET 8.0
  • Deployment: Windows VM, production certificates
  • Manifest: supportsCalling: truesupportsVideo: true

Current Implementation:

VideoSocket Configuration:

var videoSocketSettings = new VideoSocketSettings
{
    StreamDirections = StreamDirection.Sendrecv,
    SupportedSendVideoFormats = new List<VideoFormat>
    {
        VideoFormat.H264_320x180_15Fps,
        VideoFormat.H264_424x240_15Fps, 
        VideoFormat.H264_640x360_30Fps,
        VideoFormat.H264_1280x720_30Fps,
        VideoFormat.H264_1920x1080_30Fps
    },
    ReceiveColorFormat = VideoColorFormat.H264,
    MaxConcurrentSendStreams = 1
};

Meeting Join:

ILocalMediaSession mediaSession = _communicationsClient.CreateMediaSession(audioSocketSettings, videoSocketSettings);
var joinMeetingParams = new JoinMeetingParameters(chatInfo, meetingInfo, mediaSession);
ICall createdCall = await _communicationsClient.Calls().AddAsync(joinMeetingParams);

Expected vs Actual Behavior:

Expected:

  1. Bot appears in Teams participant roster
  2. VideoSendStatusChanged fires with MediaSendStatus.Active
  3. Video tile appears in meeting gallery after sending H.264 frames

Actual:

  1. ✅ Meeting join succeeds (Successfully initiated meeting join via SDK)
  2. ✅ VideoReceiveStatusChanged fires (MediaReceiveStatus=Active)
  3. ✅ H.264 frames sent successfully (330+ frames logged)
  4. ❌ VideoSendStatusChanged NEVER fires
  5. ❌ Bot missing from participant roster
  6. ❌ No video tile appears

Generated Media Config Analysis:

POST request shows:

json

"videoSinkEncodingFormats":["H264"]  // ✅ Present (receive)
// Missing: "videoSourceEncodingFormats" - could this be the issue?

What I've Tried:

  1. Verified all Graph API permissions (admin consented)
  2. Confirmed bot manifest has correct properties
  3. Implemented bypass: force sending frames without waiting for VideoSendStatusChanged
  4. Checked SDK version (77 days old - within 90 day limit)
  5. Verified certificates and network connectivity

Specific Questions:

  1. Why would VideoSendStatusChanged never fire despite successful join and proper H.264 config?
  2. Why is videoSourceEncodingFormats missing from the generated media config blob?
  3. What's the difference between "connected" and "participant" status in Teams?
  4. Any specific VideoSocket configuration required for participant roster visibility?

Sample Logs:

[23:07:55] ✅ Successfully initiated meeting join via SDK
[23:07:56] 📹 VideoReceiveStatusChanged: MediaReceiveStatus=Active  
[23:07:56] 🎥 Starting to send video frames at 1280x720 @ 30fps
[23:07:56] ✅ Frame 0 sent to VideoSocket (port 3480 expected)
[23:08:08] 🎥 Sent 300 video frames (10s) for call
// VideoSendStatusChanged NEVER logged

Any insights on what could cause Teams to not recognize the bot as a video sender despite successful frame transmission? Are there specific requirements for participant roster visibility as opposed to just being connected?

Microsoft Teams | Development
{count} votes

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.