Программно перенаправить вывод звука конкретной программы в файл

8

Я хотел бы перенаправить звуковой вывод программы в файл, в командной строке, как в

$ redirect-wrapper file.wav my-program

так что

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

Есть ли способ сделать это? Этот связанный вопрос не помогает, мне нужно решение командной строки, нет "нажмите там, затем там". Это , вероятно, также связано, но также опирается на графическое приложение pavucontrol. Я нашел терминальную альтернативу pavucontrol, pacmd.

Но это все еще только делает возможным следующий компромисс:

  1. Получить сток по умолчанию и сохранить то, что было. Как? Вероятно, пролистываяpacmd list-sinks
  2. Установите приемник по умолчанию для приемника snd-aloop с помощью pacmd set-default-sink.
  3. Запись из этой раковины.
  4. Запустить приложение
  5. Подождите, пока приложение не откроет свой вход приемника: pacmd list-sink-inputs | grep name-of-my-programесли это что-то найдет, вход открыт.
  6. Измените значение по умолчанию обратно на то, что было с pacmd set-default-sink.
  7. Остановите запись, как только приложение закроется.

Но это все равно изменяет приемник по умолчанию на промежуток времени до пары минут (вход приемника обычно не открывается, пока программа фактически не воспроизводит звуки, которые не должны быть сразу после запуска). Я реализовал этот компромисс; Github .

Все еще в поисках бескомпромиссных ответов.

Никто
источник
Это может помочь: swview.org/node/213 Он временно меняется ~/.asoundrc. Может быть, вы можете избежать этого как-нибудь.
rudimeier
@rudimeier Это глобальная настройка устройства вывода по умолчанию. Независимо от того, из ~ / .asoundrc или по-другому, он всегда испортит всю аудиосистему.
Никто
Понятия не имею, но я думаю, что вы на правильном пути. Вывод pacmd listпоказывает, какие источники и приемники подключены к определенным программам, поэтому может быть способ их изменить. Попробуйте задать вопрос по списку pulseaudio по адресу lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss. Сопровождающие и разработчики всегда готовы помочь.
Джо
@Joe Переназначение приемников возможно с pacmd, да, но поскольку они распределяются только тогда, когда аудио действительно начинает воспроизводиться (по крайней мере, для некоторых программ; Firefox), это означает, что мне нужно будет искать их в узком цикле и, возможно, пропустить первые 0,5 с или около того аудио. Спасибо за совет о списке рассылки. :-)
Никто

Ответы:

2

Умм, так глядя на документацию по Pulseaudio.

man pulseaudio

У нас есть следующие переменные среды

   $PULSE_SERVER: the server string specifying the server to connect to when a client asks for a sound server connection  and  doesn't  explicitly  ask  for  a  specific
   server.  The server string is a list of server addresses separated by whitespace which are tried in turn. A server address consists of an optional address type speci‐
   fier (unix:, tcp:, tcp4:, tcp6:), followed by a path or host address. A host address may include an optional port number. A server address may be prefixed by a string
   enclosed in {}. In this case the following server address is ignored unless the prefix string equals the local hostname or the machine id (/etc/machine-id).

   $PULSE_SINK: the symbolic name of the sink to connect to when a client creates a playback stream and doesn't explicitly ask for a specific sink.

Надеемся, что это позволит вам полностью заменить приемник pulseaudio, а если этого недостаточно, запустите наш собственный одноразовый сервер pulseaudio.

Обращаясь к этой странице ( /ubuntu/60837/record-a-programs-output-with-pulseaudio ), мы узнаем о команде parec/ pacat(они являются псевдонимами), которая может записывать и записывать в приемники и потоки.

Собирая это вместе, мы имеем следующую обертку (которую я на самом деле не запускал - хотя я успешно использовал этот метод для работы на специальной основе)

sink_name="sink-$(date +%s)"
pacat $sink_name.monitor 
parec -d steam.monitor | oggenc -b 192 -o /tmp/steam.ogg --raw - &
pid=$!
PULSE_SINK=$sink_name "$@"
kill $pid
Att Righ
источник
Теперь я чувствую себя глупо. Спасибо. ^^ Со временем я научусь сначала читать документацию.
Никто