Перейти к содержанию

Ограничения, ошибки и передача аудиоредактора

Мы прошли путь от локального файла до WAV выбранного фрагмента. Теперь рассмотрим приложение целиком: как пользователь понимает текущее состояние, исправляет ошибку и получает результат. К концу урока подготовим маршрут проверки и передачу исходников, отделяя описанные возможности от реально подтверждённых. Это завершает учебную серию, но не заменяет будущую техническую проверку браузерного звука.

Полный проект доступен в архиве «Аудиомастерской». Исходники подготовлены локально; приложение не запускалось, звук не прослушивался, тесты не выполнялись. В README и expected.json это отмечено явно. Контрольные числа являются расчётами по модели, а не результатами выполненных экспериментов.

Жизненный цикл страницы

До открытия файла активны выбор записи и кнопка учебного тона. Поля фрагмента, воспроизведение и экспорт отключены, потому что нет буфера. При декодировании прежний звук останавливается, а действия с ним становятся недоступны. Успех устанавливает новый буфер и полный диапазон; ошибка оставляет страницу без открытого файла с объяснением.

Во время прослушивания можно остановить источник и поменять уровень. Изменение границ или переходов останавливает текущий запуск, чтобы новые параметры действовали с начала следующего. Во время экспорта устанавливается busy: выбор файла, тон, форма, проигрывание и повторный экспорт отключены. После успеха или ошибки finally возвращает управление.

Такой набор состояний проще проверить, чем произвольное количество флагов внутри каждой кнопки. В небольшой версии controls() вычисляет доступность из наличия буфера и busy. При дальнейшем развитии можно перейти к явной машине состояний, но названия переходов и допустимые действия нужно определить уже сейчас.

Состояние Главное допустимое действие
Нет буфера Открыть файл или создать тон
Буфер готов Настроить и прослушать участок
Идёт воспроизведение Остановить или изменить уровень
Идёт экспорт Дождаться результата или ошибки

Доступные элементы управления

Ввод выполнен обычными HTML-полями с подписями. Начало, конец и переходы можно задавать численно, не перетаскивая маленькие маркеры на волне. Кнопки имеют текстовые названия. Это даёт рабочий путь клавиатурному пользователю и делает значения понятными без просмотра графика.

Canvas показывает обзор, но не является единственным источником информации. Число каналов, частота, длина и длительность выводятся текстом. Индикатор положения дополняет проигрыватель, а не определяет границы. Для улучшения доступности потребуются реальные проверки фокуса, озвучивания статуса и удобства полей на мобильной клавиатуре.

Сообщения не следует обновлять на каждом семпле или каждом визуальном кадре. Живая область объявляет завершённые действия и ошибки, а позиция движется отдельно. Постоянный поток объявлений мешал бы услышать сам звук и пользоваться формой. Если добавить голосовую информацию о позиции, её частоту нужно выбирать по реальной потребности пользователя.

Ошибки имеют разные последствия

Файл больше лимита отклоняется до чтения. Неподдерживаемое или повреждённое содержимое может завершиться отказом декодера. Недопустимые границы не запускают граф. Неразрешённый AudioContext не должен выдавать фиктивный статус воспроизведения. Ошибка офлайн-обработки или кодирования должна вернуть доступность кнопок.

Сообщение о результате WAV содержит длину, размер Blob и количество ограниченных значений. Последний показатель не является оценкой качества всей записи. Он лишь говорит, сколько отдельных значений при преобразовании вышли за диапазон PCM16. Пользователю с важным материалом может понадобиться отдельная обработка, а не простое повторное скачивание.

Для более законченного продукта стоит уточнить ошибки возле конкретных полей и отделить постоянное состояние файла от временной строки действий. Сейчас основная область статуса может заменить одно сообщение другим. Такой интерфейс пригоден для разбора архитектуры, но удобство сложных ситуаций следует оценить отдельно.

Контрольные числа

Для 48 кГц и диапазона 0.25–0.75 секунды ожидаются границы 12 000 и 36 000, длина 24 000 и длительность 0.5. Stereo PCM16 даёт 96 000 байт звуковых данных и 96 044 байта полного файла нашего формата. Частота байтов равна 192 000, размер кадра — четыре байта.

Эти значения записаны в expected.json. Файл не запускает проверки автоматически и не доказывает совпадение браузерного результата. Он помогает следующему разработчику воспроизвести расчёт независимо. Для mono размер отличается: на кадр приходится два байта, поэтому тот же диапазон даст 48 000 байт данных и 48 044 байта файла.

Сравнение только размера тоже недостаточно. Перестановка каналов или неверный порядок байтов может сохранить длину. Нужны независимое чтение заголовка, проверка известной последовательности значений и открытие в другом плеере. Для слухового качества понадобятся записи разных типов и реальные устройства вывода.

Маршрут будущей проверки

Сначала откройте учебный тон и прослушайте полный участок. Затем задайте среднюю половину, добавьте начало и окончание, измените уровень и выгрузите WAV. Сопоставьте число кадров и длительность. После этого откройте допустимый stereo-файл и проверьте сохранение каналов. Наконец, попробуйте повреждённый файл, слишком большой файл и недопустимые параметры.

Отдельно быстро чередуйте выбор двух файлов и учебного тона. Старый асинхронный результат не должен заменить последнее намерение. Несколько нажатий проигрывания должны оставлять один активный источник. Остановка во время ожидания resume() не должна приводить к неожиданному позднему звуку. Эти сценарии пока описаны, а не выполнены.

Границы и дальнейшее развитие

Версия поддерживает короткие mono/stereo-записи, один участок, линейные переходы и PCM16 WAV. Здесь нет записи микрофона, многодорожечного монтажа, потокового декодирования, паузы с продолжением, MP3-кодера, нормализации и сохранения метаданных исходника. Добавление каждой функции меняет договор данных и жизненный цикл, а не только интерфейс.

Например, сохранение проекта потребовало бы решить, хранится ли сам звук или только ссылка на него и параметры. Микрофон добавит разрешение устройства и завершение медиапотока. Длинные файлы потребуют изучения памяти и фоновой работы; постдекодировочный лимит не защищает от всех затрат декодера. Эти расширения стоит планировать отдельными последовательными шагами.

Исходники разделены на договор, звуковой граф, визуализацию, кодер и интерфейс. README описывает локальное открытие через HTTP и ограничения. Следующему разработчику передаётся воспроизводимая структура и ожидаемые инварианты с честным статусом not_run. После технической проверки можно уточнять совместимость, измерять затраты и готовить публикацию, сохранив ту же ясность между данными, обработкой и представлением.

Оглавление серии