Class VideoSocket
Provides Send and Receive I/O access to a video stream.
Inherited Members
Namespace: Microsoft.Skype.Bots.Media
Assembly: Microsoft.Skype.Bots.Media.dll
Syntax
public sealed class VideoSocket : IVideoSocket, IDisposable, IInternalVideoSocket, IInternalSocket
Constructors
VideoSocket(VideoSocketSettings)
Initializes a new VideoSocket object.
Declaration
public VideoSocket(VideoSocketSettings settings)
Parameters
Type | Name | Description |
---|---|---|
VideoSocketSettings | settings | Configuration settings for the VideoSocket |
Properties
MediaType
MediaType of the video socket. This could be Video or Vbss. The MediaType is set after the socket is passed to the CreateMediaConfiguration API. It may also be set via the VideoSocketSettings during socket creation.
Declaration
public MediaType MediaType { get; }
Property Value
Type | Description |
---|---|
MediaType |
ReceiveColorFormat
VideoColorFormat to receive
Declaration
public VideoColorFormat ReceiveColorFormat { get; }
Property Value
Type | Description |
---|---|
VideoColorFormat |
SocketId
The 0-based ID of the socket. This socket ID is useful to identify a socket in a multiview (ie. more than 1 video socket) call. The same ID is used in the event args of the VideoMediaReceived and VideoSendStatusChanged events that this class may raise. The socket ID property will be present in both single view and multiview cases. The ID maps to the order in which the video sockets are provided to the CreateMediaConfiguration API. Eg., if the collection of IVideoSocket objects in the CreateMediaConfiguration API contains {socketA, socketB, socketC}, the sockets will have the ID mapping of: 0 for socketA, 1 for socketB and 2 for socketC. Before the call to CreateMediaConfiguration, the SocketId has a value of -1.
Declaration
public int SocketId { get; }
Property Value
Type | Description |
---|---|
Int32 |
Methods
Dispose()
Disposes the object.
Declaration
public void Dispose()
GetQualityOfExperienceData()
Get the Quality of Experience (QoE) data for the audio socket.
Declaration
public VideoQualityOfExperienceData GetQualityOfExperienceData()
Returns
Type | Description |
---|---|
VideoQualityOfExperienceData |
Remarks
The bot should fetch the QoE data no more than once every 30 seconds. To get accurate metrics, the bot should let media flow for at least 30 seconds before fetching the QoE data.
RequestKeyFrame()
Allows the application to request for key frame. Only valid for sockets with the ReceiveColorFormat as H264
Declaration
public void RequestKeyFrame()
Send(VideoMediaBuffer)
Sends a frame of video media.
Declaration
public void Send(VideoMediaBuffer buffer)
Parameters
Type | Name | Description |
---|---|---|
VideoMediaBuffer | buffer | VideoMediaBuffer containing the frame of video media to send. |
Remarks
The application must create a concrete class which derives from the VideoMediaBuffer abstract class. The buffer object passed to the Send method is still potentially in-use after the method returns to the caller. The application must not free the buffer's data until the the buffer object's Dispose() method is invoked by the Media Platform.
The application should be sending up to 30 video frames per second.
The VideoSocket must be enabled to send media via the VideoSocketSettings.StreamDirections
property.
SetReceiveBandwidthLimit(UInt32)
Sets the bandwidth limit on the receive stream of the VideoSocket. This is only supported if the socket supports receiving H264 video format. It is recommended to wait for the VideoReceiveStatusChanged event with MediaReceiveStatus Active state during the initial call setup before applying the receive bandwidth limit on the socket. Bandwidth range (in bits per second) for various resolutions and frame rates per media type:
Media type: Video
1000000 - 4000000 1080p at 30 fps
550000 - 2500000 720p at 30 fps
375000 - 1500000 540p at 30 fps
200000 - 800000 360p at 30 fps
150000 - 250000 360p at 15 fps
120000 - 220000 240p at 15 fps
60000 - 200000 180p at 15 fps
20000 - 100000 180p at 7.5 fps
10000 - 25000 180p at 3.75 fps
1000 - 12500 180p at 1.875 fps
Media type: Vbss
Resolution: 1080p
2000000 - 4000000 at 30 fps
600000 - 3000000 at 15 fps
300000 - 700000 at 7.5 fps
150000 - 350000 at 3.75 fps
70000 - 200000 at 1.875 fps
Declaration
public void SetReceiveBandwidthLimit(uint bitsPerSecond)
Parameters
Type | Name | Description |
---|---|---|
UInt32 | bitsPerSecond | The receive bitrate |
SetSendBandwidthLimit(UInt32)
Sets the bandwidth limit on the send stream of the VideoSocket. This is only supported if the socket supports sending H264 video formats. It is recommended to wait for the VideoSendStatusChanged event with MediaSendStatus Active state during the initial call setup before applying the send bandwidth limit on the socket.
Bandwidth range (in bits per second) for various resolutions and frame rates per media type:
Media type: Video
1000000 - 4000000 1080p at 30 fps
550000 - 2500000 720p at 30 fps
375000 - 1500000 540p at 30 fps
200000 - 800000 360p at 30 fps
150000 - 250000 360p at 15 fps
120000 - 220000 240p at 15 fps
60000 - 200000 180p at 15 fps
20000 - 100000 180p at 7.5 fps
10000 - 25000 180p at 3.75 fps
1000 - 12500 180p at 1.875 fps
Media type: Vbss
Resolution: 1080p
2000000 - 4000000 at 30 fps
600000 - 3000000 at 15 fps
300000 - 700000 at 7.5 fps
150000 - 350000 at 3.75 fps
70000 - 200000 at 1.875 fps
Declaration
public void SetSendBandwidthLimit(uint bitsPerSecond)
Parameters
Type | Name | Description |
---|---|---|
UInt32 | bitsPerSecond | The send bitrate |
Subscribe(VideoResolution)
Request to receive the video of the peer in a 1:1 call. No need to specify a MediaSourceId.
The bot cannot subscribe to a video source unless the VideoReceiveStatusChanged
event is raised
indicating the VideoSocket's MediaReceiveStatus
is Active
.
Declaration
public void Subscribe(VideoResolution preferredVideoResolution)
Parameters
Type | Name | Description |
---|---|---|
VideoResolution | preferredVideoResolution | The requested video resolution. The received video frames should have this resolution if the bandwidth constraints and sender capabilities allow, however the bot may receive video frames at a resolution lower than requested. |
Subscribe(VideoResolution, UInt32)
Request to receive the video source of a participant in a meeting or group call.
The video source must be identified by its MediaSourceId available from the roster.
The bot cannot subscribe to a video source unless the VideoReceiveStatusChanged
event is raised
indicating the VideoSocket's MediaReceiveStatus
is Active
.
Declaration
public void Subscribe(VideoResolution preferredVideoResolution, uint MediaSourceId)
Parameters
Type | Name | Description |
---|---|---|
VideoResolution | preferredVideoResolution | The requested video resolution. The received video frames should have this resolution if the bandwidth constraints and sender capabilities allow, however the bot may receive video frames at a resolution lower than requested. |
UInt32 | MediaSourceId | Media source identifier of the video source to be received |
Exceptions
Type | Condition |
---|---|
ObjectDisposedException | Thrown if the VideoSocket is disposed. |
InvalidOperationException | Thrown if the subscription is invalid. |
SkypeMediaException | Thrown if an internal media failure occurs. |
Unsubscribe()
Stops the current video subscription on the VideoSocket.
The VideoMediaReceived
events will stop raising video buffers.
Declaration
public void Unsubscribe()
UpdateVideoSendCapability(VideoSendCapability)
Allows the application to update dynamically the send capability (such as SupportedSendVideoFormats or MaxConcurrentSendStreams) of the video socket. The purpose of this API is to allow the application to communicate changes in VideoSocket's send capability to the platform during the call.
Declaration
public void UpdateVideoSendCapability(VideoSendCapability capability)
Parameters
Type | Name | Description |
---|---|---|
VideoSendCapability | capability |
Events
MediaStreamFailure
This event is raised if there is a network connection failure with the peer. To recover, the bot will need to start a new call or rejoin the meeting.
Declaration
public event EventHandler<MediaStreamFailureEventArgs> MediaStreamFailure
Event Type
Type | Description |
---|---|
EventHandler<MediaStreamFailureEventArgs> |
Remarks
Note: this event can be raised even if there is no active video subscription; i.e., the VideoSocket is "idle" and not receiving media.
MediaStreamQualityChanged
The event is raised if a media stream quality change was detected
Declaration
public event EventHandler<VideoMediaStreamQualityChangedEventArgs> MediaStreamQualityChanged
Event Type
Type | Description |
---|---|
EventHandler<VideoMediaStreamQualityChangedEventArgs> |
VideoKeyFrameNeeded
If the application has configured the VideoSocket to receive encoded media, this event is raised each time a key frame is needed. Events are serialized, so only one event at a time is raised to the app.
Declaration
public event EventHandler<VideoKeyFrameNeededEventArgs> VideoKeyFrameNeeded
Event Type
Type | Description |
---|---|
EventHandler<VideoKeyFrameNeededEventArgs> |
VideoMediaReceived
If the application has configured the VideoSocket to receive media, this event is raised each time a frame of video media is received. Once the application has consumed the buffer, it must call the buffer's Dispose() method.
Declaration
public event EventHandler<VideoMediaReceivedEventArgs> VideoMediaReceived
Event Type
Type | Description |
---|---|
EventHandler<VideoMediaReceivedEventArgs> |
Remarks
The incoming video frame rate is variable. The frame rate can vary between 1.875 frames per second (fps) up to 30 fps. The application must be able to receive up to 30 video buffers per second. Events are serialized, so only one event at a time is raised to the app. The event handler should return as quickly as possible; any time-consuming per-frame processing should be performed asynchronously from the event handler.
VideoReceiveStatusChanged
If the application has configured the VideoSocket to receive media, this event is raised to inform the application when it is ready to receive media. When the status is active the application can subscribe to a video source, when inactive video subscription won't be allowed
Declaration
public event EventHandler<VideoReceiveStatusChangedEventArgs> VideoReceiveStatusChanged
Event Type
Type | Description |
---|---|
EventHandler<VideoReceiveStatusChangedEventArgs> |
VideoSendStatusChanged
If the application has configured the VideoSocket to send media, this event is raised to inform the application when it may begin sending media and when it should stop. The application cannot send media before receiving a VideoMediaSendStatusChanged event indicating the SendStatus is Active, such media will be discarded.
Declaration
public event EventHandler<VideoSendStatusChangedEventArgs> VideoSendStatusChanged
Event Type
Type | Description |
---|---|
EventHandler<VideoSendStatusChangedEventArgs> |