3

我们基于 Flash 网络的应用程序会播放大量音频用于旁白和音效。我们的一些客户有阻止下载 MP3 和其他音频文件的防火墙规则。因此,我们需要将这些 MP3 文件包装在 SWF 中。过去,我编写了自动化 Flash IDE 的 JSFL 脚本,并通过一组复杂而脆弱的步骤将 MP3 文件嵌入 FLA,然后将它们发布到 SWF。现在,Flex SDK 提供了 mxmlc 编译器。我已经将 ANT 混合到我们的工作流程中,并且命令行和自动构建是一种乐趣。所以,我想让 MP3 的转码或包装成为我们构建过程的一部分。我在 Pure AS3 的编译时发现了嵌入资产,但这需要我编写一个脚本来生成一个包装类 AS 文件。有没有更简洁的方法将 MP3 文件打包或转码为 SWF?我想我希望有一种方法可以将 mp3 直接传递给 mxmlc 并输出 swf,但是任何比生成 actionscript 包装类更好的建议都将不胜感激。

4

1 回答 1

2

由于您已经在使用 MXMLC 和 Ant,因此您应该考虑在 Ant 构建脚本中添加另一段代码,以将 MP3 构建到库 SWC 中。然后,您可以将该 SWC 构建到可执行的 SWF 中(我在下面的示例中省略了这个简单的步骤)。

由于您只需要 Ant,因此这样做并不比您已经构建 SWF 更困难。唯一真正的“陷阱”是您需要在代码中使用 MXMLC/SWC 友好的绝对路径(例如“/myAssets/myasset.mp3”)嵌入文件。

因为它可以访问项目元数据,所以 Flash Builder “知道”项目的根在哪里,从而允许它使用相对嵌入路径。MXMLC 没有任何此类信息。因此,您需要确保声明嵌入与文件在 SWC 中的存储方式的绝对位置相匹配。如果您这样做,Flash Builder 和 MXMLC/Ant 都将能够理解您的嵌入。这样一来,大家都很开心。

为了帮助您,下面是一个用于构建资产 SWC 的示例 Ant 脚本。简而言之,以下是关键步骤:

  • 构建一个包含要包含的文件位置的字符串,一个一个
  • 使用 MXMLC 和一组怪物大小的命令行参数将这些资产编译成 SWC

以下脚本将 jpgs、pngs、svgs、ttfs、xml 文件、属性文件和 MP3 打包到一个名为“assets.swc”的文件中。您需要在适当的相对位置包含 flexTasks.jar(出于显而易见的原因)和 ant-contrib.jar 并设置 FLEX_HOME 环境变量。

<?xml version="1.0" encoding="utf-8"?>
<project name="My App Builder"
    basedir="."
    default="buildSWC"
    xmlns:antcontrib="antlib:net.sf.antcontrib">
  <taskdef resource="flexTasks.tasks" classpath="${basedir}/libs/flexTasks.jar"/>
  <taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${basedir}/libs/ant-contrib-1.0b3.jar"/>

  <property environment="env"/>

  <property name="FLEX_HOME" value="${env.FLEX_HOME}"/>
  <property name="ASSETS_FILE" value="assets.swc"/>
  <property name="SRC_DIR" value="./src"/>

  <!-- Prepare folders for SWC compilation -->
  <target name="buildSWC">
    <echo message=""/>
    <echo message="*****************************************************"/>
    <echo message="* ${ASSETS_FILE}"/>
    <echo message="*****************************************************"/>
    <echo message="...basedir: ${basedir}"/>

    <!-- Build a swc from statically-included assets (images, mp3s, xml files, properties files) -->
    <fileset id="assets.flex" dir="src" includes="**/*.jpg,**/*.png,**/*.mp3,**/*.css,**/*.svg,**/*.swf,**/*.TTF,**/*.jpeg,**/*.xml,**/*.properties"/>
    <pathconvert pathsep=" " property="assets.flex.output" refid="assets.flex" dirsep="/">
      <map from="${basedir}/src/" to=""/>
    </pathconvert>

    <echo message="...Resources being considered..."/>
    <var name="filelist" value=""/>
    <var name="prefixfilelist" value="-include-file"/>
    <for list="${assets.flex.output}" delimiter=" " param="asset">
      <sequential>
        <echo>Asset: @{asset}</echo>
        <propertyregex property="prop"
                       input="${asset}"
                       regexp="(.*)${SRC_DIR}/(.*)"
                       select="\2"
                       casesensitive="false"
                       defaultvalue="./src/"/>
        <echo>Prop: ${prop}</echo>
        <var name="filelist_tmp" value="${filelist}"/>
        <var name="filelist" unset="true"/>
        <var name="filelist"
             value="${filelist_tmp} ${prefixfilelist} ./@{asset} ${prop}@{asset}"/>
        <var name="prop" unset="true"/>
      </sequential>
    </for>
    <echo message="-output ${ASSETS_FILE} ${filelist}"/>

    <!-- Windows Compile -->
    <exec executable="${FLEX_HOME}/bin/compc.exe"
          failonerror="true"
          osfamily="winnt">
      <arg line="-output ./libs/assets.swc ${filelist}"/>
    </exec>

    <!-- Unix/Linux Compile -->
    <exec executable="${FLEX_HOME}/bin/compc"
          failonerror="true"
          osfamily="unix">
      <arg line="-output ./libs/assets.swc ${filelist}"/>
    </exec>
  </target>
</project>

我们使用这种方法(我从网上找到的点点滴滴拼凑而成——如果我记得在哪里,我很乐意给予信任)来构建一个基于模块的大型项目及其嵌入的图像和字体。没有理由认为它不适用于音频文件。

祝你好运,

泰勒

PS那里可能有一些剩余/无用的代码行。另外,我不是 Ant 专家,所以对于那里的任何“Ant 人”:如果我违反了任何最佳实践,请放轻松;)

于 2011-04-05T22:39:31.027 回答