запись звука с веб-аудиоплеера с помощью петлевого устройства ALSA


9

Я пытаюсь сохранить сообщения голосовой почты с телефона Verizon Fios в лучшем качестве. Сообщения голосовой почты доступны онлайн , но только для воспроизведения (проигрыватель на основе Java), без сохранения. Официально не существует способа сохранить оригинальные цифровые голосовые сообщения в виде файлов из службы Fios Digital Voice (нет платных услуг, нет ничего, нет причин, почему).

Моя единственная идея состояла в том, чтобы записывать цифровые данные с плеера, пока он находится на звуковой карте. Я попробовал конфигурацию Linux ALSA с помощью петлевого устройства.

# cat /etc/asound.conf

# default device
pcm.!default {
    type plug
    slave.pcm "loop"
}

# output device
pcm.loopout {
    type dmix
    ipc_key 328211
    slave.pcm "hw:Loopback,0,0"
}

# input device
pcm.loopin {
    type dsnoop
    ipc_key 686592
    slave.pcm "hw:Loopback,1,0"
}

# duplex plug device
pcm.loop {
    type plug
    slave {
      pcm {
         type asym
         playback.pcm "loopout"
         capture.pcm "loopin"
      }
    }
}

Кажется, это работает и записывает звук, например, при воспроизведении чего-либо на Youtube аудиовыход поступает на петлевое устройство (аудиовыход по умолчанию), и я могу захватить его (не уверен, как именно он работает, я тестировал как 44,1 кГц, так и 48 кГц )

arecord -f cd -D loop | aplay -f cd -D hw:0,0
arecord -f dat -D loop | aplay -f dat -D hw:0,0

Но когда я попытался захватить вывод аудиоплеера Verizon Java, он искажен, и длина, кажется, не совпадает. Я подозреваю, что это может быть моно на 8 кГц, и я пробовал разные вещи, меняя частоту и форматы, но ничего не помогло.

У вас есть идеи, что здесь не так и как записывать сообщения? Проблема в конфигурации ALSA? Или, возможно, проблема с ядром? (Я использую 3.4.88). Любые идеи будут очень приветствоваться.


Почему вы используете Alsa, а не пульс? Даже если вы хотите работать на уровне браузера, это лучший вариант для вас.
Эван Кэрролл,

@ Эван Кэрролл - так как бы я решил мою проблему, используя пульс?
Мартин Вегтер

Вегетер: найди мой ответ ниже. Я настоятельно рекомендую переоценить ваш подход.
Эван Кэрролл

Ответы:


5

Интересный вопрос: давным-давно я думал о простой записи цифрового аудио и видео, возможной через некоторые виртуальные аудио и видео драйверы, но так и не получил ее.

Я использовал ваш файл конфигурации, и у меня была точно такая же проблема, как вы описали. (Я, конечно, удалил драйверы совместимости OSS из ALSA, протестировал разные ядра - похоже, не имеет значения, и использовал Debian Wheezy)

$ alsaplayer -d front audio.mp3

$ mplayer -vo null -ao alsa:device=front video.mp4
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)

$ mplayer -ao alsa:device=front audio.mp3
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)

все вышеперечисленные команды хорошо воспроизводят колонки

$ arecord -f cd -D loop | aplay -f cd -D front
Recording WAVE 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

теперь запись с петли и воспроизведение на фронт

$ alsaplayer audio.mp3
$ alsaplayer -d loop audio.mp3

$ mplayer -vo null video.mp4
$ mplayer -vo null -ao alsa:device=loop video.mp4
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)

$ mplayer -ao alsa:device=loop audio.mp3
AO: [alsa] 48000Hz 2ch floatle (4 bytes per sample)

все посылают аудио в петлю и воспроизводят на колонки ОК

$ mplayer audio.mp3
AO: [alsa] 48000Hz 2ch floatle (4 bytes per sample)

но тут звук сломан - сильно искажен !!! Просто игра на устройстве по умолчанию. Воспроизведение, указанное с помощью цикла, сработало!

Попробовав различные изменения, я протестировал эту модификацию asound.conf

pcm.!default {
    type plug
    slave.pcm "loopout"
}

Это решило проблему! Когда устройство по умолчанию - loopout, оно работает. Попытка arecord -f cd -D loopin | aplay -f cd -D frontне имела никакого эффекта. Не уверен, как работает петля, но это было в состоянии захватить звук. Или ошибка в ALSA? Вы используете Debian? Работает ли это для вас?

Примечания к другим предложениям по решению проблемы:

Чтобы сбросить сетевой поток: я предполагаю, что если приложение не хочет, чтобы вы сохраняли данные, передача была бы зашифрована (https ???). Если игрок не проверяет сертификат сервера, как вы собираете данные? Какой твой любимый быстрый и простой способ, как стать человеком посередине и поймать поток?

Pulseaudio: Как мне запустить его на Debian Wheezy? Вики говорят, что это просто работает. Это не так.

/etc/init.d/pulseaudio start
[warn] PulseAudio configured for per-user sessions ... (warning).

Как мне устранить неполадки, что происходит? (Инструменты, диаг?)

Джек: Я не нашел простых инструкций, как установить Джек. Это кажется довольно сложным. Предполагается, что Pulseaudio работает? Документация сбивает с толку. У вас есть ссылка на хороший быстрый старт (как установить и проверить, чтобы убедиться, что он работает?)

