的铅MPEG2传输UDP来源将mpeg - 2传输流的数据通过UDP和TCP套接字。但它也可以发挥原始数据通过RTP数据包(H264、JPEG压缩等)。这些格式(如JPEG)包含所需的所有数据流的视频。其他人(例如,H264和未压缩的)需要通过额外信息的URL来描述数据格式。参见下面笔记,讨论如何描述原始H264 (注2),未压缩的视频(注3与动态RTP载荷()和视频注意4)。
的铅MPEG2传输UDP来源将为16秒侦听传入的数据。如果没有收到在这段时间里,负载将会失败。超时的值可以改变使用下面描述的“超时”参数(注5)。
UDP流的字符串的格式如下:
udp://ip_address[:udp_port][/network_card][?param1=val1[¶m2=val2]...[¶mN=valN]]
tcp://ip_address[:udp_port][/network_card][?param1=val1[¶m2=val2]...[¶mN=valN]]
UDP流的字符串的格式如下:
服务器的IP地址发送数据。这可以在平时的Ipv4格式(xxx.xxx.xxx.xxx),也可以是一个有效的主机地址inet_addr接受的标准函数。例如,主机127.0.0.1。
流被认为是多播如果第一个八位字节之间的Ipv4地址是224 . .239 (0 xe0 . .0 xef)。如果第一个八位字节并不在这个范围内,单播流。
(可选)。这是仅用于接收多播流。网卡的地址接收数据。如果是丢失,将使用默认的网卡。
(可选)。的端口号来听。端口必须是一个从1到65535的数字。注意,不应被任何防火墙端口在客户端,在服务器上,或在客户机和服务器之间。
(可选,仅以udp前缀有效)。参数用来描述原始的格式或RTP流包含动态载荷对某些样品。参见下面指出的可能值参数和值。多个参数对应该分开使用&
的性格。
字符串为TCP流的格式如下:
服务器的IP地址发送数据。这可以在平时的Ipv4格式(xxx.xxx.xxx.xxx),也可以是一个有效的主机地址inet_addr接受的标准函数。例如,主机127.0.0.1。
TCP流不能多播。所有TCP流都假定为单播。
p >(可选)。的端口号来听。端口必须是一个从1到65535的数字。注意,不应被任何防火墙端口在客户端,在服务器上,或在客户机和服务器之间。
(可选,仅以udp前缀有效)。参数用来描述原始的格式或RTP流包含动态载荷对某些样品。参见下面指出的可能值参数和值。多个参数对应该分开使用&
的性格。
UDP源过滤器所使用的参数列表。
paramN
这里是一个列表,上面描述的“paramN”参数:
(可选的,默认值是0,没有日志记录)。表明UDP源是否应该记录时间信息,可以用来确定它什么时候开始接收数据。将这个参数设置为1启用日志和0禁用。
记住,日志将增加进程所使用的内存的数量,所以建议您禁用日志记录通过调用ILMUDPSrc::叠梁一旦收到流的开始时间被记录。开始时间可以用来同步两个UDP流收到独立通过记录绝对开始时间为每个流。有两个绝对的开始时间为两个或两个以上的流,一个可以计算时差,并排玩,或使用差异来找出哪些帧同时收到两个流。
必须启用日志记录的ILMUDPSrc: GetReceiveTime工作方法。
(可选的,默认值是16秒)。表明多长时间(以秒为单位)UDP源将等待数据之前放弃。如果没有收到数据在这段时间里,过滤器将返回超时错误IFileSourceFilter:负载
。看到注5为更多的细节。
rtpmap
(可选,只对RTP流或流动态载荷)。用于指定负载类型、压缩和采样率使用的RTP流。看到注2,注3,注意4下面的更多细节。
fmtp
(可选,只对RTP流)。用于提供compression-specific信息。看到注2和注3下面的更多细节。
(可选,只有原始流)。用于提供compression-specific信息。看到注6下面的更多细节。
(可选,仅为原始流。默认值是0 ms)。显示多少时间(以毫秒为单位)原始数据回放开始前应该缓冲。增加这个参数可能实现流畅播放原始流。例如,值500将为0.5秒之前玩视频缓冲数据。这意味着回放直播背后的0.5秒,但视频会更顺利,会容忍差异高达0.5秒在样品到达的时间。
参数用来描述RTP H264视频流。
H264流发送内部RTP数据包使用动态载荷与96年和127年之间的负载类型。这些流只能解码时额外的信息被发送在一个单独的通信通道。最常见的方法发送这个额外的信息是通过会话描述协议(也称为SDP)。描述流的SDP包含额外的信息。UDP源只需要以下几点:
负载的数量和相关的压缩。
RTP的数量单位每秒。
序列头信息,如果没有发送视频流。
UDP源需要这些信息来处理这些流。有两个有用的参数(rtpmap和fmtp),和他们的语法描述如下:
rtpmap = payload_type;压缩/ RTP_units_per_second
payload_type
有效载荷类型的值必须在96年和127年之间,包容性。
压缩
字符串描述压缩。只有H264的支持。
RTP_units_per_second
RTP的数量单位每秒。这个值通常是90000。
这些值通常是通过一个= rtpmap SDP中发送信息,就像下面的例子:99 H264/90000 = rtpmap:
这应该是翻译代替空间用分号(;
):rtpmap = 99; H264/90000
一个示例URL为一个H264流发送到端口40000 RTP数据包的有效载荷99和序列头(NAL单元7和8)发送数据包内压缩流:
udp:/ / 192.168.1.100:40000 ? rtpmap = 99; H264/90000
fmtp = payload_type; sprop-parameter-sets =“seq1 seq2 seqN”
payload_type
有效载荷类型的值必须在96年和127年之间,包容性。它应该rtpmap参数中的值相匹配。
sprop-parameter-sets
序列的base64编码参数。有几个序列头时,用逗号分隔(,
)。通常,有两种序列头。一个双引号(”
)应该添加在列表序列的开始和结束。
这些值通常是通过SDP中发送信息一个= fmtp
线,就像下面的例子:
96 = fmtp: packetization-mode = 1;profile-level-id = 420029;sprop-parameter-sets = Z0IAKeKQFge2BqwYBBuHiRFQ aM48gA = =
在上面的例子中,有两个序列头字符串sprop-parameter-sets后,用逗号分隔。UDP源过滤器只对sprop-parameter-sets领域感兴趣,所以这条线应该翻译成:
fmtp = 96; sprop-parameter-sets =“Z0IAKeKQFge2BqwYBBuHiRFQ aM48gA = =”
和这双应该附加到URL形式是这样的:
udp:/ / 192.168.1.100:40000 ? rtpmap = 99; H264/90000&fmtp = 96; sprop-parameter-sets = " Z0IAKeKQFge2BqwYBBuHiRFQ aM48gA = = "
上述URL语法描述流流在端口40000上,使用H264数据内部RTP数据包有效载荷类型设置为99,与90000 RTP单位每秒和序列的头不流的一部分。相反,他们通过fmtp sprop-parameter-sets组件的参数。
参数用来描述RTP未压缩的视频流。
未压缩流发送内部RTP数据包使用动态载荷与96年和127年之间的负载类型。这些流只能解码额外的信息被发送时使用一个单独的通信通道。最常见的方法格式化这个额外的信息是会话描述协议,也称为SDP。SDP描述流。UDP源只需要以下几点:
负载的数量和相关的压缩。
RTP的数量单位每秒。
视频特征(色彩、宽度、高度和位每通道)。
UDP源需要这些信息来处理这些流。有两个有用的参数(rtpmap
和fmtp
)和他们的语法描述如下:
rtpmap = payload_type;压缩/ RTP_units_per_second
未压缩的视频压缩生
:
rtpmap = payload_type;生/ RTP_units_per_second
fmtp = payload_type;抽样= sampling_mode;宽度= video_width;高度= video_height;深度= bits_per_channel
只能接受以下值:
sampling_mode
:YCbCr-4:2:2
video_width
:任何积极的价值,是2的倍数video_height
:任何积极的价值bits_per_channel
:8
(注意,这意味着每个组件都是8位,并不是说有8位/像素)这是一个有效的例子fmtp
参数:
fmtp = 112;抽样= YCbCr-4:2:2;宽度= 1280;高度= 750;深度= 8
把两个参数一起,这个URL告诉UDP源滤波器加载未压缩,1280 x750 UYVY视频从8003端口:
udp:/ / 192.168.6.101:8003 ? rtpmap = 112;生/ 90000 &fmtp = 112;抽样= YCbCr-4:2:2;宽度= 1280;高度= 750;深度= 8
注意,上面的特定情况下,前几行包含VANC(非视频)数据。有用的视频可能只有720甚至480行。此外,有用的数据可能会从某个列在视频中。在这种情况下,使用导致视频作物过滤器剔除非图像数据,只留下有用的视频部分。这些细节都是设备特定的用来流视频;查阅设备的手动的更多信息。
udp: / / 127.0.0.1:9005
——接收来自127.0.0.1的单播流在端口9005上
udp: / / 224.1.1.1:9005/20.5.1.200
——接收多播流224.1.1.1在端口9005上使用的网卡20.5.1.200的IP地址
tcp: / / 127.0.0.1:9005
——接收TCP流来自127.0.0.1(本地计算机)在端口9005上
udp: / / 192.168.1.100:40000 ? rtpmap = 99; H264/90000
——接收包含原始H264视频序列的单播流头从192.168.1.100在端口40000上。流使用动态RTP数据包有效载荷99型和时间戳单位是1/90000秒。
udp:/ / 192.168.1.100:40000 ? rtpmap = 99; H264/90000&fmtp = 99; sprop-parameter-sets = " Z0IAKeKQFge2BqwYBBuHiRFQ aM48gA = = "
收到一个单播流含有生H264视频没有序列头192.168.1.100在端口40000上。流使用动态RTP数据包有效载荷99型和时间戳单位是1/90000秒。
udp:/ / 192.168.6.101:40000 ? rtpmap = 99;生/ 90000 &fmtp = 99;抽样= YCbCr-4:2:2;宽度= 1280;高度= 720;深度= 8
收到一个单播流包含原始未压缩的视频符合RFC 4175 192.168.6.100在端口40000上。流使用动态RTP数据包有效载荷99型和时间戳单位是1/90000秒。看到注6更多细节的语法在原始未压缩流。
参数用来描述流使用RTP数据包和动态载荷。
标准RTP包有一个静态载荷类型设置为值在内地1 - 34和可以自动识别负载类型。如果RTP数据包有效载荷大于96,UDP源滤波器无法确定格式。在这种情况下,通过指定的流信息rtpmap
在URL参数:
rtpmap = payload_type;压缩/ RTP_units_per_second
支持以下值压缩
(区分大小写):
H264
——H264视频。看到注2的更多信息
生
——原始未压缩的视频。看到注3的更多信息
MPEG2
——在MPEG2 MPEG2视频程序或传输数据包。在这种情况下,RTP_units_per_second
是可选的,因为MPEG2包将包含时间信息
JPEG
——JPEG格式的视频。
udp: / / 192.168.0.149:7800 ? rtpmap = 96; MPEG2
——从192.168.0.149接收单播流在端口7800上包含的MPEG2视频里面RTP数据包有效载荷96。请注意,RTP_units_per_second
是可选的,不是因为指定时间戳都分了时间戳封装内部的MPEG2头。
udp: / / 192.168.0.149:7800 ? rtpmap = 97; JPEG / 90000
——接收单播流从包含JPEG在端口7800上192.168.0.149流在RTP数据包有效载荷96。计时信息使用每秒90000单位。
超时(选择超时= xxx)。
在等待数据,ltmm
发送应用程序EC_LOADSTATUS
消息通知,UDP是等待数据来源。如果用户希望中止等,电话ResetSource
将中止的装载过程E_ABORT
错误。
附加的Timeout = xxx
URL查询字符串来指定一个超时值。xxx是秒的等待多长时间的价值。默认值为16秒。通过0无限等待。
udp: / / ip_address [/ network_card] [: udp_port] ?超时= xxx
超时参数可以结合其他参数使用“&”字符。例如,下面的URL将指定超时60秒,同时加载原始H264流:
udp:/ / 192.168.1.100:40000 ?超时= 60 &rtpmap = 99; H264/90000&fmtp = 96; sprop-parameter -集= " Z0IAKeKQFge2BqwYBBuHiRFQ aM48gA = = "
在上面的例子中,三个参数指定(超时,rtpmap, fmtp)。
该工具包发送EC_LOADSTATUS
与Param1
设置为AM_LOADSTATUS_WAITING_FOR_DATA
和Param2
将经过的毫秒数,因为UDP源开始等待。下面的例子中止等待10秒后:
LRESULT CMainFrame:: OnPlayerNotify(按钮按钮,LPARAM LPARAM)
{
开关(按钮)
{
情况下ltmmPlay_Notify_MediaEvent:
lParam ltmmMediaEvent * pEventParams = (ltmmMediaEvent *);
如果(pEventParams & & pEventParams - > lEventCode = = ltmmEC_LOADSTATUS)
{
如果(pEventParams - > lParam1 = = ltmmAM_LOADSTATUS_PROGRAM_PACKET_RECEIVED)
{
/ / MPEG2传输多路分配器已经发现有多少基本流的mpeg - 2传输流
/ /现在可以告诉它加快负载,只有等待被发现的视频流
ILMMpgDmx * pMpgDmx = GetMPEG2DemuxInterface ();
如果(pMpgDmx)
{
# ifdef EXCLUDE_NONVIDEO_STREAMS
CMPEG2DemuxCallback: MarkNonVideoStreamsUnimportant (pMpgDmx);
# endif
pMpgDmx - >释放();
}
}
其他的如果(pEventParams - > lParam1 = = ltmmAM_LOADSTATUS_WAITING_FOR_DATA)
如果(pEventParams - > lParam2 > = 10000)
m_player - > ResetSource ();/ /终止加载如果需要超过10秒
}
}
}
参数用来描述原始(non-RTP)流。
一些设备,像DM6467德州仪器编码器将原始H264流没有封装压缩数据流在RTP数据包。对于这些流,数据发送MPEG包前缀00 00 01
字节序列。这些数据包的顺序头可能以罕见的间隔或可能永远不会被发送。对于这些流,使用比较参数,通过压缩和序列头被这条小溪。
即使序列头作为流程的一部分,传递回放会更快如果你通过序列头作为URL的一部分。如果你不通过序列头在URL中,回放才会开始收到标题序列。
语法如下:
comp =压缩(;seq-headers =“xxx”)
压缩可以是下列之一:MPEG2
,MPEG4
,或H264
。
seq-headers
是一个可选参数,指明特定的序列头压缩的二进制值转换为ascii。每个字节0 xab
转换成字符串AB
。例如,字节序列0 x00 0 x00 0 x01 0 x67 0×
转换成字符串0000016742
。
生H264流可以表示如下:
comp = H264; seq-headers =“0000000167428028 f40481c8800000000168de3c80”
udp:/ / 127.0.0.1:5678 ? comp = H264
接收原始H264流从5678端口不封装在RTP数据包。序列头被发送作为流的一部分。
udp:/ / 127.0.0.1:5678 ? comp = H264; seq-headers =“0000000167428028 f40481c8800000000168de3c80”
00 00 01 67 42 80
[…]德3 c 80
序列头。