Эта программа — бесплатный конвертер различных аудиоформатов.
Конвертер форматов, простой редактор и консольный плеер в одном флаконе.
Краткая справка
Конвейерная обработка звука.
Автор : Адриан Чанг [Adrian J. Chung]
Перевод : С. Скороходов
С помощью программ обработки текста опытные пользователи Unix десятилетиями значительно облегчали себе редактирование документов. Такие консольные утилиты, как sed, awk, cut, paste и join, хотя и полезны каждая в отдельности, реализуют свой полный потенциал только при объединении в конвейеры с помощью программных каналов [pipelines] .
Linux теперь используется не только для работы с простым текстом в формате ASCII . Растущая популярность различных мультимедиа-форматов, содержащих изображения и аудиоданные, подстегнула разработку инструментария для работы с ними. Многие программы имеют графический интерфейс и не работают без взаимодействия с пользователем. Вместе с тем, все возрастающее число программных инструментов могут использоваться в пакетном режиме с отключенным пользовательским интерфейсом. Некоторые программы создаются специально для вызова из командной строки или скриптов.
Kendra roots for the Boston Red Sox – On the go with EF #76
Именно этот класс програмных утилит и будет рассмотрен в данной статье. Задачи сложного, комплексного преобразования медийных данных часто может быть осуществлена комбинацией простых инструментов с использованием техники, обычно применяемой в текстовых фильтрах. Мы сосредоточимся на потоковой аудио-обработке, поскольку именно в обработке этих форматов парадигма программных каналов Unix показала себя особенно успешной.
Установка
apt install sox
Использование
Преобразователь аудиосэмплов
Существует множество звуковых форматов и преобразование файлов из одного формата в другой – частая операция. Утилита sox может выполнять эту роль и вызывается из комнадной строки:
sox sample.wav sample.aiff
Приведенная выше комнада преобразует WAV-файл в формат AIFF. При этом можно изменить частоту дискретизации, число битов на отсчет (8 или 16), а также число каналов:
sox sample.aiff -r 8000 -b -c 1 low.aiff
Файл low.aiff содержать один канал с 8-битным сигналом, оцифрованном на частоте 8000 в секунду.
sox sample.aiff -r 44100 -w -c 2 high.aiff
А файл high.aiff – стерео-звучание с частотой дискретизации 44100 Гц, 16-бит на отсчет.
Когда sox не может угадать выходной формат по расширению файла, его необходимо указать явно:
sox sample.wav -t aiff sample.000
Опция «-t raw» указывает на специальный «беззаголовочный» формат, содержащий только «сырые» байты данных:
sox sample.wav -t raw -r 11025 -sw -c 2 sample.000
Т.к. у файла нет заголовка, указывающего частоту дискритизации, число битов на отсчет, число каналов и т.д., будет хорошей идеей явно указать в командной строке эту информацию. При преобразовании «файла-сырца» в формате raw это также необходимо:
sox -t raw -r 11025 -sw -c 2 sample.000 sample.aiff
Нет нужды указывать опцию «-t raw», если у файла есть расширение .raw. Однако это требуется делать, если поток данных поступает со стандартного ввода или посылается в стандартный вывод. Для того, чтобы сделать это, воспользуйтесь ключом «-» на том месте в строке параметров , где должно находиться имя файла:
SOX: Resampling — изменение частоты и разрядности звуковых файлов
sox -t raw -r 11025 -sw -c 2 — sample.aiff < sample.raw sox sample.aiff -t raw -r 11025 -sw -c 2 — > sample.raw
Зачем нам все это?
Так мы сможем использовать sox как фильтр в програмном канале.
Ускоренное/замедленное воспроизведение
Обычно, благодаря использованию интерполяции sox изменяет частоту дискретизации без изменения высоты тона или темпа воспроизведения. Перенаправляя выход одного «sox’а» на вход другого и указав неравные частоты дискретизации, мы можем «обойти» интерполяцию, в результате замедляя звучание отрывка:
sox sample.aiff -t raw -r 44100 -sw -c 2 — | sox -t raw -r 32000 -sw -c 2 — slow.aiff
или ускоряя его:
sox sample.aiff -t raw -r 32000 -sw -c 2 — | sox -t raw -r 44100 -sw -c 2 — fast.aiff
Простейшее редактирование
Предположим, что требуется звуковой отрывок, содержащий первые две секунды другого файла. Этого можно достичь, запуская sox в «командной трубе»:
sox sample.aiff -t raw -r 44100 -sw -c 2 — | head -c 352800 | sox -t raw -r 44100 -sw -c 2 — twosecs.aiff
Входной файл sample.aiff преобразовывается к частоте 44,1 кГц, каждые два байта в два канала. Две секунды звучания, таким образом, представлены в 44100х2х2х2 = 352800 первых байтах, которые обрезаются фильтром «head -c 352800».
Затем они преобразуются обратно в формат AIFF и сохраняются в twosecs.aiff.
Точно также можно извлечь последнюю секунду «сэмпла»:
sox sample.aiff -t raw -r 44100 -sw -c 2 — | tail -c 176400 | sox -t raw -r 44100 -sw -c 2 — lastsec.aiff
или его третью секунду:
sox sample.aiff -t raw -r 44100 -sw -c 2 — | tail -c +352801 | head -c 176400 | sox -t raw -r 44100 -sw -c 2 — lastsec.aiff
Обратите внимание на то, что при работе с 16-битным звуком параметр, передаваемый «tail -c +N» должен быть нечетным, иначе «сырые» отсчеты окажутся неверно выровненными.
Можно извлечь фрагменты разных звуковых отрывков и объединить их в один файл с помощью вложенных шелл-команд:
(sox sample-1.aiff -t raw -r 44100 -sw -c 2 — | head -c 176400 sox sample-2.aiff -t raw -r 44100 -sw -c 2 — | head -c 176400 ) | sox -t raw -r 44100 -sw -c 2 — newsample.aiff
В этом примере мы вызываем дочерний шелл, который «выдает сырые байты» из двух различных файлов в стандартный поток вывода, который в свою очередь перенаправляется процессу sox, выполняющемуся в родительском шелле и создающему результирующий файл.
Настольная система звуковоспроизведения
Опция командной строки «-t ossdsp» позволяет посылать звуки на OSS (open sound system) устройство /dev/dsp:
sox sample.aiff -t ossdsp /dev/dsp
В состав пакета sox обычно входит платформо-независимый скрипт play, который вызывает sox с подобающими случаю опциями. Предыдущую команду можно проще выполнить так:
play sample.aiff
Проигрываемые таким способом аудиофрагменты «монополизируют» воспроизводящую аппаратуру. Прежде, чем проиграть что-либо еще, другим «звучащим» приложениям приходится ждать, пока аудиоустройство освободится. «Рабочие столы» GNOME и KDE предоставляют возможности одновременного проигрывания более чем одного аудиофрагмента.
Звуки могут «издаваться» различными программами в любой момент времени без необходимости ожидать своей очереди, однако не каждое аудио-приложение знает, как это делается в каждом из различных «рабочих столов». sox такой способностью не обладает. Но, если дать себе труд хотя бы поверхностно изучить мультимедийные звуковый службы, предоставляемые GNOME и KDE, то можно легко придумать, как обойти это ограничение.
Существует много пакетов, позволяющих совместно использовать звуковые устройства. Одна часто используемая стратегия – запуск фонового сервера, которому приложения-клиенты посылают для проигрывания звуковые фрагменты. Сервер, в свою очередь, получает в свое распоряжение звуковое устройство и направляет на него аудиоданные. В случае, когда звуки поступают от двух и более программ сразу, сервер микширует их и направляет на устройство объединенный поток.
Такой подход используется в Enlightened Sound Daemon (ESD). Пользователи GNOME часто могут обнаружить запущенный в фоновом режиме сервер esd. Пакет ESD под именем esound входит в большинство дистрибутивов и включает несколько простых клиентских приложений:
esdplay – проигрыватель звуковых фрагментов, хранимых в наиболее популярныъ файловых форматах: WAV, AU или AIFF.
esdcat – посылает серверу звуковые данные в «сыром» формате raw. Эта утилита – естественный «оконечкик» объединяемых в конвейер звуковых фильтров.
Вот команда, проигрывающая через ESD первую секунду звукового фрагмента:
sox sample.aiff -t raw -r 44100 -sw -c 2 — | head -c 176400 | esdcat
Тот же прием используется для воспроизведения фрагментов в формате, который не понимает ESD, но «читает» sox:
sox sample.cdr -t raw -r 44100 -sw -c 2 — | esdcat
Иногда звучание лучше, если использовать этот способ. Некоторые версии ESD вносят в записанные на низкой частоте дискретизации звуки значительные искажения и шум.
ARtS – Analog RealTime Synthsizer – схож с ESD, но чаще используется в KDE. Фоновый сервер называется artsd, а «клиентские программы сопровождения» – artsplay и artscat.
Для проигрывания звукового отрывка выполните команду:
sox sample.cdr -t raw -r 44100 -sw -c 2 — | tail -c 352800 |artscat
Ни ESD, ни ARtS не зависят от собственно окружения какого-либо «рабочего стола». В теории, приложив некоторые усилия, можно использовать ESD с KDE, а ARtS – в GNOME. Любой из серверов можно использовать и в консольной сессии.
Таким образом можно микшировать все изобилие форматов как в графической среде, так и без нее.
Источник: sysadminmosaic.ru
SoX — Sound eXchange
SoX (Sound eXchange) — мощный C (си) консольный аудио-редактор, созданный в июле 1991 года Лэнсом Норскогом.
Изначально Sox назывался «Aural eXchange: Sound sample translator» и только во второй версии аудиоредактор был переименован в «Sound eXchange». В мае 1996-го года Крис Багвел выпустил обновление SoX до версии sox-11gamma-cb. SoX может быть использован в качестве консольного аудиоплейера (с помощью команды play music_file), поддерживает запись и чтение AU, WAV, AIFF, MP3, Ogg Vorbis, FLAC и др, запись и чтение аудиофайлов на многих системах (включая Интернет-запись и чтение), поддерживает редактирование звука (реверс, нормализаиця, фэйдер, Хорус, фланжер, фэйзер, компрессор и.т.д), изменение высоты звука, передискретизация, понижение уровня шума (с декабря 2004), FM-синтез, мультитрэк и спектроанализатор.
Лицензия: GPLv2 / LGPLv2
Источник: zenway.ru
Порт SoX для Android или попытка создать идеальный плеер
Здравствуй, Хабраюзер!
Несколько месяцев назад у меня появилась идея создания плеера под Android с огромным количеством эффектов. Единственным на то время (не знаю как сейчас:) плеером, с хоть какой-то обработкой звука, был PowerAMP, но количество аудио-эффектов в нем было мягко говоря скудным. Я попробовал реализовать эту идею. Из этого мало что вышло, но то, что получилось я расскажу в этом топике. Итак, кого заинтересовало, прошу под кат.
В поисках библиотеки.
Для начала я решил найти ту самую OpenSource библиотеку, которая может гибко обрабатывать звук, применяя различные эффекты. В конце концов я случайно познакомился с SoX. С первого взгляда это была идеальная библиотека для реализации такого проекта, но, оказалось, не все так просто…
Первые проблемы
По ходу знакомства с SoX я обнаружил такие проблемы:
1. Библиотека отлично работает на всех основных ОС, НО не оптимизирована под ARM.
2. Описание API библиотеки, как и само API, было достаточно скудным, почти все функции было проще реализовывать через командную строку.
3. SoX, вместо того, чтобы использовать один FFmpeg для декодирования, использует целый ряд библиотек (можете посмотреть на официальном сайте). Следовательно, все эти библиотеки так же придется собирать под Android NDK.
4. SoX отлично воспроизводил и декодировал практически любые форматы, но, при применении эффектов, аудио можно было либо декодировать в файл или byte массив, либо воспроизвести через Alsa/CoreAudio. Третий вариант не подходил однозначно, так как в Андроид Alsa теоретически есть, но работает не всегда и, вообще, это не рекомендованый метод воспроизведения звука. Следовательно, единственный вариант — декодировать все в byte массив и отдавать его в Java (AudioTrack). Но даже это реализовать оказалось достаточно сложно, так как… объясню на примере:)
Вот часть кода официального примера применения обработки звука с использованием эффектов:
assert(sox_init() == SOX_SUCCESS); assert(in = sox_open_read(argv[1], NULL, NULL, NULL)); /* Change «alsa» in this line to use an alternative audio device driver: */ assert(out= sox_open_write(«default», signal, NULL, «alsa», NULL, NULL)); chain = sox_create_effects_chain(encoding, encoding); e = sox_create_effect(sox_find_effect(«input»)); args[0] = (char *)in, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, signal, signal) == SOX_SUCCESS); e = sox_create_effect(sox_find_effect(«trim»)); args[0] = «10», assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, signal, signal) == SOX_SUCCESS); if (in->signal.rate != out->signal.rate) < e = sox_create_effect(sox_find_effect(«rate»)); assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS); assert(sox_add_effect(chain, e, signal, signal) == SOX_SUCCESS); > if (in->signal.channels != out->signal.channels) < e = sox_create_effect(sox_find_effect(«channels»)); assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS); assert(sox_add_effect(chain, e, signal, signal) == SOX_SUCCESS); > e = sox_create_effect(sox_find_effect(«output»)); args[0] = (char *)out, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, signal, signal) == SOX_SUCCESS); sox_flow_effects(chain, NULL, NULL);
В данном случае аудио декодируется, и применяется несколько эффектов, затем все выводится через ALSA. Как видите для того, чтобы создать effect_chain надо сначала иметь 2 потока: для чтения и для вывода информации. Вот официальный пример декодирования аудио файла по частям в byte array:
assert(sox_init() == SOX_SUCCESS); /* Open the input file (with default parameters) */ assert(in = sox_open_read(argv[1], NULL, NULL, NULL)); #if defined FIXED_BUFFER assert(out = sox_open_mem_write(buffer, buffer_size, signal, NULL, «sox», NULL)); #else assert(out = sox_open_memstream_write(buffer_size, signal, NULL, «sox», NULL)); #endif while ((number_read = sox_read(in, samples, MAX_SAMPLES))) assert(sox_write(out, samples, number_read) == number_read);
Как видите, в данном случае аудио декодируется частями, и программа получает буфер. Этот пример полностью рабочий, НО в нем практически невозможно применить эффекты (что и является целью программы), потому что для этого пришлось бы для каждой части аудио (размеров в 16484 байта) создавать поток чтения и записи в другой буфер и затем эти потоки обрабатывать. У меня это не вышло, да и ни в одном примере такая возможность не описана.
Тогда логично было бы декодировать все аудио с применением эффектов в один буффер, НО этот вариант использует много оперативной памяти (когда я тестировал доходило до 100 мб при декодировании небольшого аудио файла в 10-11 мегабайт).
Но все-таки решено попробовать.
Не смотря на эти проблемы, я решил начать портировать SoX и все сопутствующие библиотеки. Неделя ушла на знакомство с Android NDK. В принципе портирование было не сложным, однотипным процессом, который я описывал в прошлой статье. Некоторые библиотеки уже были собраны (например FFmpeg).
В конце концов я получил скомпилированный sox.so, который действительно работал и работает сейчас:) Пришло время решить проблему 3. Все оказалось не слишком сложно — создал отдельный поток, который по мере заполнения буфера отправляет его в Java программу, а та его воспроизводит. Проблема с памятью почти решена (все-таки ее используется много, но приложение это не роняет). Я получил приложение которое воспроизводит почти все форматы аудио и добавляет к нему эффекты (сейчас flanger, можно добавить любой другой). С одной стороны уже можно продолжать разработку, НО я получил сразу две новые проблемы:
1. Программа слишком сильно использует процессор (доходит до 80% при декодировании). Оптимизировать С код под ARM я не умею, поэтому решить это самостоятельно не вижу возможным.
2. Программа работает нестабильно. Приблизительно 1-2 из 10 запусков она ничего не воспроизводит (тестировал на Galaxy Tab). Эту проблему я так же не мог решить…
Итого, чтобы работа не пропала, я решил опубликование весь код на GitHub и написать статью тут. Ссылка на код. Если кто-то видит возможности решить эти проблемы — пишите мне в email или в личку. Надеюсь моя задумка кого либо заинтересует:)
Источник: habr.com