Предполагаете ли вы, что большинство аудиоприложений (например, проигрыватель Fios Voicemail Java) смогут воспроизводить на Pulseaudio или Jack, а не отправлять звук в ALSA?


Работает отлично! после изменения файла конфигурации теперь я могу записывать с fios. Большое спасибо.
Мартин Вегтер

4

Вы помните "modprobe snd-aloop"? Я попробовал это, и это работает для меня с вашим asound.conf на YouTube, Pandora, Tunein, Vonage, и этот Java-плеер . Может быть что-то особенное для Fios, но у меня нет Fios для тестирования. Можете ли вы найти другой общедоступный сайт, который также вызывает проблему?

Также попробуйте выполнить запись в файл, а затем воспроизведите его:

arecord -f cd -D loop > recording.wav
aplay -f cd -D hw:0,0 recording.wav

4

Лучшая идея

Во-первых, читая ваш вопрос, я бы так не поступил. Я бы отслеживал сеть и пытался захватить поток. Вероятно, это довольно предсказуемое место, которое можно записать с помощью простого вызова tshark. Это еще один вопрос.

Улучшение по сравнению с ALSA

Хотя ваш метод является правильным подходом, я бы не стал использовать ALSA. ALSA - это уровень аппаратной абстракции. Я бы использовал звукового демона, который есть практически везде PulseAudio. Это имеет больше смысла. Создать нулевую раковину.

$ pactl load-module module-null-sink sink_name=MySink

Эта команда вернет вам module id. Это бесполезно для нас.

Теперь просто установите переменную среды PULSE_SINK. (имя_пути в приведенном выше примере - «MySink»)

export PULSE_SINK=MySink;

Или запустите программу, PULSE_SINK=MySinkи этот нулевой приемник перехватит поток.

Всякий раз, когда вы хотите передать его в файл, просто запустите:

parec -v -d MySink.monitor | opusenc --raw --downmix-mono --bitrate 64 - out.opus

Опус с низким битрейтом - лучший выбор для записи телефонных разговоров.

Примечания:

  • Вы также можете урезать тишину до и после. Добавьте soxв поток для этого. Смотрите man sox, ищите vad.
  • мы используем --downmix-monoна стереопотоке. Возможно, вы захотите поэкспериментировать с отправкой channels=1аргумента module-null-sinkна первом шаге. Телефоны все моно.

Когда я пытаюсь использовать это решение, записанный вывод содержит много заиканий и выпадений.
Х. Риттих

4

Потратив более часа на тщательную настройку петлевого устройства ALSA в Debian, наиболее эффективным и наименее трудоемким решением была пайка реального устройства за 5 минут.

Серьезно, я перекомпилировал ядро ​​для включения обратной петли ALSA, настроил /etc/asound.conf и ~ / .asound.rc безрезультатно.

Петлевое устройство


0

Я настоятельно рекомендую использовать JACK. Это рекурсивная аббревиатура для JACK Audio Connection Kit. Он предназначен именно для того, что вы делаете, перенаправляя аудио из одного программного обеспечения, в вашем случае, инструмента воспроизведения Java, в другое, записывающее программное обеспечение. Это очень хорошо для записи с низкой задержкой, которая, я думаю, может помочь вам получить качество, которое вы ищете.

С его помощью вы можете легко перенаправить звук с любого источника на вашем компьютере на множество различных инструментов записи. На самом деле, есть очень хороший графический интерфейс для этого, называемый QjackCtl .

На этой странице рассказывается, как направить аудио из браузера (Flash и, возможно, вашего инструмента Java) в Jack. Как это сделать, зависит от вашей системы.

Например:

Изменить ваш ~/.asoundrcили ~/asound.conf:

pcm.rawjack {
    type jack
    playback_ports {
        0 system:playback_1
        1 system:playback_2
    }
    capture_ports {
        0 system:capture_1
        1 system:capture_2
    }
}

pcm.jack {
    type plug
    slave { pcm "rawjack" }
    hint {
    description "JACK Audio Connection Kit"
    }
}

Тогда вы должны быть в состоянии использовать

arecord -D pcm.jack <file>

Для чего это стоит, это совершенно неправильная причина использовать JACK. Джек с низкой задержкой. pavucontrolбудет делать то же самое QjackCtl, что и вы, и вы всегда можете двигаться pacmd move-sink-input.
Эван Кэрролл

1
Искреннее любопытство с моей стороны здесь; почему низкая задержка это плохо?
TheHerk

Это не. Но есть два дистрибутива, которые используют Джек по умолчанию . Адвокация кого-либо изменить своего звукового демона по сравнению с тем, что стало де-факто выбором ни по какой причине, кроме «более низкой задержки», является довольно плохим направлением ответа.
Эван Кэрролл

Вы делаете это звучит , как это трудно установить программу , которая работает просто отлично рядом с PulseAudio , pasuspender -- jackd. Тем не менее, если у постера возникают проблемы с качеством, может быть полезно попробовать что-то очень простое. Кроме того, QjackCtl позволяет очень легко настраивать параметры, которые дают видимую обратную связь по задержке и xruns, которые обычно являются причиной искаженного звука .
TheHerk

И когда плакат задается вопросом, почему другие вещи, которые используют драйвер Pulse, перестают работать, потому что одна программа воспроизводит нулевой приемник (в JACK, а не в Pulse), тогда что?
Эван Кэрролл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.