Столкнувшись с форматом Raw GSM 6.10 audio stream (.gsm) первый раз я решил пойти по пути наименьшего сопротивления и найти готовое решение для проигрывания таких файлов онлайн.

Наткнувшись на github на единственный вменяемый плеер под названием WavPlayer, поддерживающий формат Raw GSM 6.10 Audio Stream, я ужаснулся от его интерфейса да и написан он был на языке haXe. К счастью есть такой замечательный проект audio.js который представляет из себя симпатичный frontend JS плеер с backend кодеком на Flash.

Довольно быстро возникло желание совместить эти два проекта. Бегло осмотрев архитектуру плеера и api кодека, я отбросил всякое желание менять JS код плеера для совместимости с WavPlayer. Остался вариант переписать кодек, этим я и занялся.

До знакомства с WavPlayer я и понятия не имел о языке haXe на котором он написан. Посмотрев исходники кодека и почитав пару заметок на сайте языка haXe я довольно быстро освоил синтаксис который сильно напоминает ActionScript. Посидев несколько вечеров я закончил переписывание api, попутно исправив пару багов на которые автор явно забил, а может они проявляются только при проигрывании файлов gsm. Результатом всех усилий стал форкнутый проект, который можно посмотреть на github.

Сборка

Для самостоятельной сборки кодека необходимо установить haXe, скачать исходники кодека с github и скомпилировать командой:

haxe audiojs.hxml

В результате получится файл с названием audiojs.swf реализующий полный набор api методов которые необходимы для совместной работы с audio.js.

Готовый файл можно сказу скачать по ссылке.

Установка

  1. Устанавливаем скрипт audio.js
  2. Заменяем оригинальный файл audiojs.swf на новый
  3. А также в при инициализации скрипта необходимо указать в настройках useFlash: true.

Это необходимо чтобы флеш кодек использовался даже тогда когда браузер поддерживает формат audio тегов.

audiojs.events.ready(function() {
    audiojs.createAll({
      'useFlash': true // всегда использовать флеш
    });
});

Теперь для прослушивания online любой записи в формате .gsm достаточно вставить тег указывающий на файл. Например:

<audio src="test.gsm" />