扩展Win Embedded CE 6.0的媒体功能

时间:2014-12-01 22:12:30

标签: visual-studio ffmpeg windows-ce cross-compiling codec

我有一个以WinCE 6.0为操作系统的嵌入式设备。制造商为其提供了第三方开发的IDE。 IDE几乎只允许

  • 从主应用程序的各种事件调用的.NET 3.5 Compact Framework脚本
  • 将文件添加到设备。

附带的媒体播放器似乎正在使用DirectShow,而操作系统只有mpeg-1编码视频播放的媒体编解码器。 我的目标是能够在主应用程序中播放使用其他编解码器编码的媒体

我已经设法使用DirectShowNETCF(.NET Compact Framework的DirectShow包装器)并成功播放mpeg-1编码视频。

我对这些东西全新,我有很多(愚蠢的)问题。我会试着缩小范围:

  • 操作系统基于WinCE,但据我所知,它实际上总是有一些自定义版本(通过Platform Builder)。之后只为其开发任何东西的“正确方法”是使用制造商通常提供的SDK。对?就我而言,SDK非常有限,并且如上所述紧密集成到IDE中。但是,.NET CF 3.5能够互操作,因此可以调用本机库 - 只要它们是为正确的平台编译的。

  • 编译代码几乎只是处理器(汇编代码)的指令,编译器根据目标处理器设置选择正确的指令。还有PE-header定义了程序在哪个平台上运行。如果我将我的“helloworld.exe”(除了返回特定的退出代码之外什么都没有)定位到x86并用VC编译它,它应该有效吗?

  • 如果PE-header实际上是问题,是否可以在没有SDK的情况下为WINCE设置?我真的需要整个SDK来创建一个只使用基类型的简单可执行文件吗?我正在使用VS2010,它甚至不再支持智能设备dev了,我不想仅仅为了测试目的而降级。

  • 以上问题是我实际想法的前提:为WinCE移植ffmpeg / ffdshow。这实际上已经exists,但不是针对英特尔凌动的目标或构建。评论

  • 如果本机实现不可行,我最终会用C#实现一些特定的编解码器......那可能是一项相当大的任务。但是必须选择C#而不是本机,我是否会遇到编解码器性能问题?我的意思是...... C#慢得多吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

我没见过装有自己IDE的OEM,但肯定有可能。但是,这不应该改变应用程序的创建方式。他们可能已经做了大量的工作来确保他们的IDE工作中只有一些东西可以工作,但这样做的工作量不大,所以我认为这不太可能。

至于你的具体问题:

  • 操作系统 Windows CE,而不是“基于”它。然而,操作系统是组件化的,因此并非所有部件都可用。 SDK通常提供过滤掉不可用内容的机制。您实际上可以使用任何针对正确的处理器体系结构的SDK,但如果您的应用程序调用库以查找不在操作系统中的内容,那么您至少会遇到错误。对于托管代码,这一切都不相关,因为CF不是组件化的。如果它在那里,CF应用程序可以运行(如果不是,你可以经常安装它)。这意味着如果平台支持CF,那么您可以编写CF应用程序并运行它。然后该应用程序可以通过P / Invoke调用本机内容(当然,除非操作系统创建者决定添加安全性以防止这种情况。这在操作系统中是可行的,尽管我从未见过它实现过。)
  • 是的,编译的代码只是“说明”。对于原生,是的,它们是处理器指令。对于托管,它们是MSIL指令,托管运行时在JIT时转换为处理器指令。如果您的目标是ARM平台,则不能使用x86编译器。从广义上讲,您需要使用支持Windows CE的正确Microsoft编译器,并使用正确的开关调用该编译器,不仅要告诉它处理器体系结构,还要告诉目标操作系统,因为需要完成的链接会因此而异。操作系统级API甚至C运行时。除此之外,对于您的平台,您需要使用Visual Studio 2008 Pro。
  • 对于本机应用程序,您需要一些针对相同操作系统版本(CE 6.0)和处理器体系结构(例如ARMv4I)的SDK。使其与OS功能集匹配也很有用,但不是必需的。对于托管代码,您可以使用Studio附带的SDK,因为托管代码不依赖于处理器。但是,你必须回到Studio 2008,因为2010年没有任何WinCE编译器。
  • 如果您找到了现有的库,那么您可以尝试使用它。可能阻碍你进步的事情是:A)它不太可能使用你拥有的SDK,所以你可能需要创建新的项目文件(痛苦,但可行)和B)如果它使用你的操作系统中没有的功能,那么你就有了解决这些问题。如果你缺少操作系统功能,你可能运气不好,但如果它已经有媒体播放器和编解码器,我怀疑你会没事。
  • 不要在托管代码中实现此功能。说真的,就是不要这样做。您可以...吗?是。性能可能几乎相同,只是为了避免GC口吃,你将不得不基本上创建自己的内存管理器。这条路径所涉及的工作量非常非常大。