PulseAudio로 프로그램 출력 기록


49

커맨드 라인 / bash 스크립트를 사용하여 PulseAudio 로 프로그램의 출력을 기록하고 싶습니다 . 모든 출력을 기록하지 말고 특정 프로그램의 출력 만 기록하는 것이 중요합니다.

나는 새로운 널 싱크를 만들어야하고 프로그램의 출력을이 새로운 싱크로 이동시켜야한다고 생각했습니다. 보다 것은 말할 parec 기록이 특정 모니터를 사용하는.

첫 번째 단계는 다음과 같습니다.

pactl load-module module-null-sink sink_name=steam

그러나 이제 프로그램의 출력을이 싱크로 옮기는 방법은 무엇입니까?
bash 스크립트로 특정 싱크를 기록하는 방법은 무엇입니까?

답변:


52

다음과 같이 해보십시오 :

터미널에서

pacmd

(PulseAudio- 서버의 CLI) 다음을 사용하십시오.

list-sink-inputs

(실행중인 입력의 색인을 얻는 위치) 이제 입력의 색인을 찾으십시오. 이제 $ INDEX라고합니다

스크립트 가능한 부분은 다음과 같습니다.

pactl load-module module-null-sink sink_name=steam
pactl move-sink-input $INDEX steam
parec -d steam.monitor | oggenc -b 192 -o steam.ogg --raw -

설명 :

  • 첫 번째 명령은 이미 알고 있듯이 널 싱크를 추가합니다.
  • 두 번째 명령은 싱크 입력을 표준 오디오 싱크에서 스팀으로 이동
  • 세 번째 명령은 장치 증기 (-d)의 모니터를 기록하고 출력 (원파 스트림)을 oggenc에 넣습니다.이 스트림을 oga 파일로 인코딩합니다. (mp3 용 절름발이)

훌륭합니다.이 위대한 답변에 감사드립니다! :)
강제

2
이 작업을 취소하는 방법을 설명해 주시겠습니까? 내 널 싱크는 여전히 다양한 응용 프로그램에 매핑되어 있으며 소리가 들리지 않습니다!
ixtmixilix

@ixtmixilix : 모든 설정을 기본값으로 복원하는 가장 쉬운 방법은 펄스 오디오 서버를 종료하고 다시 시작하는 것입니다. autospawn (기본값)으로 설정하면 pulseaudio -k터미널에서 간단하게 발행 합니다.
Takkat

1
@ixtmixilix 실행할 때 값 list-sink-inputs을 기록해 두십시오 sink. 다시 바꾸려면 그냥 실행하십시오 pactl move-sink-input $INDEX $SINK. 같은 것pactl move-sink-input 4719 1
Ciaran

27

이 스레드의 Waschtl 응답 을 개선 하여 앱 사운드를 듣고 녹음 할 수 있습니다 .

먼저 기본 출력을 찾아 싱크 이름을 $DEFAULT_OUTPUT다음 과 같이 입력합니다 .

$ pacmd list-sinks | grep -A1 "* index"
  * index: 1
    name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
