Play out a stream using NDI
Playing out a stream using NDI is similar to sending a stream to any other renderer. Just use "NDI Renderer" in your devices list.
MPlatform SDK
// Create a renderer object
MRendererClass m_objRenderer = new MRendererClass();
// Set the NDI Renderer device
m_objRenderer.DeviceSet("renderer", "NDI Renderer", "");
// Start renderer.
// It receives a stream form m_objPlaylist (MPlaylist) and out put to NDI
m_objRenderer.ObjectStart(m_objPlaylist);MFormats SDK
// Create a renderer object
MFRendererClass m_objRenderer = new MFRendererClass();
// Set the NDI Renderer device
// Please note that I am setting a 0 device assuming that NDI Renderer is the only device in a system.
// If you have multiple renderers, enumerate them with DeviceGetCount and DeviceGetByIndex first to get the NDI renderer index
m_objRenderer.DeviceSet(eMFDeviceType.eMFDT_Video, 0, "");
//... make a separate thread that you use to process your frames
MFFrame pFrame; mySource.SourceFrameGet(-1, out pFrame, "");
// Send the frame to the renderer in a loop
m_objRenderer.ReceiverFramePut(pFrame, -1, "");By default, an output stream name has the following structure:
[Source_Machine_Name] (Stream_Name)
for example, "MyPC (MFormats NDI)"
where Source_Machine_Name is a name of a source PC, and Stream_Name is an actual name of the stream. By default, Stream_Name = MFormats NDI. To change this, you should set an output line for the renderer object.
MPlatform SDK
m_objRenderer.DeviceSet("renderer::line-out", "My Custom Name", "");MFormats SDK
m_objRenderer.PropsSet("line-out", "My Custom Name");Receiving an NDI stream
To receive an NDI source stream you should use a live source object and initialize the "NDI Receiver" device just like any other capture card. The available NDI sources in your LAN are represented as input lines of the device.
Please note that it takes some time for NDI devices to register in a network. So you might require refreshing the input lines list few times to get the proper NDI sources list.
MPlatform SDK
// Create MFLive Class instance
MLiveClass m_objMLive = new MLiveClass();
// Set the NDI Renderer live source
m_objLive.DeviceSet("video", "NDI Receiver", "");
// Get Input lines number.
// The input lines for NDI device represents NDI stream sources available in a network
int lCount = 0;
m_objLive.DeviceGetCount(0, "video::line-in", out lCount);
// Get available NDI stream sources by input lines enumeratng.
// Please note that NDI requires some time to register the device in a network,
// so you might heed to refresh the devices list several times until you will see your source
if (lCount > 0)
{
for (int i = 0; i < lCount; i++)
{
string strName;
string strDesc;
m_objMLive.DeviceGetByIndex(0, "video::line-in", i, out strName, out strDesc);
}
}
// Specify required stream source by seting the input line property.
m_objMLive.DeviceSet("video::line-in", "NIL (MFormats NDI) NDI Source at 192.168.0.3:23545 IP", "");
// Start live source object
m_objMLive.ObjectStart(null);MFormats SDK
// Create MFLive Class instance
MFLiveClass m_objLive = new MFLiveClass();
// Set the NDI Renderer live source
// Please note that I am setting a 0 device assuming that NDI Renderer is the first device in a system.
// If you have multiple live sources, enumerate them with DeviceGetCount and DeviceGetByIndex first to get the NDI live source index
m_objLive.DeviceSet(eMFDeviceType.eMFDT_Video, 0, "");
// Get Input lines number.
// The input lines for NDI device represents NDI stream sources available in a network
m_objLive.PropsOptionGetCount("line-in", out lCount);
// Get available NDI stream sources by input lines enumeratng.
// Please note that NDI requires some time to register the device in a network,
// so you might heed to refresh the devices list several times until you will see your source
if (lCount > 0)
{
for (int i = 0; i < lCount; i++)
{
string _pOptions;
string _pHelp;
m_objLive.PropsOptionGetByIndex("line-in", i, out _pOptions, out _pHelp);
}
}
// Specify required stream source by seting the line in property.
// Let's assume I need to connect to the first streamer
m_objLive.PropsOptionSetByIndex("line-in", 0);
//... make a separate thread that you will use to process your frames
// Start taking frames from your live source in a loop
m_objLive.SourceFrameGet(-1, out pFrame, "");Important note: In the Video SDKs it is not possible to configure or control the NDI decoder behavior.
This is because newer versions of NDI and NDI-HX manage decoding automatically. The system decides how to decode the stream on its own, based on the use case and available hardware. External settings or registry keys can no longer change this behavior.
In modern NDI and NDI-HX versions, hardware acceleration is usually enabled automatically when it is beneficial, so manual control is not available anymore.