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

使用 LEADTOOLS 跨多台计算机进行多媒体转码

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012年4月1日

CPOL

4分钟阅读

viewsIcon

36108

downloadIcon

475

网格和分布式计算的好处已经确立且无可争议。然而,实现它们可能是一场噩梦——将音频/视频文件分块转换可能会导致视频卡顿和音频不同步——但使用LEADTOOLS就不会有问题!

引言

高清电视、电脑显示器和在线流媒体的普及导致多媒体文件的平均大小急剧增加,随之而来的是转换这些文件所需的时间。大于 1 GB 的文件并不罕见,即使是针对多核 CPU 进行了优化的编解码器,也可能需要 20 多分钟才能将这些文件从一种格式转换为另一种格式。

一种解决方案是将文件分割并在多台计算机上并行转换每个部分。例如,一个大于 1.5 GB 的文件,在单台 8 核机器上转换需要 30 多分钟,但在网络计算机之间分散后,可以将时间缩短到约 5 分钟。网格和分布式计算的好处已经确立且无可争议。然而,实现它们可能是一场噩梦——将音频/视频文件分块转换可能会导致视频卡顿和音频不同步——但使用LEADTOOLS就不会有问题!

LEAD Technologies, Inc. 一直是程序员友好的 DirectShow 工具、处理过滤器和编解码器的长期提供商。LEAD 的 多媒体产品线 的最新 additions 是 **Elementary Stream DirectShow Filters** 和 Cloud SDK。这些技术结合起来,可以创建一个强大而健壮的解决方案,以更少的时间和更高效的计算资源利用率处理大量多媒体转码作业。

LEADTOOLS SDK 中的关键多媒体功能

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

包含多媒体技术的 SDK 产品

多媒体转换代码

本文附带的示例模拟了一个服务器场,其中每个单独的虚拟机 (FrmTranscoder) 负责转换音频/视频文件的一部分。

DirectShow 转码

LEADTOOLS 多媒体 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 基本流源和写入器过滤器会智能地选择和同步拆分/合并点。它们允许将大文件分割、单独转换,然后重新组合成一个与单个进程转换的文件无法区分的文件。

转换任务通过使用 TargetFormat 属性设置为 TargetFormatType.LTES 的 ConvertCtrl 来启动。当您调用 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 catlog
      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。如果需要更多的处理能力,Cloud SDK 提供了一个易于使用的框架来管理任意数量的辅助机器之间的分布式任务。

虽然本文附带的示例项目只是一个模拟器,但它可以轻松移植到使用 LEADTOOLS Cloud SDK,其中 FrmMain 和 FrmSettings 构成中心服务器,FrmTranscoder 被重构为一个 DLL,该 DLL 在每个辅助机器上执行。

结论

LEADTOOLS 以易于使用的、高级的编程接口为开发人员提供了世界上性能最佳、最稳定的成像库,从而能够快速开发关键业务应用程序。

多媒体/DirectShow 转码只是 LEADTOOLS 提供的众多技术之一。有关我们其他产品的更多信息,请务必访问我们的 主页,下载完全功能的免费评估 SDK,并在您的评估期间享受我们的免费技术支持。

下载完整的多媒体示例

您可以下载一个功能齐全的演示,其中包括上面讨论的功能。 要运行此示例,您需要以下内容

支持

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

© . All rights reserved.