How to achieve visibility and meeting join for my appHostedMediaConfig bot
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:
- Bot missing from participant roster (used to appear, broke after code changes)
- VideoSendStatusChanged event never fires (prevents video tile from appearing)
- 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:
- Bot appears in Teams participant roster
- VideoSendStatusChanged fires with MediaSendStatus.Active
- Video tile appears in meeting gallery after sending H.264 frames
Actual:
- ✅ Meeting join succeeds (
Successfully initiated meeting join via SDK
) - ✅ VideoReceiveStatusChanged fires (
MediaReceiveStatus=Active
) - ✅ H.264 frames sent successfully (330+ frames logged)
- ❌ VideoSendStatusChanged NEVER fires
- ❌ Bot missing from participant roster
- ❌ 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:
- Verified all Graph API permissions (admin consented)
- Confirmed bot manifest has correct properties
- Implemented bypass: force sending frames without waiting for VideoSendStatusChanged
- Checked SDK version (77 days old - within 90 day limit)
- Verified certificates and network connectivity
Specific Questions:
- Why would VideoSendStatusChanged never fire despite successful join and proper H.264 config?
- Why is
videoSourceEncodingFormats
missing from the generated media config blob? - What's the difference between "connected" and "participant" status in Teams?
- 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:
- Bot missing from participant roster (used to appear, broke after code changes)
- VideoSendStatusChanged event never fires (prevents video tile from appearing)
- 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:
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:
- Bot appears in Teams participant roster
- VideoSendStatusChanged fires with MediaSendStatus.Active
- Video tile appears in meeting gallery after sending H.264 frames
Actual:
- ✅ Meeting join succeeds (
Successfully initiated meeting join via SDK
) - ✅ VideoReceiveStatusChanged fires (
MediaReceiveStatus=Active
) - ✅ H.264 frames sent successfully (330+ frames logged)
- ❌ VideoSendStatusChanged NEVER fires
- ❌ Bot missing from participant roster
- ❌ 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:
- Verified all Graph API permissions (admin consented)
- Confirmed bot manifest has correct properties
- Implemented bypass: force sending frames without waiting for VideoSendStatusChanged
- Checked SDK version (77 days old - within 90 day limit)
- Verified certificates and network connectivity
Specific Questions:
- Why would VideoSendStatusChanged never fire despite successful join and proper H.264 config?
- Why is
videoSourceEncodingFormats
missing from the generated media config blob? - What's the difference between "connected" and "participant" status in Teams?
- 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?