
FFmpeg를 통해 icecast 스트림을 udp로 전송하고 싶지만 icecast 스트림이 삭제되면 FFmpeg도 삭제됩니다. icecast 스트림을 alsa 더미 장치로 라우팅할 수 있다면 FFmpeg를 통해 데이터를 얻을 수 있을 것 같습니다. 예를 들어:
ffmpeg -f alsa -i hw:Dummy,0 -f mpegts udp://ip:port
그런 다음 icecast 스트림이 삭제되는 경우 출력 UDP 스트림이 자동으로 재생되고 이 스트림을 다시 사용할 수 있을 때까지 오디오를 계속 재생합니다. (이것은 나의 가정이다).
icecast 스트림을 alsa 더미 장치로 라우팅하는 방법이 있습니까?아니면 icecast 스트림이 중단되는 경우 자동으로 재생되도록 icecast 스트림을 udp로 라우팅한 다음 icecast 스트림을 다시 사용할 수 있게 되면 자동으로 일반 재생으로 돌아가는 또 다른 변형이 있습니까?
답변1
나는 귀하의 의견을 "Pulseaudio를 사용하여 해도 괜찮습니다"라고 해석합니다. 나는 이것을 테스트하지 않았지만 내가 할 일은 다음과 같습니다.
먼저 Pulseaudio "null" 싱크를 만듭니다.
pacmd load-module module-null-sink sink_name=icecast sink_properties=device.description=Icecast
Pulseaudio에서는 각 싱크에 연결된 .monitor
소스가 있으므로 이러한 방식으로 사운드를 싱크로 출력 icecast
하고 소스를 사용하여 다른 응용 프로그램에서 처리할 수 있습니다 icecast.monitor
.
내가 당신을 올바르게 이해했다면 당신은받다컴퓨터의 icecast 스트림. 스트림을 싱크로 출력하려면 icecast
다음과 같이 하십시오.
mplayer http://your.icecast.server -ao pulse::icecast
icecast 스트림이 종료되면 mplayer
종료되므로 이를 무한 while
루프 내부의 쉘 스크립트로 래핑합니다.
"ffmpeg를 통해 udp로 스트리밍" 부분으로 무엇을 하려는지 잘 모르겠습니다. 어쨌든 이제 다음을 icecast.monitor
사용하여 읽을 수 있습니다.
ffmpeg -f alsa -i pulse ...
올바른 소스를 사용 pavucontrol
하거나 선택하는 동안 또는 펄스 오디오 지원으로 컴파일하는 경우 직접pamcd
ffmpeg
ffmpeg -f pulse -i icecast.monitor ...
그러나 "그 icecast 스트림을 내 홈 네트워크의 다른 컴퓨터에 배포하고 싶습니다"라는 아이디어가 있다면펄스오디오 RTP 모듈우선 싱크대로.
내가 말했듯이, 이 중 어느 것도 테스트되지 않았습니다. 작동하려면 부품을 조정해야 할 수도 있습니다.
편집하다
또한 ALSA 더미 장치가 처음부터 작동할지 확신할 수 없습니다. 제가 이해하기로는 이 장치는 실제로 "더미" 장치일 뿐이며 루프백을 제공하지 않습니다. 이를 위해서는 루프백 장치를 사용해야 하며 snd-aloop
샘플링 속도 문제 등이 지속적으로 발생하기 때문에 이것은 약간 고통스럽습니다.
따라서 Pulseaudio 인프라를 사용하는 것이 더 좋습니다.
답변2
더미 장치 대신 루프백 장치를 사용할 수 있습니다.
루프백 장치는 기본적으로 활성화되어 있지 않으므로 먼저 원하는 하위 스트림 유형과 수를 지정하는 인수와 함께 snd-aloop 커널 모듈을 로드해야 합니다.
# modprobe snd-aloop index=0 pcm_substreams=1
그런 다음 icecast를 로 라우팅하는 대신 에서 ffmpeg로 해당 스트림을 hw:Dummy,0
라우팅하고 읽을 수 있습니다 .hw:Loopback,0,0
hw:Loopback,1,0