随着网络流媒体的兴起,多媒体文件的平均大小急剧增加,这导致文件转换时间也随之增加。1GB以上的文件并不罕见,即使是针对多核CPU优化的编解码器,转换这些文件也可能需要超过20分钟。一种解决方案是将文件分割,并在多台计算机上并行转换每个部分。例如,一个超过1.5GB的文件,在单台8核机器上转换需要超过30分钟,但通过在网络计算机上分布,可以减少到大约5分钟。网格和分布式计算的好处是显而易见的,但实现起来可能是一场噩梦——将音视频文件分别转换可能会导致视频卡顿和音频不同步。然而,LEADTOOLS可以解决这个问题!
LEAD Technologies, Inc. 是一个长期提供对程序员友好的DirectShow工具、处理过滤器和编解码器的供应商。LEAD的最新产品线增加了Elementary Stream DirectShow Filters和Cloud SDK。这些技术结合在一起,可以为处理大量多媒体转码任务提供强大而健壮的解决方案,减少时间,更有效地利用计算资源。
LEADTOOLS SDK中的关键多媒体特性包括:
包含多媒体技术的SDK产品:
多媒体转换代码示例:
本文附带的示例模拟了一个服务器场,其中每个单独的虚拟机(FrmTranscoder)被分配了音视频文件的一部分进行转换。
DirectShow转码:
LEADTOOLS Multimedia SDK包括一个高级.NET接口,通过自动构建图表、连接引脚、设置编码器属性等,简化了DirectShow编程的困难。要转换文件,只需创建一个Leadtools.Multimedia.ConvertCtrl,设置转换设置,如音视频编码器和源/目标文件,LEADTOOLS就会完成其余的工作。以下是示例中FrmTranscoder_Load事件的代码片段:
_transcodeData.TranscodeResult.Status = LTESHelper.Status.Working;
convertCtrl1 = new ConvertCtrl();
convertCtrl1.LoadSettingsFromFile(_transcodeData.SettingsFile, ConvertSettings.Compressors);
convertCtrl1.TargetFormat = TargetFormatType.LTES;
convertCtrl1.Complete += new EventHandler(convertCtrl1_Complete);
convertCtrl1.ErrorAbort += new ErrorAbortEventHandler(convertCtrl1_ErrorAbort);
convertCtrl1.Progress += new ProgressEventHandler(convertCtrl1_Progress);
convertCtrl1.SourceFile = _transcodeData.Sourcefile;
convertCtrl1.TargetFile = _transcodeData.DestFile;
convertCtrl1.StartConvert();
基础流过滤器:
LEAD基础流源和写入器过滤器智能选择和同步分割/合并点。它们允许大文件被分割,分别转换,然后重新组合成一个与单进程转换无法区分的文件。
转换任务是通过使用ConvertCtrl并设置TargetFormat属性为TargetFormatType.LTES来启动的。当调用StartConvert时,基础流写入器开始工作,将音视频流分割成单独的文件,并保存目录XML文件,用于跟踪每个剪辑或片段的位置。如下所示,从单个文件中制作了四个剪辑(3个视频和1个音频):
<?xml version="1.0" encoding="utf-8"?>
<ltesCatalog>
<stream id="stream 1" type="{73646976-0000-0010-8000-00AA00389B71}">
<clip src="split-1-c1.ltes" start="0" duration="1349333333"/>
<clip src="split-1-c2.ltes" start="0" duration="1350000000"/>
<clip src="split-1-c3.ltes" start="0" duration="1337333334"/>
</stream>
<stream id="stream 2" type="{73647561-0000-0010-8000-00AA00389B71}">
<clip src="split-2.ltes" start="0" duration="4037021315"/>
</stream>
</ltesCatalog>
现在源文件被分割了,每个块可以在计算机(在这个例子中,FrmTranscoder)之间分配。每个虚拟机完成后,使用基础流读取器将它们重新组合在一起以获得最终结果。
int machineCounter = 1;
for (int streamIndex = 0; streamIndex < splitCatalogStreams.Length; streamIndex++)
{
for (int clipIndex = 0; clipIndex < splitCatalogStreams[streamIndex].Clips.Length; clipIndex++)
{
LTESHelper.TranscodeData transcodeData = new LTESHelper.TranscodeData();
// Create the virtual machine and set its transcode data
transcodeData.Sourcefile = Path.Combine(_txtTempFolder.Text, splitCatalogStreams[streamIndex].Clips[clipIndex].SourcePath);
string newFilename = splitCatalogStreams[streamIndex].Clips[clipIndex].SourcePath.Replace("split", "merge");
transcodeData.DestFile = Path.Combine(_txtTempFolder.Text, newFilename);
// Update the file path for the merge catalog
mergeCatalogStreams[streamIndex].Clips[clipIndex].SourcePath = newFilename;
transcodeData.SettingsFile = _conversionSettingsPath;
transcodeData.MachineName = splitCatalogStreams[streamIndex].Type == Constants.MEDIATYPE_Video ?
String.Format("Transcoder {0} (Video)", machineCounter) :
String.Format("Transcoder {0} (Audio)", machineCounter);
transcodeData.TargetFormat = LTMMFormatToLTESFormat(tempConverter.TargetFormat);
FrmTranscoder transcoder = new FrmTranscoder();
transcodeMachines.Add(transcoder);
transcoder.TranscodeData = transcodeData;
transcoder.PreviewVisible = _chkEnablePreview.Checked;
transcoder.MdiParent = this.MdiParent;
transcoder.FormClosed += new FormClosedEventHandler(transcoder_FormClosed);
transcoder.Show();
Log(String.Format("Sent {0} to {1}", transcodeData.Sourcefile, transcodeData.MachineName));
machineCounter++;
}
}
云集成:
即使在同一台机器上,上述解决方案也可以显著减少总转换时间,因为可以利用更多的CPU。如果需要更多的处理能力,云SDK提供了一个易于使用的框架,用于在任意数量的工作机器之间管理分布式任务。虽然附带的示例项目只是一个仿真器,但它可以很容易地移植到使用LEADTOOLS Cloud SDK,其中FrmMain和FrmSettings构成中央服务器,FrmTranscoder被重构为在每个单独的工作机器上执行的DLL。
结论:
LEADTOOLS为开发者提供了世界上性能最佳、最稳定的图像库,通过易于使用的高级编程接口,实现业务关键应用程序的快速开发。多媒体/DirectShow转码只是LEADTOOLS提供的众多技术之一。有关其他产品的更多信息,请务必访问主页,下载一个免费的完全功能的评估SDK,并在评估期间利用免费技术支持。