65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 LEADTOOLS 处理 MPEG-2 传输流

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年4月1日

CPOL

5分钟阅读

viewsIcon

22091

本白皮书将深入探讨MPEG-2传输流的众多优势和用途,以及如何使用LEADTOOLS多媒体SDK将其集成到您的应用程序中。

引言

就像许多蓬勃发展的行业一样,音频和视频流媒体依靠着大量的技术来支撑,这些技术扮演着各种各样的角色,从高端军用无人机到家庭娱乐,以及介于两者之间的一切。这些技术包括编解码器中的音频和视频压缩算法、多路复用器、解多路复用器以及将它们变为现实的应用程序。在这些技术中,MPEG-2传输流已成为最通用和广泛使用的视频流格式之一。

当涉及到在无人机、监控和安全等高风险场景中实时流式传输多媒体内容时,您需要极其可靠的解决方案,因为他人的生命和福祉正处于危险之中。本白皮书将深入探讨MPEG-2传输流的众多优势和用途,以及如何使用LEADTOOLS多媒体SDK将其集成到您的应用程序中。

MPEG-2传输流的优势和用途

MPEG-2传输流(MPEG-2 TS)就像您最喜欢的摇滚乐队的鼓手。您可能不知道他的名字,即使他站在您身边也认不出他。然而,没有他,您喜爱的音乐将大打折扣,甚至可能根本不存在。MPEG-2传输流是您日常受益的许多多媒体技术的核心,例如蓝光、点播视频服务、安全和交通监控系统、侦察无人机等,为您提供娱乐,并在您生活的同时确保您安全可靠。这种广泛的应用并非偶然。它通过一个设计精良的规范获得,该规范支持跨越各种媒介和场景的音频和视频流式传输。

MPEG-2传输流是一种灵活的容器格式,可以采用多种视频格式,包括MPEG-2、MPEG-4或h.264视频,并与AAC、AC3或MPEG-1音频结合。每种格式都有其优点,但最受欢迎的解决方案是h.264视频搭配AAC音频。这种组合在质量和带宽方面都达到了最佳,使其成为涉及实时、无线传输或使用TCP或UDP协议的慢速连接的理想选择。

在选择音频和视频编解码器时,还有其他考虑因素。MPEG-4和MPEG-2等帧间压缩格式在更高的比特率和带宽下表现更好,非常适合通过光盘、DVR或电视直播进行录制和播放。

最后,MPEG-2传输流最重要的特性之一是能够嵌入非破坏性的键值(KLV)元数据。与永久将时间戳、坐标和其他信息刻录到视频数据中的破坏性方法不同,KLV可以以非常紧凑且对实时流高效的方式存储大量文本元数据。观看应用程序可以显示任意数量的元数据,非常适合实现隐藏式字幕或自定义播放器。它也比破坏性元数据更高效,因为二进制编码格式所需的CPU操作比大多数将文本刻录到图像中的图像处理例程要少。

使用LEADTOOLS的MPEG-2传输流

LEADTOOLS将其高层SDK(用于.NET和C/C++)将通常复杂的DirectShow和Media Foundation项目转化为简单的任务。MPEG-2传输流相关的每个主要活动,包括发送、接收和处理KLV元数据,都可以通过几行代码完成。

使用KLV元数据流式传输MPEG-2传输

多媒体应用程序的所有核心组件(捕获、转换和播放)都打包到易于使用的、高级的.NET对象(如下面示例所示)或COM对象中。无论您是使用CaptureCtrl捕获实时视频和音频,还是转换现有文件使用ConvertCtrl,在选择源之后,将结果输出到磁盘或实时流都遵循相同的步骤。

使用LEADTOOLS,您无需手动构建DirectShow Graph或Media Foundation Topology,只需设置源、目标和所需的格式,LEADTOOLS就会在后台为您处理所有繁重的工作。您还可以随时获取任何过滤器的实例,以微调您的设置,包括质量、压缩、比特率填充、电视广播规范合规性等。

// Set up the Convert Control
_convertCtrl.SourceFile = srcFile;
_convertCtrl.AllowedStreams = StreamFormatType.AudioVideoCC;
_convertCtrl.PreferredMPEG2Splitter = Constants.Filter_MPEG2_Transport_Demux;
_convertCtrl.TargetFormat = TargetFormatType.MPEG2Transport;
_convertCtrl.TargetFile = @"udp://127.0.0.1:9005";

// Get the MPEG-2 Multiplexer from the graph and change some settings
LMMpg2MxT mux = _convertCtrl.GetSubObject(ConvertObject.TargetFilter) asLMMpg2MxT;
if (mux != null)
{
   mux.ResyncInterval = 10;
   Marshal.ReleaseComObject(mux);
}

