ICECAST ストリームを alsa ダミーデバイスにルーティングする

ICECAST ストリームを alsa ダミーデバイスにルーティングする

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 ストリームが再び利用可能になったときに自動的に通常の再生に戻るように、icecast ストリームを UDP にルーティングする別の方法はありますか?

答え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デバイスがpulseaudioサポートでコンパイルされている場合は、直接

ffmpeg -f pulse -i icecast.monitor ...

しかし、「アイスキャストのストリームを自宅のネットワーク内の他のコンピュータに配信したい」という場合は、Pulseaudio RTP モジュールまず第一にシンクとして。

前述したように、これらはいずれもテストされていないため、動作させるには部品を調整する必要があるかもしれません。

編集

また、そもそも ALSA ダミー デバイスが機能するかどうかもわかりません。私の理解では、それらは実際には単なる「ダミー」デバイスであり、ループバックを提供しません。snd-aloopそのためにはループバック デバイスを使用する必要がありますが、これはサンプリング レートの問題などに常に直面するため、少し面倒です。

したがって、Pulseaudio インフラストラクチャを使用する方が本当に良いでしょう。

答え2

ダミーデバイスの代わりにループバックデバイスを使用できます。

ループバック デバイスはデフォルトでは有効になっていないため、最初に snd-aloop カーネル モジュールを引数とともにロードし、必要なタイプとサブストリームの数を指定する必要があります。

# modprobe snd-aloop index=0 pcm_substreams=1

次に、icecast を にルーティングする代わりにhw:Dummy,0、 にルーティングしてhw:Loopback,0,0、 から ffmpeg でそのストリームを読み取ることができますhw:Loopback,1,0

関連情報