
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
。