web-dev-qa-db-ja.com

UbuntuDockerイメージでサウンドを録音する

画面をキャプチャする のときに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
15
Daniel Rasmuson

編集:ローカルコンピューターで再生する必要がないことについての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ページのコマンドに対してこれをテストしていません。

14
spacepickle

キーは、デバイスをコンテナーにマップする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"`

ここ から抽出。これがうまくいかない場合は、このリンクにさらに多くのオプションがあります。見てみな!

3
OscarAkaElvis

これはあなたが望んでいるよりもはるかに難しいでしょう。 Dockerは組み込みVMで実行されるため、最初にサウンドカードをVMにマップする必要があります。 VMにマップされると、docker run --device=/dev/snd:/dev/snd ...を実行して、デバイスをVMからコンテナーにマップできます。

特にMacとLinuxは異なるオペレーティングシステムであるため、この問題は最初の部分です。必要なクロスプラットフォーム/ devデバイスを作成するツールをインストールするための いくつかのオプション があるようです。これを行ったら、これらのデバイスをVMで共有するようにVMを構成する必要があります。

2
BMitch