画面をキャプチャする のときにffmpeg
でオーディオを録音したいと思います。 alsa
を使用しているときに発生するエラーは、画像にサウンドカードがないことです-f alsa -ac 2 -i hw:0
Ubuntuの新しいバージョンで再現する方法は次のとおりです
新しいubuntudockerイメージでセッションを開始します。
docker pull ubuntu
docker run -it --rm ubuntu
セットアップalsa(Advanced Linux Sound Architecture)
apt-get update
apt-get install alsa-utils
サウンドカードを一覧表示する
aplay -l
# aplay: device_list:268: no soundcards found...
この画像にはサウンドカードがないため、このサウンドの再生は失敗します
Sudo aplay /usr/share/sounds/alsa/Front_Center.wav
編集:ローカルコンピューターで再生する必要がないことについてのBMitchへの最初のコメントを読んだ後
ユーザースペースコードとカーネルモジュールが必要ないため、pulseaudioを使用することをお勧めします。アルサがdockerで機能することは私にはありそうにないようです(私は間違っている可能性がありますが)
私がこれを行う場合:
apt-get update
apt-get install pulseaudio socat
apt-get install alsa-utils
apt-get install ffmpeg
# Start the pulseaudio server
pulseaudio -D --exit-idle-time=-1
# Load the virtual sink and set it as default
pacmd load-module module-virtual-sink sink_name=v1
pacmd set-default-sink v1
# set the monitor of v1 sink to be the default source
pacmd set-default-source v1.monitor
# Start the ffmpeg capture to an audio file
ffmpeg -f Pulse -i default out.mp3
その後、別の端末で
paplay /usr/share/sounds/alsa/Front_Center.wav
WAVファイルのオーディオはffmpegによってキャプチャされ、out.mp3に表示されます
Xのセットアップがどのように見えるかはよくわかりませんが、オーディオをpulseaudioに送ることができれば、ffmpegは実際のサウンドカードを必要とせずにオーディオをキャプチャします。
元の回答:オーディオをMac OSサウンドカードに送りたい場合
私はもともとこのページにアクセスしました。VMからMacOSにオーディオを再生しようとしていました。しかし、VMから取得する必要がない場合は、次のようにします。非常に複雑です。このアイデアが私がここにたどり着いた理由だったので、ここに残しておきます
VM内でpulseaudioを使用して、WAVファイルを物理サウンドカードに再生することができます。MacOSSierraでdocker17.03.1-ceを使用しており、brewを使用してsoxをインストールしています。このセットアップでは、socatをVMにインストールする必要もありますが、pulseaduioの知識が豊富な人(または時間があれば)は、この部分を削除できるはずです。
戦略は、paplayを使用してpulseaudioを介してwavファイルを再生し、pulseaudioがVMの起動時に公開したポートでネットワーク経由でオーディオを送信するようにすることです。 Mac側では、この公開されたポートに接続し、soxを介してMacにデータを送信します。
1。MAC:公開されたポートでイメージをプルして実行します
docker pull ubuntu
docker run -it --rm -p 127.0.0.1:3000:3000 ubuntu
2。VM:requireパッケージを更新してインストールします
apt-get update
apt-get install pulseaudio socat
apt-get install alsa-utils
私はwavファイルにalsa-utilsをインストールするだけなので、これを削除できます
。VM:pulseaudioサーバーを起動します
pulseaudio -D --exit-idle-time=-1
これは、サーバーにバックグラウンドにフォークし、非アクティブに基づいて終了しないように指示します
4。VM:pulseaudioの「シンク」を作成
シンクは、pulseaudioがオーディオデータを特定の形式で送信する場所です。
pacmd load-module module-pipe-sink file=/dev/audio format=s16 rate=44100 channels=2
これにより、44100Hzで符号付き16ビット2チャネルのファイル/ dev/audioにオーディオが送信されます。
5。VM:ファイルをネットワークに添付
このファイルをネットワークに「接続」する必要があります。socatを使用して、公開されたアドレスにリスニングソケットを作成します(注:ここには認証はありません)。これは、Mac側が接続したときに音声を送信する準備ができています。
socat file:/dev/audio tcp-listen:3000
6。[〜#〜] mac [〜#〜]:ネットワークからsoxにデータを読み取る
Mac側では、このポートに接続し、詳細をsox経由でオーディオドライバーに送信する必要があります。
nc 127.0.0.1 3000 | sox -traw -r44100 -b16 -c2 -e signed-integer - -d
macにはデフォルトでnetcat(nc)があるため、ここでこれを使用して公開ポートに接続し、データをsoxにパイプします。フラグは、上記の「load-module」ステートメントで設定された値と一致します。
7。VM:再生!
最後に、pulseaudioパッケージのpaplayを使用して、WAVファイルを再生できます。
paplay /usr/share/sounds/alsa/Front_Center.wav
8。MAC:聞いてください! Mac側では、ここでオーディオが表示され、soxからの出力を確認できるはずです。これには小さなレベルメーターが含まれており、これは動くはずです:
$ nc 127.0.0.1 3000 | sox -traw -r44100 -b16 -c2 -e signed-integer - -d
-: (raw)
File Size: 0
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
Duration: unknown
In:0.00% 00:00:06.78 [00:00:00.00] Out:299k [ | ] Clip:0
逆の操作(つまり、MacオーディオをVM上のpulseaudioに送信する)も、同様の、ただし逆方向のセットアップ(module-pipe-source?)で可能であるはずです。
Xサーバーがないため、ffmpegページのコマンドに対してこれをテストしていません。
キーは、デバイスをコンテナーにマップするdockerrunコマンドにあると思います。これを試して:
docker run -ti --rm \
-v /dev/snd:/dev/snd \
--lxc-conf='lxc.cgroup.devices.allow = c 116:* rwm' \
myContainer sh -c "echo run something"`
ここ から抽出。これがうまくいかない場合は、このリンクにさらに多くのオプションがあります。見てみな!
これはあなたが望んでいるよりもはるかに難しいでしょう。 Dockerは組み込みVMで実行されるため、最初にサウンドカードをVMにマップする必要があります。 VMにマップされると、docker run --device=/dev/snd:/dev/snd ...
を実行して、デバイスをVMからコンテナーにマップできます。
特にMacとLinuxは異なるオペレーティングシステムであるため、この問題は最初の部分です。必要なクロスプラットフォーム/ devデバイスを作成するツールをインストールするための いくつかのオプション があるようです。これを行ったら、これらのデバイスをVMで共有するようにVMを構成する必要があります。