프로그래밍 방식으로 특정 프로그램의 오디오 출력을 파일로 리디렉션

프로그래밍 방식으로 특정 프로그램의 오디오 출력을 파일로 리디렉션

프로그램의 오디오 출력을 명령줄의 파일로 리디렉션하고 싶습니다.

$ 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. 애플리케이션이 종료된 후 녹음을 중지하세요.

그러나 이로 인해 최대 몇 분 동안 기본 수신기가 변경됩니다(수신기 입력은 일반적으로 시작 직후가 아니라 프로그램이 실제로 사운드를 재생할 때까지 켜지지 않습니다). 나는 이 타협안을 구현했습니다.지텁.

여전히 타협할 수 없는 답변을 찾고 있습니다.

답변1

글쎄, pulsaudio 문서를 살펴보십시오.

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.

이를 통해 귀하의 펄스오디오 수신기를 완전히 교체할 수 있기를 바랍니다. 충분하지 않은 경우 일회용 펄스오디오 서버를 실행하십시오.

이 페이지를 참조하세요(https://askubuntu.com/questions/60837/record-a-programs-output-with-pulseaudioparec), 싱크와 스트림에서 기록하고 쓸 수 있는 / 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

관련 정보