Лабораторний журнал Tenebrosus Scriptor'а - Запись аудиовыхода со звуковой карты -- Linux [entries|archive|friends|userinfo]
featar

[ website | Забруднив мережу цим ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

Запись аудиовыхода со звуковой карты -- Linux [Oct. 22nd, 2010|03:17 am]
Previous Entry Add to Memories Tell A Friend Next Entry
[Tags|, , ]

Нашел наконец вещь, которую давно искал.

Иногда бывают ситуации, когда легко воспроизвести какие-нибудь звуки на системе, но сложно записать их в файл. Теоретически вроде бы такую возможность можно найти в любом конкретном случае, но зачастую это долго, геморно и неочевидно. Наиболее удобным вариантом просится взять уже скомпонованный звук. Но писать микрофоном с колонок -- слишком низкое качество. Взять с линейного выхода карты и завернуть на вход микрофона -- чуть лучше, но тоже не очень. Лучше всего было бы брать с самой карты либо непосредственно перед отправкой на нее.

Под виндой такую функцию выполняют некоторые программы для снятия музыки с CD-дисков и найти их не проблема.

Под Linux пришлось поискать дольше.

Однако в итоге все оказалось проще.

Итак, у сервера PulseAudio есть утилита parec из пакета pulseaudio-utils, которая выдает поток со входного устройства. А в качестве входного устройства можно передать монитор выходного потока.

Поиск входного устройства осуществляется командой pactl list из того же пакета.

Для облегчения жизни публике здесь выложен маленький bash-скрипт, делающий это.

Скрипт сам находит монитор выходного потока, подключается к нему и пишет в файл, указанный как параметр. Побочный эффект -- с помощью sox идет конверсия из формата pcm в формат wav. Впрочем, при желании это можно убрать, либо настроить автоматическую конверсию в что-нибудь еще (ogg, например), либо использовать другой конвертор, если sox по каким-либо причинам нежелателен или недоступен.

Но! На кириллизованных системах есть проблема, т.к. скрипт ожидает англоязычный вывод команды pactl list. Чтобы это исправить, принудительно установим английскую локаль системы для этого процесса, указав в начале скрипта:

LC_ALL=C
LANG=C


А в остальном -- все хорошо)

Скрипт работает от пользователя.
LinkLeave a comment