Запись звука на Ubuntu Docker Image

Я хотел бы записать аудио с ffmpeg, когда я захватил мой экран. Ошибка, которую я получаю при использовании alsa, заключается в том, что у моего изображения нет звуковой карты -f alsa -ac 2 -i hw:0

Вот как воспроизвести новую версию Ubuntu

Запустите сеанс в новом изображении докеры Ubuntu.

docker pull ubuntu
docker run -it --rm ubuntu

Настройка alsa (Расширенная звуковая архитектура Linux)

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

Ответ 1

РЕДАКТИРОВАТЬ: после прочтения первого комментария к BMitch о необходимости не проигрывать на локальном компьютере

Im, рекомендующий использовать pulseaudio, так как его код пользовательского пространства и модули ядра не нужны. Мне было бы маловероятно, что alsa будет работать на докеров (хотя я могу ошибаться)

Если я это сделаю:

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, но если вы можете получить звук, идущий на пульсаудио, тогда ffmpeg будет захватывать звук без необходимости реальной звуковой карты

Исходный ответ: если вы хотите, чтобы звук попал на звуковую карту Mac OS

Я изначально попал на эту страницу, потому что пытался воспроизвести аудио из VM на Mac OS. Но если вы не заботитесь о том, чтобы получить эту виртуальную машину, то это слишком сложно. Я оставляю его здесь, хотя, поскольку эта идея была причиной, почему я оказался здесь

Можно использовать pulseaudio в виртуальной машине для воспроизведения WAV файла на физическую звуковую карту. Я использовал докер 17.03.1-ce на Mac OS Sierra и использовал brew для установки sox. Эта настройка также требует, чтобы на виртуальной машине был установлен socat, но кто-то, у кого больше знаний о пульсаудио (или если я получаю больше времени), должен уметь удалить эту часть, я думаю,

Стратегия состоит в том, чтобы использовать paplay для воспроизведения wav файла через pulseaudio, и pulaudio отправляет аудио через сеть на порт, который вы опубликовали при запуске виртуальной машины. На стороне Mac вы подключаетесь к этому опубликованному порту и отправляете данные через sox на Mac.

1. MAC: вытащить и запустить изображение с опубликованным портом

    docker pull ubuntu
    docker run -it --rm -p 127.0.0.1:3000:3000 ubuntu

2. VM: обновите и установите требуемые пакеты

    apt-get update
    apt-get install pulseaudio socat
    apt-get install alsa-utils

Im только установка alsa-utils для wav файла, поэтому вы можете удалить этот

3. VM: запуск сервера pulseaudio

    pulseaudio -D --exit-idle-time=-1

Это указывает серверу на fork на задний план и не выходить из режима бездействия

4. VM: создайте "приемник" для pulseaudio

Раковина - это то, где pulseaudio отправит аудиоданные в определенном формате:

    pacmd load-module module-pipe-sink file=/dev/audio format=s16 rate=44100 channels=2

Это отправит звук в файл /dev/audio в 16-битном 2-канальном формате с частотой 44100 Гц.

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 с флагами sox, чтобы они соответствовали значениям, указанным выше в инструкции "load-module".

7. VM: Играть!

Наконец, используя paplay из пакета pulseaudio, можно воспроизводить 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 в пульсаудио на виртуальной машине) также должно быть возможно с помощью аналогичной, хотя и обратной настройки (module-pipe-source?)

Я не тестировал это против команд на странице ffmpeg, поскольку у меня нет X-сервера.

Ответ 2

Я думаю, что ключ находится в команде запуска docker для сопоставления устройства в контейнер. Попробуйте следующее:

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

Это будет намного сложнее, чем вы надеетесь. Поскольку Docker работает во встроенной виртуальной машине, вам нужно сначала сопоставить звуковую карту с виртуальной машиной. После сопоставления с виртуальной машиной вы можете сделать docker run --device=/dev/snd:/dev/snd ... для сопоставления устройства с виртуальной машиной в контейнере.

Проблема заключается в первой части, особенно потому, что Mac и Linux - это разные операционные системы. Как представляется, некоторые параметры устанавливают инструменты, которые создают необходимые кросс-платформенные/dev-устройства. После этого вам необходимо настроить виртуальную машину для совместного использования этих устройств в виртуальной машине.