$ DEFAULT_OUTPUT=$(pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+")
$ echo $DEFAULT_OUTPUT
alsa_output.pci-0000_00_1b.0.analog-stereo

그런 다음 하나의 슬레이브 $ DEFAULT_OUTPUT 을 갖는 결합 싱크 를 만듭니다 . 앱 (소스)에서 생성 된 사운드는 슬레이브 싱크 (예 : 실제 출력)로 전달되고 녹음됩니다. 소스 사운드가 전달되지 않는 널 싱크 와 다릅니다 .

$ pactl load-module module-combine-sink \
  sink_name=record-n-play slaves=$DEFAULT_OUTPUT \
  sink_properties=device.description="Record-and-Play"

sink_properties 설명이며 설명 이름에 공백을 사용하면 버그가 발생할 수 있습니다.

그런 다음, 우리가 사용하는 수 pactl move-sink-input ...의 명령을 Waschtl 대답 (로 기록 앤 플레이 대신 증기 있지만) GUI는 pavucontrol(/ 문제 해결을 확인하기위한 큰) 더 간단하다 :

$ sudo apt-get install pavucontrol
$ pavucontrol &

그런 다음 녹음하려는 앱에서 소리를 재생합니다. 에서 pavucontrol Playback탭, 우리는 응용 프로그램 드롭 다운 목록에서 선택 : "기록 앤 플레이"를 .

마지막으로 동시에 녹음하고 듣는 것이 좋습니다! ( lame mp3 예, 전경에서 실행)

$ parec --format=s16le -d record-n-play.monitor | \
  lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3"

또는 백그라운드에서 녹화하고 언제든지 중지 할 수 있습니다.

$ parec --format=s16le -d record-n-play.monitor | \
  lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3" \
   > /dev/null &1>/dev/null
$ killall -q parec lame

NB :

  • 모든 것을 제거하거나 절차를 다시 시도하려면 : 이 답변 을 사용하여 싱크를 삭제하거나 재설정하십시오 . pulseaudio -k모든 것을 세션의 기본값으로 재설정하는 데 효과적입니다.
  • 시스템 사운드 설정에서 기본 출력을 변경하면 사용자 정의 앱 재생 설정을 덮어 쓰게되며이를 다시 pavucontrol로 돌아가 결합 된 인터페이스로 설정해야합니다.
  • 여러 개의 "실제"인터페이스 (예 : 헤드폰, HDMI 출력 등)에서 소리를들을 수 있으려면 레코드 -n- 플레이 슬링 슬레이브 로들을 때 사용할 수있는 모든 "실제"출력을 포함해야합니다. 같은 : pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

편집 : Ubuntu 18 (17도 가능)이므로 결합 된 싱크는 실제 출력 장치 대신 기본 시스템 출력 장치가되는 경향이 있습니다. 따라서 시스템 트레이의 사운드 아이콘을 사용하여 볼륨을 변경하면 레코드 사운드에 영향을줍니다. 해결 방법 : 결합 싱크를 생성 한 후 pavucontrol출력 탭에서 엽니 다 . "보기 : 가상 출력 장치"를 선택하고 결합 된 싱크의 사운드 볼륨을 100 %로 재설정하십시오. 그런 다음 "보기 : 하드웨어 출력 장치"를 선택하고 실제 출력 장치에서 녹색 아이콘 "대안으로 정의"를 누르십시오.


9

@ Waschtl의 대답은 환상적입니다. @ixtmixilix는 녹음이 끝난 후 일반 오디오를 복원하는 방법에 대해 물었습니다. 내가 아는 가장 쉬운 방법은 다음과 같습니다.

pavucontrolGUI를 설치하고 실행하십시오 . 당신은 당신의 오디오 출력 응용 프로그램을 볼 수 Playback있고 거기 의 탭 아래에 볼륨 미터 입니다. 옆에 Null Output 에서 재생 중임을 나타내는 버튼이 있습니다 . 그것을 클릭하고 일반 오디오 출력, 내장 오디오 아날로그 스테레오 로 변경하십시오 .

찾고있는 스크린 샷은 다음과 같습니다.

스크린 샷

load-module@Waschtl의 답변에서 명령을 실행 하여 싱크를 생성 한 후에이 방법을 사용하여 나중에 녹화를 설정할 수도 있습니다 .


가능하면 Imgur에 스크린 샷을 업로드 하여 답변에 연결하십시오.
Lucio

그것이 가능한지 모르겠지만, 가장 좋은 방법은 널 출력 모듈을 언로드하는 것입니다. 그래서 새로운 재생이 기본적으로 픽업되지 않습니다
Jack

6

레코드 앤 플레이를 항상 사용할 수있게하려면 KrisWebDev 의 답변을 더욱 향상 시키 십시오. 먼저 기본 출력을 찾으십시오.

pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+"

다음과 같은 결과가 출력됩니다.

alsa_output.pci-0000_00_1b.0.analog-stereo

다음으로 파일을 작성하십시오 ~/.config/pulse/default.pa.

.include /etc/pulse/default.pa

load-module module-combine-sink sink_name=record-n-play slaves=alsa_output.pci-0000_00_1b.0.analog-stereo sink_properties=device.description="Record-and-Play"

명령 alsa_output.pci-0000_00_1b.0.analog-stereo에서 얻은 출력으로 바꾸십시오 pacmd. 사용자 정의 구성 파일이 존재하면 Pulse가 기본 구성 파일을 읽지 않습니다. 따라서 위의 첫 번째 줄에 기본 구성 파일이 포함됩니다. 그렇게하면 pulseaudio는 여전히 기본 구성을 먼저로드합니다.

실행 pulseaudio -k새가 새 구성으로 시작되도록 현재 펄스 오디오 인스턴스를 죽일.

언제든지 여기에서 변경 사항을 취소하려면 ~/.config/pulse/default.pa파일을 제거하고을 실행하십시오 pulseaudio -k.

record-n-play가 모든 출력의 기본 싱크가되도록하려면 다음 끝에 또 다른 라인을 추가하여이를 수행 할 수 있습니다 ~/.config/pulse/default.pa.

set-default-sink record-n-play

pulseaudio가 이미 정보를 저장 한 프로그램의 경우, 마지막에 사용한 출력 장치를 기억하므로 KrisWebDev의 답변에 설명 된 방법 중 하나를 사용하여 수동으로 재구성해야합니다.


2

@Waschtl 및 @KrisWebDev 답변에서 제공하는 답변을 기반 으로이 bash 스크립트를 만들었습니다.

여기에서 사용 가능합니다 : https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

사용하는 방법?

$ ./pulse-recorder.bash 
    index: 225
                application.name = "ALSA plug-in [mplayer]"
                module-stream-restore.id = "sink-input-by-application-name:ALSA plug-in [mplayer]"
Choose recording index: 225
temp.mp3 file already exist, replace (y/n)? y

새로운 버전

이전 스크립트보다 개선 된 Python 스크립트를 만들었습니다. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

사용하는 방법?

$ ./pulse-recorder.py 

1 - ALSA plug-in [mplayer]
2 - AudioIPC Server

Please enter a number: 1

Your selection was: ALSA plug-in [mplayer]
Please press enter when you are ready to start

enter를 누르면 녹음이 즉시 시작됩니다. 입력 할 때까지 애플리케이션이 이미 중지 된 경우 (예 : mplayer를 닫은 경우) 스크립트는 앱이 다시 나타날 때까지 기다린 후 기록을 시작합니다.

해당 스크립트에 대한 유일한 단점은 (원본과 비교하여) 목록에 동일한 이름의 항목이 두 개 있으면 스크립트가 올바르게 작동하지 않는다는 것입니다. 예를 들어

$ ./pulse-recorder.py                                                                                                      

1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]

여러 출력 (예 : 스피커, 여러 헤드셋, 모니터 오디오)이있는 경우 21 행에서 다음과 같이 바꿀 수 있습니다. default_output = alsa_output.pci-0000_00_1b.0.analog-stereo 여기서 pacmd list의 출력에서 싱크대
smaudet 03.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.