我们基于Flash网络的应用程序为叙述和声音效果播放大量音频。我们的一些客户拥有阻止下载MP3和其他音频文件的防火墙规则。因此,我们需要将这些MP3文件包装在SWF中。在过去,我编写了自动化Flash IDE的JSFL脚本,并完成了一系列复杂,易碎的步骤,将MP3文件嵌入到FLA中,然后将这些文件发布到SWF中。现在,Flex SDK提供了mxmlc编译器。我将ANT混合到我们的工作流程中,命令行和自动化构建一直是一种乐趣。因此,我想将MP3的转码或包装作为构建过程的一部分。我找到了Embedding Asset at Compile time in Pure AS3,但这需要我编写一个脚本来生成包装类AS文件。是否有更简洁的方法将MP3文件包装或转码为SWF?我想我希望有一种方法可以将mp3直接传递给mxmlc并输出一个swf,但任何比生成actionscript包装类更好的建议都会非常感激。
答案 0 :(得分: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脚本。以下是关键步骤,简而言之:
以下脚本将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>
我们使用这种方法(我在互联网上找到的碎片拼凑在一起 - 我很乐意在我记得的地方给予赞扬)来构建一个基于模块的大型项目及其嵌入的图像和字体。没有理由认为它对音频文件不起作用。
祝你好运,泰勒
P.S。那里可能有一些剩余/无用的代码行。另外,我不是蚂蚁专家,所以对那里的任何“蚂蚁家伙”:如果我打破任何最佳实践,请放轻松;)