Обтекание или встраивание и MP3 в SWF с помощью компилятора mxmlc Flex - PullRequest
3 голосов
/ 13 мая 2010

Наши веб-приложения Flash воспроизводят множество аудио для повествования и звуковых эффектов. У некоторых наших клиентов есть правила брандмауэра, которые блокируют загрузку MP3 и других аудиофайлов. Итак, нам нужно обернуть эти файлы MP3 в SWF. В прошлом я писал сценарии JSFL, которые автоматизируют среду IDE Flash и проходят сложный, хрупкий набор шагов для встраивания файлов MP3 в FLA-файлы, а затем публикуют их в SWF-файлах. Теперь Flex SDK предоставляет компилятор mxmlc. Я смешал ANT с нашим рабочим процессом, и командная строка и автоматические сборки были радостью. Итак, я хочу сделать транскодирование или перенос MP3-файлов частью нашего процесса сборки. Я обнаружил Внедрение активов во время компиляции в Pure AS3 , но для этого потребуется написать скрипт для генерации файла AS класса оболочки. Есть ли более чистый способ обернуть или перекодировать файлы MP3 в SWF? Я полагаю, что я надеюсь, что есть метод для передачи mp3 напрямую в mxmlc и вывода swf, но любая рекомендация лучше, чем создание классов-оболочек actionscript, будет принята с благодарностью.

1 Ответ

2 голосов
/ 06 апреля 2011

Поскольку вы уже используете MXMLC и Ant, вам следует подумать о добавлении еще одного фрагмента кода в скрипт сборки Ant, чтобы встроить свои MP3 в библиотеку SWC. Затем вы можете встроить этот SWC в исполняемый SWF (этот простой шаг я оставил в своем примере ниже).

Поскольку все, что вам нужно, это Ant, сделать это не сложнее, чем то, как вы уже строите свой SWF. Единственная реальная «ошибка» заключается в том, что вам нужно встроить свои файлы, используя MXMLC / SWC-дружественный абсолютный путь (например, «/myAssets/myasset.mp3») в своем коде.

Поскольку у него есть доступ к метаданным проекта, Flash Builder «знает», где находится корень вашего проекта, что позволяет ему использовать относительные пути встраивания. MXMLC не имеет этой информации. Поэтому вам необходимо убедиться, что встраивания объявлены в соответствии с абсолютным местоположением файлов, которые хранятся в SWC. Если вы сделаете это, Flash Builder и MXMLC / Ant смогут понять ваши встраивания. Таким образом, все счастливы.

Чтобы помочь вам в этом, ниже приведен пример сценария Ant для создания ресурса SWC. Вот ключевые шаги, в двух словах:

  • Создайте строку, содержащую расположение файлов для включения, один за другим
  • Скомпилируйте эти активы в SWC, используя MXMLC и набор аргументов командной строки размером с монстра

Следующий скрипт упакует файлы 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. Там могут быть некоторые оставшиеся / бесполезные строки кода. Кроме того, я не эксперт по муравьям, так что для любого "парня муравья": будь спокоен со мной, если я нарушу какие-либо лучшие практики;)

...