Dobrý den,
mám za úkol vytvořit program pro příjem multimediálních dat ze serveru (použit bude VLC a Darwin Streaming Server).
Pro příjem dat bude použitý protokol RTP/RTCP a později také RTSP. V programování jsem začátečník, ale snažím se naučit co nejvíc, bohužel náročnost tohoto úkolu přesahuje moje možnosti.
V současné době jsem si našel knihovnu (RTP/RTCP - http://www.streamcoders.com/products/rtpnet.html ) a přijímám data viz. screen :
Zdrojový kód:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using StreamCoders.Network;
using System.Windows.Forms;
namespace RtpNetCsharp
{
class RtpFramer
{
public RtpFramer(String RTPipAddress, int RTPport, String RTCPipAddress, int RTCPport, bool forward, String forwardIP, int forwardPort)
{
previousTS = 0;
forwardPackets = forward;
session = new RTPSession();
receiver = new RTPReceiver();
IPEndPoint rtpEp = new IPEndPoint(IPAddress.Parse(RTPipAddress), RTPport);
IPEndPoint rtcpEp = new IPEndPoint(IPAddress.Parse(RTCPipAddress), RTCPport);
participant = new RTPParticipant(rtpEp, new IPEndPoint(IPAddress.Parse(forwardIP), forwardPort), rtcpEp, new IPEndPoint(IPAddress.Any, 0));
if(forwardPackets)
{
sender = new RTPSender();
IPEndPoint senderEP = new IPEndPoint(IPAddress.Parse(forwardIP), forwardPort);
sender.AddParticipant(participant);
session.AddSender(sender);
}
session.NewRTPPacket = NewRTPPacket;
session.NewRTCPPacket = NewRTCPPacket;
receiver.AddParticipant(participant);
session.AddReceiver(receiver);
}
public void Terminate()
{
session.RemoveReceiver(receiver);
session.RemoveSender(sender);
receiver.Dispose();
sender.Dispose();
participant.Dispose();
}
bool NewRTPPacket(RTPPacket packet, byte[] rawBuffer)
{
if (forwardPackets)
session.SendPacket(packet);
Console.WriteLine(packet.ToString());
return true;
}
void NewRTCPPacket(RTCPCompoundPacket packet)
{
Console.WriteLine(packet.ToString());
}
private RTPSession session;
private RTPReceiver receiver;
private RTPParticipant participant;
private RTPSender sender;
private RTPParticipant senderParticipant;
private bool forwardPackets;
private int previousTS;
}
class Program
{
static void Main(string[] args) //výchozí třída, která všechno řídí, volám všechnu obsluhu
{
if (args.Length < 4)
{
Console.WriteLine("-rtpif RTP local interface IP address");
Console.WriteLine("-rtpport RTP local port");
Console.WriteLine("-rtcpif RTCP local interface IP address");
Console.WriteLine("-rtcpport RTCP local port");
Console.WriteLine("-forward IPaddress port");
//return;
}
String rtpIP = "";
int rtpPort = 0;
String rtcpIP = "";
int rtcpPort = 0;
String forwardIP = "";
int forwardPort = 0;
bool forward = false;
for (int i = 0; i < args.Length; i++)
{
if (args[i].ToUpper() == "-RTPIF")
{
rtpIP = args[i + 1];
i++;
}
if (args[i].ToUpper() == "-RTCPIF")
{
rtcpIP = args[i + 1];
i++;
}
if (args[i].ToUpper() == "-RTPPORT")
{
rtpPort = int.Parse(args[i + 1]);
i++;
}
if (args[i].ToUpper() == "-RTCPPORT")
{
rtcpPort = int.Parse(args[i + 1]);
i++;
}
if(args[i].ToUpper() == "-FORWARD")
{
i++;
forwardIP = args[i++];
forwardPort = int.Parse(args[i++]);
forward = true;
}
}
rtpIP = "127.0.0.1";
rtcpIP = "127.0.0.1";
rtpPort = 5004;
rtcpPort = 5005;
forward = true;
forwardIP = "127.0.0.1";
forwardPort = 5005;
RtpFramer framer = new RtpFramer(rtpIP, rtpPort, rtcpIP, rtcpPort, forward, forwardIP, forwardPort); //frame=okno
Console.WriteLine("Endpoint created. Terminate with any key.");
Console.ReadKey();
}
}
}
Potřeboval bych poradit jak vypsat informace o příjmu dat
Console.WriteLine(packet.ToString());
do formuláře (místo cmd, jak je to nyní). Dále bych se chtěl zeptat, jak převést příjmaná data na obraz/video.
Pavel