// Start converting to stream
_convertCtrl.StartConvert();

LEADTOOLS提供了创建和解析任何KLV数据所需的一切。您拥有完全的控制权,因此可以进行自己的自定义实现,或者遵循标准,例如运动图像标准委员会(MISB)制定的各种UAV元数据集。

// write a timestamp key
double longitude = -80.8433333;
double latitude = 35.2269444;
string platform = "LEAD Demo";

// clear out any existing data
m_pMpgMux.KlvBuilder.Clear();

// write the UDS timestamp
m_pMpgMux.KlvBuilder.InsertUInt64(-1, 
   "06 0E 2B 34 01 01 01 03 07 02 01 01 01 05 00 00", (ulong)timestamp);

// write the UDS sensor latitude
m_pMpgMux.KlvBuilder.InsertDouble(-1, 
   "06 0E 2B 34 01 01 01 03 07 01 02 01 02 04 02 00", latitude);

// write the UDS sensor longitude
m_pMpgMux.KlvBuilder.InsertDouble(-1, 
   "06 0E 2B 34 01 01 01 03 07 01 02 01 02 06 02 00", longitude);

// write the UDS platform designation
m_pMpgMux.KlvBuilder.InsertString(-1, 
   "06 0E 2B 34 01 01 01 01 01 01 20 01 00 00 00 00", platform);
LMMpg2MxTLib.ILMKlvBuilder group;
group = m_pMpgMux.KlvBuilder.CreateGroup(
   "06 0E 2B 34 02 0B 01 01 0E 01 03 01 01 00 00 00");

// write the LDS timestamp
group.InsertLocalUInt64(-1, 2, (ulong)timestamp);

// write the LDS sensor latitude
group.InsertLocalInt32(-1, 13, 
   (int)Math.Floor(0xFFFFFFFE / 180.0 * latitude + 0.5));

// write the LDS sensor longitude
group.InsertLocalInt32(-1, 14, 
   (int)Math.Floor(0xFFFFFFFE / 360.0 * longitude + 0.5));

// write the LDS platform designation
group.InsertLocalString(-1, 10, platform);

// write the LDS checksum
group.AppendLocalChecksum(1, null);

// insert the UAS Datalink Local Metadata Set into the main builder
m_pMpgMux.KlvBuilder.InsertGroup(-1, null, group);

// get the full builder data and write it to the output
m_pMpgMux.WritePrivateData(
   (int)LMMpg2MxTLib.Mpg2MxT_WriteFlags.Mpg2MxT_WriteFlag_PTSValid | 
   (int)LMMpg2MxTLib.Mpg2MxT_WriteFlags.Mpg2MxT_WriteFlag_PTSInSeconds, 
   (double)elapsed / 1000.0, m_pMpgMux.KlvBuilder.GetData(), -1);

// close the stream
m_pMpgMux.ClosePrivateData();

连接和播放实时MPEG-2传输流

同样,PlayCtrl的音频和视频播放是为程序员设计的,只需要很少的代码即可设置和播放文件或实时流,同时仍然为更高级、定制化的应用程序提供底层访问和控制。在大多数情况下,播放文件或流与设置SourceFile属性一样简单。

_playctrl.SourceFile = "udp://127.0.0.1:9005?Timeout=16";

LEADTOOLS中的其他MPEG-2传输流功能

LEADTOOLS的强大功能不仅限于捕获、转换、播放和流式传输。它还有更多功能可以轻松集成到您的MPEG-2传输流应用程序中,以创建功能齐全、全面的产品。各种音频和视频处理过滤器,包括运动检测、视频稳定器、去隔行、帧率控制器等,可以添加到您的流或文件中。此外,完整的数字视频录像机(DVR)功能,包括暂停、倒带、跳转到实时等,有助于将您的娱乐、安全或监控应用程序提升到一个全新的水平。

结论

所有这些功能与上述MPEG2-传输流功能结合在一起,使LEADTOOLS成为市场上最可靠、最灵活、对程序员最友好的多媒体SDK。

下载完整的MPEG-2传输流示例

您可以下载包含上述功能的完整功能演示。要运行此示例,您需要以下条件:

  • LEADTOOLS 免费 60 天试用版
  • Visual Studio 2008 或更高版本
  • 浏览LEADTOOLS示例文件夹(例如,C:\LEADTOOLS Multimedia 18\Examples\),您可以在其中找到此示例以及LEADTOOLS中更多技术的示例项目。

支持

需要帮助来运行此示例吗? 联系我们的支持团队,获得免费技术支持!有关价格或许可问题,您可以联系我们的销售团队(sales@leadtools.com)或致电704-332-5532。

© . All rights reserved.