多媒体文件转码优化解决方案

随着网络流媒体的兴起,多媒体文件的平均大小急剧增加,这导致文件转换时间也随之增加。1GB以上的文件并不罕见,即使是针对多核CPU优化的编解码器,转换这些文件也可能需要超过20分钟。一种解决方案是将文件分割,并在多台计算机上并行转换每个部分。例如,一个超过1.5GB的文件,在单台8核机器上转换需要超过30分钟,但通过在网络计算机上分布,可以减少到大约5分钟。网格和分布式计算的好处是显而易见的,但实现起来可能是一场噩梦——将音视频文件分别转换可能会导致视频卡顿和音频不同步。然而,LEADTOOLS可以解决这个问题!

LEAD Technologies, Inc. 是一个长期提供对程序员友好的DirectShow工具、处理过滤器和编解码器的供应商。LEAD的最新产品线增加了Elementary Stream DirectShow Filters和Cloud SDK。这些技术结合在一起,可以为处理大量多媒体转码任务提供强大而健壮的解决方案,减少时间,更有效地利用计算资源。

LEADTOOLS SDK中的关键多媒体特性包括:

  • 使用高级.NET、COM和C++编程接口播放、捕获和转换任何DirectShow
  • 高性能的音频和视频编解码器,支持H.264、H.263、MPEG-4、MPEG-2、MJPEG、MJPEG2000、AAC、AC3等
  • MPEG-2传输流与KLV
  • 超过100个DirectShow处理过滤器
  • 视频流和会议
  • 实时捕获与DVR
  • LEADTOOLSCloud SDK无缝集成,用于分布式计算应用
  • Windows Media Foundation SDK正在开发中,即将推出!

包含多媒体技术的SDK产品:

  • LEADTOOLSMultimedia
  • LEADTOOLS Multimedia Suite

多媒体转换代码示例:

本文附带的示例模拟了一个服务器场,其中每个单独的虚拟机(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,并在评估期间利用免费技术支持。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485