
- •Оглавление
- •Вступление
- •Глава 1. Язык сценариев. ActionScript: начальные сведения
- •Проект 1: Прыгающий мяч (программная анимация)
- •1.1. Среда разработки ActionScript: настройка и приемы работы
- •1.1.1. Различие между стандартной и профессиональной версиями Flash
- •1.1.2. Панель Actions
- •1.1.3. Режим упрощенного ввода кода. Панель Behaviors
- •1.1.4. Как упростить создание кода на панели Actions
- •1.1.5. Типы сценариев
- •1.1.6. Централизация кода
- •1.1.7. Инструменты работы с кодом
- •1.1.8. Настройки стиля кода
- •1.1.9. Сохранение ActionScript-кода
- •1.1.10. Функция trace() и панель Output
- •1.1.11. Справочная информация
- •1.2. Синтаксис ActionScript
- •1.2.1. Пробельные символы
- •1.2.2. Завершение предложений
- •1.2.3. Чувствительность к регистру
- •1.2.4. Зарезервированные слова ActionScript
- •1.2.5. Принципы присвоения имен
- •1.2.6. Комментарии
- •1.3. Основные понятия
- •1.3.2. ActionScript как скриптовый язык Flash-плейера
- •1.3.3. Интерпретатор ActionScript. Flash-ассемблер
- •1.3.4. Символы и экземпляры символов
- •1.3.5. Переменные
- •1.3.6. Функции
- •1.3.7. Условные предложения
- •1.3.8. Циклы
- •1.3.9. Массивы
- •1.3.10. Объектная модель ActionScript
- •1.3.11. Свойства _root, _parent, Leveln и ключевое слово this
- •1.3.12. Области видимости кода
- •1.3.1. ЕСМА-262 как основа ActionScript
- •Глава 2. Типы данных
- •2.3. Математические функции и константы. Объект Math
- •2.3.1. Особенности реализации математических функций
- •2.3.2. Возведение в степень и вычисление квадратного корня
- •2.3.3. Экспонента и натуральный логарифм
- •2.3.5. Случайные числа
- •2.3.6. Округление до целого числа
- •2.3.7. Сравнение пары чисел
- •2.3.8. Тригонометрические функции
- •2.3.9. Математические константы
- •2.4. Строки (тип string)
- •2.4.1. Создание строк
- •2.4.2. Элементарные операции со строками
- •2.4.3. Класс String
- •2.4.4. Определение длины строки. Свойство lengths
- •2.4.5. Соединение строк. Метод concat()
- •2.4.6. Выделение символа строки по индексу. Метод charAt()
- •2.4.7. Поиск в строке. Методы indexOf() и lastIndexOff()
- •2.4.8. Извлечение подстроки. Методы substring(), substr(), slice()
- •2.4.9. Преобразование строк в массивы. Метод split()
- •2.4.12. Преобразование строк в идентификаторы. Функция eval()
- •2.4.13. Текстовые поля
- •2.5. Кодировка символов. Уникод во Flash
- •2.5.1. Немного истории
- •2.5.2. Поддержка уникода Flash-плейером
- •2.5.3. Поддержка уникода средой разработки
- •2.5.4. Добавление символов уникода
- •2.6. Логические величины (тип boolean)
- •2.6.1. Класс Boolean
- •2.7. Тип undefined
- •2.8. Тип null
- •2.9. Объекты (тип object)
- •2.9.1. Атрибуты свойств
- •2.9.2. Изменение атрибутов свойств. Функция ASSetPropFlags()
- •2.10. Клипы (тип movieclip)
- •2.11. Преобразование типов данных
- •2.11.1. Правила преобразования типов
- •2.11.2. Автоматическое преобразование типов
- •2.12. Строгая типизация в ActionScript
- •Проект 2: Калькулятор
- •2.1. Определение типа объекта данных
- •2.2. Числа (тип number)
- •2.2.1. Виды чисел в ActionScript
- •2.2.2. Особенности представления чисел
- •2.2.3. Операции с числами
- •2.2.4. Класс Number — методы и свойства
- •2.2.5. Преобразование строк в числа. Функции parseInt() и parseFloat()
- •Глава 3. Переменные
- •3.1. Создание переменных
- •3.2. Особенности типизации переменных
- •3.3. Локальные переменные функций
- •3.4. Глобальные переменные
- •3.5. Особенности операции присваивания
- •3.6. Есть ли переменные в ActionScript?
- •3.7. Удаление переменных
- •Проект 3: Пружинный маятник
- •Глава 4. Функции
- •4.1. Создание функций
- •4.2. Вызов функций
- •4.3. Предложение return
- •4.4. Рекурсия
- •4.5. Особенности цепочки областей видимости функций
- •4.6. Объект arguments
- •4.6.1. Формальные параметры и объект arguments
- •4.6.2. Свойства объекта arguments
- •4.7. Особенности передачи в функции составных объектов данных
- •4.8. Функции как объекты
- •4.8.1. Класс Function
- •4.8.2. Свойство prototype
- •4.8.3. Методы вызова функции
- •4.9. Функции на стадии выполнения. Объект активации
- •Проект 4: Крестики-нолики
- •Глава 5. Операторы
- •5.1. Виды операторов
- •5.2. Иерархия операций
- •5.3. Сочетательность операций
- •5.4. Арифметические операторы
- •5.5. Операторы присваивания
- •5.5.1. Оператор =
- •5.5.2. Операторы присваивания с модификацией
- •5.5.3. Инкрементирование и декрементирование
- •5.6. Операторы равенства и сравнения
- •5.6.1. Операторы равенства
- •5.6.2. Операторы сравнения
- •5.7. Логические операторы
- •5.8. Условный оператор (?:)
- •5.9. Служебные операторы
- •5.9.1. Инициализаторы литералов
- •5.9.2. Оператор группирования
- •5.9.3. Операторы доступа к свойствам
- •5.9.4. Оператор вызова функции
- •5.9.5. Оператор new
- •5.9.6. Оператор super
- •5.9.7. Оператор delete
- •5.9.8. Оператор typeof
- •5.9.9. Оператор instanceof
- •5.9.10. Оператор void
- •5.9.11. Оператор «запятая»
- •5.10. Поразрядные операторы
- •5.10.1. Логические поразрядные операторы
- •5.10.2. Операторы поразрядного сдвига
- •Проект 5: 3D-конструктор
- •Глава 6. Предложения
- •6.1. Блок предложений
- •6.2. Предложения var и function
- •6.3. Предложения выражений и пустые предложения
- •6.4. Предложение return
- •6.5. Предложение with
- •6.6. Условные предложения
- •6.6.1. Предложение if
- •6.6.2. Предложение switch
- •6.7. Циклы
- •6.7.1. Циклы с предусловием (while и do—while)
- •6.7.2. Цикл с параметром (for)
- •6.7.4. Предложения break и continue
- •6.7.5. Ограничение на время выполнения кода
- •6.7.6. Циклы события onEnterFrame и временной диаграммы
- •6.7.7. Циклический вызов функций. Функция setInterval()
- •Проект 6: Тетрис
- •Глава 7. Массивы (класс Array)
- •7.1. Создание массивов
- •7.2. Извлечение и переопределение элементов массива
- •7.3. Длина массива. Свойство length
- •7.4. Добавление элементов в массив
- •7.5. Удаление элементов массива
- •7.6. Слияние массивов
- •7.7. Выделение фрагмента массива
- •7.8. Инверсия массива
- •7.9. Сортировка массива
- •7.10. Преобразование массива в строку
- •7.11. Многомерные массивы
- •7.13. Особенности реализации массивов в ActionScript
- •Проект 7: Пиксельное табло
- •Глава 8. События
- •8.1. Модель событий Генератор—Листенеры
- •8.1.1. Обработчики событий
- •8.1.2. Листенеры
- •8.2. Событийные методы
- •8.3. Модель событий Flash 5
- •8.4. Обновление экрана при событиях
- •Проект 8: Создаем события сами
- •Глава 9. Объектно-ориентированное программирование
- •9.2.1. Объекты
- •9.2.2. Свойства
- •9.2.3. Методы
- •9.2.4. Классы
- •9.2.5. Наследование
- •9.2.6. Создание надклассов и подклассов
- •9.2.7. Концепция создания надклассов Flash 6
- •9.2.8. Оператор super
- •9.2.9. Свойства и методы конструктора класса
- •9.2.10. Определение принадлежности объекта к классу
- •9.2.11. Цепочка областей видимости. Объект Global
- •9.3. Класс Object
- •9.3.1. Создание объектов класса Object
- •9.3.2. Метод registerClass(). Выделение экземпляров клипа в класс
- •9.3.3. Метод addProperty(). Свойства типа getter/setter
- •9.3.4. Методы watch() и unwatch(). События изменений свойств
- •9.3.5. Прочие методы класса Object
- •9.4.1. Создание классов
- •9.4.2. Задание наследуемых свойств и методов класса
- •9.4.3. Конструктор класса. Инициализация собственных свойств и методов объектов
- •9.4.4. Особенности задания методов в AciionScript2.0
- •9.4.5. Статичные члены класса
- •9.4.7. Динамические классы
- •9.4.8. Наследование
- •9.4.9. Интерфейсы
- •9.4.10. Свойства типа getter/setter
- •9.4.11. Выделение экземпляров символа в подкласс
- •9.4.12. Особенности контроля на этапе компиляции
- •9.4.13. Особенности импорта внешних классов
- •9.4.14. Пакеты
- •9.4.15. Встроенные классы. Директива intrinsic
- •Проект 9: Модель идеального газа
- •Глава 10. Клипы
- •10.1. Глобальные функции и свойства
- •10.2. Отличия клипов от объектов
- •10.2.1. Свойства клипов
- •10.3. Клипы как носители кода
- •10.3.1. Последовательность выполнения кода
- •10.3.2. Особенности использования свойств и методов класса MovieClip
- •10.4. Особенности основной временной диаграммы _root
- •10.5. Создание экземпляров клипов
- •10.5.1. Метод duplicateMovieClip()
- •10.5.3. Метод createEmptyMovieClip(). Создание пустого клипа
- •10.6. Виртуальные слои клипов
- •10.6.1. Изменение глубины клипа. Метод swapDepths()
- •10.7. Импорт внешних фильмов и изображений
- •10.7.2. Импорт внешних фильмов при помощи функций loadMovie() и loadMovieNum()
- •10.7.3. Импорт изображений
- •10.7.4. Импорт фильмов и изображений при помощи класса MovieClipLoader
- •10.7.5. Создание предзагрузчиков
- •10.7.6. Кэширование swf-фильмов
- •10.7.7. Изменение глубины основной временной диаграммы
- •10.7.8. Доступ из одного фильма к объектам другого
- •10.7.9. Обобщенные библиотеки
- •10.8. Имена экземпляров клипов
- •10.9. Ссылки на клипы
- •10.9.1. Свойство _lockroot
- •10.9.2. Определение пути к клипу
- •10.9.3. Инструмент Insert Target Path
- •10.10. Система координат клипов
- •10.10.1. Свойство _x и _y
- •10.10.2. Пересчет координат из одной системы в другую
- •10.10.3. Масштаб осей
- •10.10.4. Размер клипа
- •10.10.5. Границы клипа
- •10.10.6. Поворот системы координат
- •10.11. Прозрачность и видимость клипа
- •10.11.1. Свойство _alpha
- •10.11.2. Свойство _visible
- •10.12. Перемещаемые клипы. Метод startDrag()
- •10.12.1. Свойство _droptarget
- •10.13. Коллизии клипов. Метод hitTest()
- •10.13.1. Определение пересечения двух клипов
- •10.13.2. Определение принадлежности точки к клипу
- •10.13.3. Определение коллизии клипов с использованием поточечного перебора
- •10.14. Управление временной диаграммой
- •10.14.1. Начало и остановка проигрывания клипа
- •10.14.2. Переход на новый кадр
- •10.14.3. Определение номера проигрываемого кадра
- •10.15. Программные маски
- •10.16. Удаление экземпляров клипов и фильмов
- •10.16.1. Удаление экземпляров. Метод removeMovieClip()
- •10.16.2. Выгрузка содержимого экземпляров. Метод unloadMovie()
- •10.16.3. Выгрузка фильмов
- •10.17. События
- •10.17.1. Создание обработчиков событий в стиле Flash 5
- •10.17.2. Событие смены кадров (onEnterFrame)
- •10.17.3. Событие загрузки клипа (onLoad)
- •10.17.4. Событие выгрузки клипа (onUnload)
- •10.17.5. Событие поступления данных (onData)
- •10.17.6. События мыши (onMouseDown, onMouseUp, onMouseMove)
- •10.17.7. События клавиатуры (onKeyDown, onKeyUp)
- •10.17.8. «Кнопочные» события
- •10.17.9. События фокуса (onSetFocus, onKillFocus)
- •10.18. Программное рисование
- •10.18.1. Рисование прямыми отрезками
- •10.18.2. Рисование фрагментами парабол
- •10.18.3. Однородная заливка
- •10.18.4. Градиентная заливка
- •10.18.5. Удаление программной графики
- •10.19. Управление цветом клипов. Класс Color
- •10.19.1. Цветовые модели
- •10.19.2. Задание формулы цвета
- •10.19.3. Задание цвета клипа. Метод setRGB()
- •10.19.4. Цветовые трансформации. Метод setTransform()
- •Проект 10: Рисование 3D-объектов
- •Глава 11. Кнопки
- •11.1. Создание кнопок
- •11.2. Сходства и различия кнопок и клипов
- •11.3. События кнопок
- •11.3.1. Особенности событий кнопок
- •11.3.2. События кнопок в стиле Flash 5
- •11.4. Режим элемента меню
- •11.5. Вид указателя мыши
- •11.6. Отключение кнопок
- •11.7. Управление кнопками при помощи клавиатуры
- •11.7.1. Динамическое наведение фокуса
- •11.7.2. Свойство _focusrect
- •11.7.3. События onSetFocus и onKillFocus
- •11.7.4. Задание маршрута клавиатурного обхода
- •11.7.5. Особенности клавиатурного обхода и программного фокуса в случае клипов
- •11.8. Клипы как кнопки
- •Проект 11: Факел
- •Глава 12. Работа с мышью и клавиатурой
- •12.1. Работа с мышью
- •12.1.1. Определение координат указателя мыши
- •12.1.2. События мыши
- •12.1.3. Скрытие указателя мыши
- •12.1.4. Правая клавиша мыши
- •12.1.5. Определение выхода указателя мыши за пределы окна плейера
- •12.2. Контекстное меню
- •12.2.1. Настройка контекстного меню. Класс ContextMenu
- •12.2.2. Введение в контекстное меню собственных команд
- •12.3. Работа с клавиатурой
- •12.3.1. Особенности событий клавиатуры
- •12.3.2. События onKeyDown и onKeyUp
- •12.3.3. Определение кода нажатой клавиши. Метод getCode()
- •12.3.4. Определение кода введенного символа. Метод getAscii()
- •12.3.5. Проверка нажатия клавиши. Метод isDown()
- •12.3.6. Проверка активности специальных режимов. Метод isToggled()
- •Проект 12: Эластики
- •Глава 13. Работа с текстом
- •13.1. Создание текстовых полей
- •13.1.1. Создание текстовых полей при помощи инструмента Text
- •13.1.2. Переменная поля
- •13.1.3. Динамическое создание текстовых полей
- •13.2. Удаление текстовых полей
- •13.3. Текстовые поля как визуальные объекты
- •13.4. Задание и извлечение текста поля
- •13.5. Настройка текстового поля
- •13.5.1. Управление размером поля
- •13.5.2. Рамка и задний фон
- •13.5.3. Поля однострочные и многострочные
- •13.5.4. Ограничение на количество символов
- •13.5.5. Поле паролей
- •13.5.6. Ограничение на вводимые символы
- •13.5.7. Выделение текста поля
- •13.6. Настройка стиля текста. Класс TextFormat
- •13.6.1. Задание гарнитуры
- •13.6.2. Размер шрифта
- •13.6.3. Цвет шрифта
- •13.6.4. Начертание шрифта
- •13.6.5. Выключка
- •13.6.6. Подчеркнутый шрифт
- •13.6.7. Гиперссылки
- •13.6.8. Форматирование текста
- •13.6.9. Определение размерных параметров текста
- •13.7. Работа со шрифтами
- •13.7.1. Шрифты системные и встроенные
- •13.7.2. Ненаправленные гарнитуры
- •13.7.3. Особенности встраивания шрифтов
- •13.7.4. Встраивание в фильм целого шрифта
- •13.7.5. Встраивание глифов отдельных символов и последовательностей символов
- •13.7.6. Проблема читабельности при отображении мелкого текста
- •13.8. Событие onChanged
- •13.9. Прокрутка текстовых полей
- •13.10. Работа с фокусом
- •13.11. Форматирование текста при помощи HTML
- •13.11.5. Тег <FONT> ... </FONT>
- •13.11.10. Тег <TEXTFORMAT> ... <TEXTFORMAT>
- •13.11.11. Тег <SPAN> ... </SPAN>
- •13.11.13. Автоматическое удаление пробелов. Свойство condenseWhite
- •13.12. Форматирование текста с использованием каскадных таблиц стиля (CSS)
- •13.12.1. Основные положения технологии CSS
- •13.12.2. Создание объекта таблиц стиля
- •13.12.3. Применение объекта стиля к текстовому полю
- •13.12.4. Элементы CSS, поддерживаемые Flash-плейером
- •13.13. Работа с выделением. Объект Selection
- •13.13.1. Управление фокусом поля. Методы getFocus() и setFocus()
- •13.13.2. Событие изменения фокуса (onSetFocus)
- •13.13.4. Определение и задание положения курсора ввода
- •13.13.5. Динамическое задание выделения. Метод setSelection()
- •13.13.6. Динамическая замена выделенного текста. Метод replaceSel()
- •13.14. Работа со статичным текстом. Объект TextSnapshot
- •13.14.1. Создание объектов класса TextSnapshot
- •13.14.2. Считывание текста статичных полей
- •13.14.3. Поиск строки в статичном тексте
- •13.14.4. Программное выделение статичного текста
- •13.14.5. Определение ближайшего к точке символа статичного текста
- •13.15. Копирование текста в буфер обмена
- •13.16. Поддержка многоязычности. Панель Strings
- •Проект 13: Текстовые эффекты
- •Глава 14. Время и дата
- •14.1. Основные понятия теории измерения времени
- •14.2. Компьютерное время
- •14.3. Класс Date
- •14.3.1. Создание объектов класса Date
- •14.3.2. Методы класса Date
- •14.4. Определение времени, прошедшего с начала проигрывания фильма
- •Проект 14: Программные часы
- •Глава 15. Работа со звуком
- •15.1. Основные понятия теории цифрового звука
- •15.1.1. Частота дискретизации
- •15.1.2. Разрядность выборок
- •15.1.3. Количество каналов
- •15.1.4. Алгоритмы компрессии
- •15.1.5. Форматы хранения
- •15.2. Событийный (event) и потоковый (stream) звук
- •15.3. Операции со звуком без использования программирования
- •15.4. Создание объектов класса Sound
- •15.5. Динамическое присоединение звука. Метод attachSound()
- •15.6. Импортирование внешних МР3-файлов
- •15.6.1. Метод loadSound()
- •15.6.2. Отслеживание окончания загрузки. Событие onLoad
- •15.6.3. Создание предзагрузчиков для импортируемых звуков
- •15.7. Управление воспроизведением звуков
- •15.7.1. Запуск воспроизведения. Метод start()
- •15.7.3. Событие onSoundComplete
- •15.8. Свойства position и duration
- •15.9. Управление параметрами воспроизведения
- •15.9.1. Громкость звука
- •15.9.2. Баланс
- •15.9.3. Детальное управление стереозвучанием. Метод setTransform()
- •15.10. Чтение ID3-тегов МР3-звуков
- •Проект 15: МР3-плейер
- •Глава 16. Взаимодействие с локальным окружением
- •16.1. Взаимодействие с импортированными фильмами
- •16.2. Взаимодействие с плейером
- •16.2.1. Определение версии и типа плейера
- •16.2.2. Режимы масштабирования
- •16.2.3. Типы выравнивания
- •16.2.4. Определение размеров фильма и величины окна плейера
- •16.2.5. Событие onResize
- •16.2.6. Цвет фона
- •16.2.7. Качество отображения
- •16.2.8. Панель небезопасных настроек плейера
- •16.3. Дополнительные возможности автономного плейера
- •16.3.1. Проекторы
- •16.3.2. Функция fscommandf()
- •16.4. Взаимодействие между фильмами, проигрываемыми разными плейерами
- •16.4.1. Создание кода отправки данных
- •16.4.2. Создание кода получения данных
- •16.4.3. Пример использования класса LocalConnection
- •16.5. Взаимодействие с браузером
- •16.5.1. Теги <EMBED> и <OBJECT>
- •16.5.2. Передача данных из HTML-окружения при загрузке фильма
- •16.5.3. Решение проблемы кнопок навигации браузера
- •16.5.4. Передача команд браузеру. Функция getURL()
- •16.5.5. Взаимодействие с JavaScript при помощи функции fscommand()
- •16.5.6. Управление SWF-фильмом посредством JavaScript
- •16.5.7. Определение наличия в системе Flash-плейера нужной версии
- •16.6. Взаимодействие со средой разработки
- •16.6.1. Настройка панели Actions
- •16.6.2. Объект CustomActions
- •16.6.3. Взаимодействие с JSFL
- •16.7. Взаимодействие со средствами чтения с экрана
- •16.8. Получение информации об использующемся аппаратном и программном обеспечении
- •16.9. Сохранение данных на диске
- •16.9.1. Создание объектов SharedObject
- •16.9.2. Чтение данных из объектов SharedObject
- •16.9.3. Удаление sol-файлов
- •16.9.4. Серверные объекты SharedObject
- •16.9.5. Решение проблемы выделения цветом посещенных ссылок
- •16.10. Взаимодействие с принтером
- •16.10.1. Функции печати
- •16.10.2. Класс PrintJob
- •Проект 16: Создаем свой инструмент
- •Глава 17. Обмен текстовыми данными с сервером
- •17.1. Принципы сетевой безопасности Flash MX 2004
- •17.1.1. Правила определения идентичности доменов
- •17.1.2. Требование идентичности протоколов
- •17.1.3. Снятие ограничений на доступ к содержимому фильма
- •17.1.4. Снятие ограничений на доступ к внешним данным
- •17.1.5. Преодоление ограничений для сокетов
- •17.1.6. Создание приложений, отвечающих принципам безопасности
- •17.2. Загрузка текстовых данных с сервера
- •17.2.1. Создание файла сданными
- •17.2.2. Функция loadVariables()
- •17.2.3. Класс LoadVars
- •17.3. Взаимодействие с серверным скриптом
- •17.3.1. Запрос с выводом результата в браузере
- •17.3.2. Запрос с отправкой результата в фильм
- •17.3.3. Задание заголовков запроса
- •17.4. Работа с сокетами
- •17.4.1. Класс XMLSocket
- •17.4.2. Создание сокета-сервера
- •17.5. Работа с XML
- •17.5.1. Введение в ХМL
- •17.5.2. Объектная модель XML. DOM
- •17.5.3. Преобразование XML-текста в дерево объектов DOM
- •17.5.4. Обход дерева DOM
- •17.5.5. Создание и модификация XML-документа
- •17.5.6. Обмен XML-данными с сервером
- •Проект 17: Создаем сетевую игру
- •Дополнительные главы
- •Глава 18. Обмен с сервером сложными данными
- •Глава 19. Компоненты
- •Глава 20. Полезные мелочи
Глава 15
Работа со звуком
Flash-плейер, несмотря на свою компактность, довольно неплохо поддерживает работу со звуком (хотя качество озвучивания анимации, созданной во Flash, все же довольно проблематично вывести на уровень диснеевских мультипликаций). Большинство задач озвучивания можно решить и без ActionScript, просто помещая экземпляры звуков на нужные кадры. Но если вы хотите сполна задействовать потенциал плейера, то без программирования не обойтись.
Применяя ActionScript, вы сможете использовать возможности плейера на 100 %. Интерактивные звуковые эффекты, внешние библиотеки звуков, управление параметрами звука — это лишь малая часть того, что вы сможете реализовать при помощи ActionScript.
В этой главе обсудим основные вопросы, связанные с работой со звуком во Flash, акцентируя внимание на возможностях программного управления звуком. Кроме того, рассмотрим важнейшие понятия теории цифрового звука. Это необходимо, так как, не владея соответствующими знаниями, эффективно подобрать параметры экспорта звука очень сложно.
15.1. Основные понятия теории цифрового звука
Звук — это, в общем случае, колебания упругой среды. Вызывается звук механическими колебаниями некоторого объекта (это может быть струна, голосовые связки и пр.), контактирующего со средой. Частота колебаний (она измеряется в герцах) определяет высоту звука. Чем больше частота, тем выше звук. Человеческий слух способен воспринимать звуковые колебания воздуха с частотой от 20 Гц до 20 кГц. Амплитуда колебаний воспринимается ухом как громкость. Чем больше амплитуда, тем более громким будет звук.
Прямым аналогом звуковых волн являются волны электромагнитные. Последние менее подвержены рассеянию средой, переносимую ими информацию проще сохранять и обрабатывать. Электромагнитные волны — это важнейший вторичный носитель звука. Преобразование акустических волн в электромагнитные (равно как и обратная операция) осуществляется за счет обычного индукционного эффекта, который заключается в возникновении в проводнике тока при его помещении в переменное магнитное поле.
Проще говоря, колебание магнита мембраны динамика около катушки вызывает в ней переменный ток. Если этот ток подать на другой динамик, то магнит его мембраны придет в движение, создавая соответствующий звук. Так работают телефон и радио.
Звук, преобразованный в форму электромагнитных колебаний, может быть легко сохранен. Для этого некоторый параметр носителя (глубина дорожки пластинки или степень намагниченности пленки) должен быть сопоставлен с амплитудой колебаний (т. е. силой тока, индуцируемого в катушке динамика). Звук, преобразованный в электромагнитные колебания напрямую, называется аналоговым. Главная его характеристика — прямое соответствие передаваемых или записываемых электромагнитных волн акустическим.
Цифровой звук появился относительно недавно. Основное его отличие от аналогового заключается в дискретности. При оцифровке специальное устройство, аналого-цифровой преобразователь (АЦП), измеряет через равные промежутки времени (порядка 0,001-0,0001 секунды) величину амплитуды электромагнитной волны, соответствующей аналоговой форме звука, и записывает ее значение с заданной точностью в файл. Это значение принято называть выборкой, или на жаргоне
— сэмплом (от англ. sample — выборка). Саму же оцифровку нередко называют дискретизацией, или сэмплингом.
При обратном преобразовании звука из цифровой формы в аналоговую (эту операцию проводит
устройство, называемое цифро-аналоговым преобразователем (ЦАП)). Выполняется интерполирование (приближение) промежуточных значений амплитуды по известным. Так как частота дискретизации обычно высока, эта операция позволяет довольно точно восстановить исходный аналоговый сигнал.
Цифровая форма звука характеризуется пятью параметрами.
1.Частотой дискретизации;
2.Разрядностью выборок.
3.Количеством каналов или дорожек.
4.Алгоритмом компрессии/декомпрессии (кодеком).
5.Форматом хранения.
Так как каждый из этих параметров довольно специфичен, рассмотрим их по отдельности.
15.1.1. Частота дискретизации
Частота дискретизации определяет, сколько выборок в секунду будет производиться при оцифровке. Если сопоставить цифровой звук с цифровыми изображениями, то частоте дискретизации будет соответствовать разрешение (более «приземленная» аналогия — частота кадров в кино). Чем выше частота дискретизации, тем лучше затем удастся на основании цифровой формы звука восстановить аналоговый сигнал (точнее, чем больше частота дискретизации, тем больший спектр частот удастся зафиксировать при оцифровке).
Знаменитая теорема Найквиста — Котельникова гласит, что для правильного восстановления аналогового сигнала по его цифровой записи необходимо, чтобы частота дискретизации по меньшей мере в два раза превосходила максимальную частоту звука. Так как верхний предел слуха 20 кГц, то в идеале частота дискретизации должна быть не меньше 40 кГц. Именно поэтому стандартная частота дискретизации, использующаяся при записи компакт-дисков, составляет 44.1 кГц (так называемое CD-качество). Впрочем, частота дискретизации может быть и выше, но такое качество звука используется лишь и звукозаписывающих студиях и особо требовательными меломанами.
Частота дискретизации 44.1 кГц — это не всегда достижимый идеал. При передаче данных по сети с низкой пропускной способностью качеством звука приходится жертвовать в пользу его размера, На практике обычно используются частоты дискретизации в два, четыре и восемь раз меньшие
44.1 кГц:
•22.05 кГц — так называемое радио-качество. Используется при кодировании звука FMрадиостанциями. В случае Flash неплохо подходит для создания фоновой музыки и событийных звуков. Для передачи человеческого голоса даже несколько избыточно;
•11.025 кГц — телефонное качество. Частота дискретизации, оптимально подходящая для передачи человеческого голоса. Используется в 1Р-телефонии;
•5,5 кГц — звук на грани потери информационной составляющей. Эта частота дискретизации может быть применена для передачи низких звуков, а также голоса (правда, с посредственным качеством).
Flash-плейер поддерживает частоты дискретизации 44,1: 22,05; 11,025; 5,5 кГц. Выбор частоты должен определяться типом звука, а также тем, насколько важно сохранить небольшой размер SWF-файла. Однако нужно помнить, что не имеет смысла повышать частоту дискретизации звукового фрагмента по сравнению с начальной. Это не приведет к росту качества, а только неоправ-
данно увеличит размер фильма.
15.1.2. Разрядность выборок
Разрядность выборки определяет, сколько различных значений амплитуды может быть зафиксировано при оцифровке. Если разрядность равна 4 бита, то интервал значения амплитуды от нуля до максимума будет разбит всего на 16 промежутков. Естественно, что погрешность при восстановлении аналогового сигнала при этом будет очень высока. Подобная разрядность подходит для представления очень простых звуков, а также голоса (качество его будет низким).
Разрядность 8 битов дает возможность представить 256 значений амплитуды. С такой разрядностью передают данные FM-радиостанции. Ее достаточно для представления любых звуков с вполне удовлетворительным качеством. Оптимальной же является 16-битовая кодировка. При этом можно работать с 65 536 вариантами амплитуды, чего достаточно для покрытия всего слышимого диапазона.
Разрядность 16 битов применяется при записи компакт-дисков. Более высококачественное квантование оправданно использовать лишь в случае студийной обработки звука.
Flash-плейер поддерживает 8- и 16-битовое квантование в случае несжатых форматов (например, WAV) и только 16-битовую разрядность для сжатых форматов (к ним относится МР3). Это нужно учитывать при импорте звукового файла в фильм.
15.1.3. Количество каналов
Стереозвук был разработан, чтобы придать воспроизводимому звуку природную объемность. Достигается это за счет того, что в каждой колонке проигрывается различная составляющая звука. В общем, звук каждого канала представляет собой отдельный звуковой файл, поэтому размер стереозвука пропорционален количеству поддерживаемых каналов.
Обычные непрофессиональные звуковые карты работают с двухканальным звуком. Столько же каналов поддерживает и Flash-плейер. Используя ActionScript, можно микшировать звук каналов, воспроизводя звук левого канала в правом динамике, а правого канала — в левом. Как это делается, мы поговорим немного ниже.
Если звук кодируется в МР3-формате, то можно выбирать один из трех форматов стерео.
•Dual Channel. Каждый канал получает половину потока и кодируется отдельно как моносигнал. Рекомендуется главным образом в случаях, когда разные каналы содержат принципиально разный сигнал, скажем, текст на разных языках.
•Stereo. Каналы кодируются отдельно, но программа кодировки может при необходимости отдать одному каналу больше места, чем другому. Наиболее стандартный формат.
•Joint Stereo. Стереосигнал раскладывается на два новых канала. Один представляет собой среднее исходных каналов, а второй — разность между каналами. В этом режиме качество звука получается чаше всего выше, чем в остальных.
К сожалению, в среде разработки Flash нельзя задавать, какой формат стерео будет применяться. Поэтому, если качество звука имеет принципиальное значение, то создавать МР3-файлы с нужными параметрами стоит при помощи одной из специализированных программ.
Так как стереозвук «весит» в два раза больше, чем его моноаналог, в подавляющем большинстве случаев в настройках экспорта стоит активизировать опцию Convert Stereo to Mono (Конвертировать стерео в моно). При этом каналы стереозвука будут микшированы в монозвук.
При всех типах сжатия, поддерживаемых Flash, можно использовать как одноканальные, так и
двухканальные звуки. Исключение представляет сжатие по алгоритму Nellymoser, которое может быть применено лишь к одноканальному звуку.
15.1.4. Алгоритмы компрессии
Попробуем посчитать, сколько места на диске займет средняя музыкальная композиция, оцифрованная с CD-качеством. Очевидно, что для этого нужно использовать формулу size = F B K t,
где F — частота дискретизации, В — разрядность выборок, К — количество канатов, t — время. Полагая травным 44,1 кГц, В = 2 байта, К = 2 канала и t = 300 секунд, получим, что оцифрованная песня займет приблизительно 50 Мб.
Это означает, что на компакт-диске может быть записано всего лишь около 10 несжатых песен. Так как каждая секунда звука, оцифрованного с CD-качеством, занимает почти 200 Кб, то такой звук будет весьма проблематично использовать в телефонии, радио или интернете. Даже если оцифровать звук как одноканальный с частотой дискретизации 11,05 кГц и разрядностью 8 битов, каждая его секунда займет 11 Кб.
Для обычных телефонных сетей это слишком много, чтобы звук можно было передавать как потоковый, Возникает проблема: каким-то образом необходимо уменьшить размер звуковых файлов. Решается она довольно эффективно за счет использования ряда алгоритмов компрессии.
Flash-плейер поддерживает следующие типы компрессии.
•ADPCM (Adaptive Differential Pulse Code Modulation — адаптивная разностная импульсно-
кодовая модуляция). Это тип компрессии базируется на двух идеях. Во-первых, установлено, что в подавляющем большинстве воспринимаемых нами звуков преобладают низкочастотные медленно изменяющиеся составляющие. Из этого факта следует, что разность между соседними выборками зачастую мала (вернее, существенно меньше абсолютной величины самих выборок). Это означает, что оцифрованный звуковой сигнал можно представить не самими выборками, а разностями между ними, которые меньше по величине, а следовательно, требуют меньше битов для своего описания. Во-вторых, кодирование разности соседних выборок производится с учетом величины амплитуды и частотного состава, так как ухо человека имеет пределы чувствительности (так называемая адаптация).
Алгоритм ADPCM активно используется в IP-телефонии. Для передачи музыки он плохо подходит из-за вносимых им в звук существенных искажений (искажения, естественно, вносятся и в речь, но
вней они малозаметны). Коэффициент сжатия при применении ADPCM обычно невысок и лежит
впределах от 8:1 до 3:1. Кодек ADPCM Flash-плейера позволяет использовать для представления разности между выборками 2, 3,4 или 5 битов. Реально можно добиться приемлемого качества звука при разрядности (bitrate, т. е. «весе» одной секунды звука) 16 Кбит.
Алгоритм ADPCM существенно уступает МРЗ, поэтому использовать такую компрессию в принципе не стоит. МР3-сжатие даст на порядок лучшее качество при той же разрядности. Наличие же соответствующего кодека объясняется принципами обратной совместимости: кодек для МРЗ встроен в плейер только во Flash 4. До этого применялся только кодек ADPCM, что связано, вероятно, со свободным распространением данного алгоритма. Причиной же того, что ADPCM до сих пор используется в IP-телефонии, является то, что он не требует таких объемных математических вычислений, как МРЗ, поэтому компрессия может быть проведена «на лету».
•МР3. Один из первых и наиболее распространенный алгоритм компрессии, базирующийся на так называемом психоакустическом сжатии. Использует следующие особенности человеческого слуха:
oесли тихий звук следует за очень громким, то мы его не слышим. Поэтому его можно отбросить;
oсоставляющая звука с большой амплитудой маскирует составляющие, близкие к ней по частоте, нос меньшими амплитудами. Поэтому ими можно пожертвовать без заметной потери качества;
oчувствительность уха к частотным искажениям низка, поэтому, если составляющие близки, их можно считать одинаковыми;
oмы плохо воспринимаем очень низкие и очень высокие звуки, поэтому для их кодирования можно выделить меньше битов, чем для звуков со средней частотой.
Технически алгоритм МР3 реализуется следующим образом. Звук разбивается на участки некоторой длины, называемые фреймами (frames), и к каждому набору выборок применяется прямое преобразование Фурье. Его результатом является разложение звуковой волны на элементарные синусоиды разной частоты — гармоники. Коэффициент гармоники определяет ее вклад в результирующую волну. Производится сопоставление коэффициентов гармоник, и наименее значимые из них отбрасываются.
Алгоритм МР3 позволяет сжать звук в 20-30 раз с сохранением хорошего качества. Считается, что полностью CD-качество сохраняется при битрейте порядка 160 Кбит/с (понятия «частота дискретизации» и «разрядность выборки» неприменимы к МР3-файлам). Однако в большинстве случаев вполне приемлем и куда более сжатый звук. Так во Flash-анимациях обычно применяется МР3сжатие, дающее битрейт порядка 16-32 Кбит/с.
Flash-плейер поддерживает ряд битрейтов в промежутке от 16 до 160 Кбит/с, Выбор наиболее подходящего должен осуществляться на основании требований к размеру фильма и качеству звука. Зачастую стоит оставлять МР3-файл в том качестве, в котором он был импортирован (поэтому по умолчанию активна настройка Use imported mp3 quality). Если же качество изменяется, то изменение должно производиться в сторону уменьшения качества, но не увеличения. Иначе звук улучшен не будет, а рост размера файла произойдет.
Если звук обрабатывается во внешнем редакторе, то можно учесть тот факт, что Flash-плейер поддерживает не только алгоритм МРЗ, который является частью стандарта MPEG1 Layer 3, но и более новые алгоритмы (MPEG2 и MPEG2.5), которые дают лучшее качество звучания при низкой разрядности. Кроме того, плейером поддерживается МР3-кодирование как с постоянной разрядностью, так и с переменной (во втором случае достигается лучшая степень сжатия).
МР3-формат оптимален в случае Rash-проектов. Поэтому на практике используется практически только он. Тем более, МР3-файлы можно динамически подгружать, а также у них имеются весьма полезные ID3-теги с информацией о данном звуке.
•Nellymoser. Относительно новый алгоритм компрессии, разработанный компанией Nellymoser Inc. Предназначен для сжатия человеческой речи. Основная его идея заключается в том, что голос человека может включать колебания с частотами из довольно узкого промежутка. Более высокие и низкие составляющие можно отбросить. Также удаляются гармоники с очень малой амплитудой. В результате достигается сжатие, сопоставимое с МР3-сжатием, однако качество звука оказывается более высоким. Более подробно об алгоритме Nellymoser можно прочитать на сайте разработчика http://www.nellymoser.com/.
Кодек алгоритма Nellymoser включен в плейер только во Flash MX.
В среде разработки Flash сжатие по алгоритму Nellymoser называется Speech (речь).
Регулировать соотношение качество/размер при использовании компрессии Nellymoser можно, изменяя частоту дискретизации.
Включать в SWF-фильм можно и несжатый звук. В среде разработки этот режим называется Raw.