Перенос или встраивание и MP3 в SWF с использованием компилятора Flex mxmlc

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


person Community    schedule 13.05.2010    source источник
comment
Вы проверили, работают ли SWF-файлы, а MP3 - нет? Я часто слышу о проблемах с брандмауэром, вызывающих проблемы с потоковой передачей на различные порты, но я никогда не слышал о брандмауэре, который блокирует файлы по имени файла или типу содержимого ...   -  person fenomas    schedule 13.05.2010
comment
Да, файлы SWF работают, и заказчики подтвердили, что они намеренно заблокировали файлы MP3. У нас есть старое решение автоматизации Flash IDE, но оно ОЧЕНЬ хрупкое. Изменения в системе или Flash IDE постоянно ломают ее. Использование mxmlc и Ant в командной строке позволяет нам создавать устойчивые и воспроизводимые сборки.   -  person    schedule 13.05.2010


Ответы (1)


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

person RIAGrande    schedule 05.04.2011