Aufzeichnen von Audio von einem webbasierten Audio-Player mit einem ALSA-Loop-Gerät


9

Ich versuche, Voicemail-Nachrichten vom Verizon Fios-Telefon in bester Qualität zu speichern. Die Voicemail-Nachrichten sind online verfügbar , aber nur zum Abspielen (Java-basierter Player), kein Speichern. Offiziell gibt es keine unterstützte Möglichkeit, digitale Original-Sprachnachrichten als Dateien vom Fios Digital Voice-Dienst zu speichern (kein kostenpflichtiger Dienst, nichts, kein Grund dafür).

Meine einzige Idee war, auf dem Weg zur Soundkarte digitale Daten vom Player aufzuzeichnen. Ich habe versucht, Linux ALSA Konfiguration mit Loop-Gerät.

# 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"
      }
    }
}

Dies scheint zu funktionieren und zeichnet Audio auf. Wenn Sie beispielsweise etwas auf Youtube abspielen, wird der Audioausgang an das Loop-Gerät gesendet (Standard-Audioausgang) und ich kann ihn aufnehmen (nicht sicher, wie er genau funktioniert, ich habe sowohl 44,1 kHz als auch 48 kHz getestet )

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

Aber als ich versucht habe, die Ausgabe des Verizon Java Audio Players zu erfassen, ist diese verstümmelt und die Länge scheint nicht zu stimmen. Ich vermute, es könnte Mono bei 8 kHz sein und ich habe verschiedene Dinge ausprobiert, die Frequenz und die Formate geändert, aber nichts hat geholfen.

Haben Sie eine Idee, was hier falsch ist und wie die Nachrichten aufgezeichnet werden sollen? Liegt das Problem in der ALSA-Konfiguration? Oder möglicherweise Kernelproblem? (Ich benutze 3.4.88). Irgendwelche Ideen wären sehr willkommen.


Warum benutzt du alsa und nicht puls? Selbst wenn Sie unter der Browserebene arbeiten möchten, ist dies eine bessere Option für Sie.
Evan Carroll

@Evan Carroll - wie würde ich mein Problem mit Puls lösen?
Martin Vegter

Vegeter: finde meine Antwort unten. Ich würde jedoch dringend empfehlen, Ihren Ansatz neu zu bewerten.
Evan Carroll

Antworten:


5

Interessante Frage, vor langer Zeit habe ich über eine einfache Aufnahme von digitalem Audio und Video nachgedacht, die über einige virtuelle Audio- und Videotreiber möglich ist, aber nie dort angekommen ist.

Ich habe Ihre Konfigurationsdatei verwendet und hatte genau das gleiche Problem wie Sie beschrieben. (Ich habe OSS-Kompatibilitätstreiber aus ALSA entfernt, verschiedene Kernel getestet - schien keine Rolle zu spielen und Debian Wheezy verwendet).

$ 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)

Die obigen Befehle werden für die Lautsprecher alle in Ordnung wiedergegeben

$ 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

Jetzt von Loop aufnehmen und nach vorne spielen

$ 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)

Alle senden Audio an Loop und spielen über Lautsprecher OK

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

aber hier ist der Ton kaputt - sehr verzerrt !!! Spielen Sie einfach auf dem Standardgerät. Wiedergabe über Schleife angegeben funktioniert!

Nachdem ich verschiedene Änderungen ausprobiert hatte, testete ich diese Modifikation von asound.conf

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

Es hat das Problem gelöst! Wenn das Standardgerät Loopout ist, funktioniert es. Der Versuch arecord -f cd -D loopin | aplay -f cd -D fronthatte keine Wirkung. Ich bin mir nicht sicher, wie die Schleife funktioniert, aber dies konnte das Audio aufnehmen. Oder ein Fehler in ALSA? Verwenden Sie Debian? Funktioniert es für dich?

Hinweise zu anderen Vorschlägen zur Lösung des Problems:

So sichern Sie den Netzwerkstrom: Ich gehe davon aus, dass die Übertragung verschlüsselt wird (https ???), wenn die Anwendung nicht möchte, dass Sie Daten speichern. Falls der Player das Serverzertifikat nicht überprüft, wie erfassen Sie die Daten? Was ist Ihre bevorzugte schnelle und einfache Methode, um ein Mann in der Mitte zu werden und den Stream zu erfassen?

Pulseaudio: Wie bringe ich es auf Debian Wheezy zum Laufen? Das Wiki sagt, dass es einfach funktioniert. Es hat nicht.

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

Wie kann ich Fehler beheben, was gerade passiert? (Werkzeuge, diag?)

Jack: Ich habe keine einfachen Anweisungen zur Installation von Jack gefunden. Es scheint ziemlich komplex. Geht es davon aus, dass Pulseaudio läuft? Die Dokumentation ist verwirrend. Haben Sie einen Link für einen schönen Schnellstart (wie installieren und testen Sie, um sicherzustellen, dass es funktioniert?)

Gehen Sie davon aus, dass die meisten Audioanwendungen (wie der Fios Voicemail Java Player) Pulseaudio oder Jack wiedergeben und kein Audio an ALSA senden können?


Funktioniert super! Nachdem ich die Konfigurationsdatei geändert habe, kann ich jetzt von Fios aufnehmen. Vielen Dank.
Martin Vegter

4

Hast du daran gedacht, "modprobe snd-aloop" zu machen? Ich habe es versucht und es funktioniert für mich mit Ihrer asound.conf auf Youtube, Pandora, Tunein, Vonage und diesem Java-Player . Könnte etwas Spezifisches für Fios sein, aber ich habe keine Fios zum Testen. Können Sie eine andere öffentlich zugängliche Site finden, die das Problem ebenfalls verursacht?

Versuchen Sie auch, in eine Datei aufzunehmen, und geben Sie sie dann wieder:

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

4

Beste Idee

Erstens, wenn ich Ihre Frage lese, würde ich das nicht so machen. Ich würde das Netzwerk beschnüffeln und versuchen, den Stream zu erfassen. Es ist wahrscheinlich an einem ziemlich vorhersehbaren Ort, der mit einem einfachen Aufruf an ausgeschrieben werden kann tshark. Das ist aber eine andere Frage.

Verbesserung gegenüber ALSA

Während Ihre Methode ein gültiger Ansatz ist, würde ich ALSA nicht verwenden. ALSA ist eine Hardware-Abstraktionsschicht. Ich würde den Sound-Daemon verwenden, der fast überall in PulseAudio zu finden ist. Das macht mehr Sinn. Erstellen Sie eine Null-Senke.

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

Dieser Befehl gibt Ihre zurück module id. Das nützt uns nichts.

Stellen Sie nun einfach die Umgebungsvariable ein PULSE_SINK. (sink_name im obigen Beispiel ist "MySink")

export PULSE_SINK=MySink;

Oder starten Sie ein Programm mit PULSE_SINK=MySinkund diese Nullsenke erfasst den Stream.

Wenn Sie es in eine Datei streamen möchten, führen Sie einfach Folgendes aus:

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

Opus mit niedriger Bitrate ist die beste Wahl für die Aufzeichnung von Telefongesprächen.

Fußnoten:

  • Sie können auch wollen , schneiden die die Stille vor und nach. Dazu soxdem Stream hinzufügen. Siehe man sox, suchen vad.
  • Wir verwenden --downmix-monoeinen Stereostream. Möglicherweise möchten Sie im ersten Schritt mit dem Senden des channels=1Arguments an experimentieren module-null-sink. Telefone sind alle Mono.

Wenn ich versuche, diese Lösung zu verwenden, enthält die aufgezeichnete Ausgabe viele Ruckler und Aussetzer.
H. Rittich

4

Nachdem Sie mehr als eine Stunde damit verbracht hatten, das ALSA-Loopback-Gerät unter Debian vergeblich einzurichten, bestand die effektivste und am wenigsten zeitaufwändige Lösung darin, ein tatsächliches Gerät in 5 Minuten zu löten .

Im Ernst, ich habe den Kernel neu kompiliert, um den ALSA-Loopback zu aktivieren. Ich habe die /etc/asound.conf und ~ / .asound.rc ohne Ergebnisse optimiert.

Loopback-Gerät


0

Ich empfehle die Verwendung von JACK. Dies ist eine rekursive Abkürzung für JACK Audio Connection Kit. Es ist genau auf Ihre Arbeit zugeschnitten und leitet Audio von einer Software, in Ihrem Fall dem Java-Wiedergabetool, zu einer anderen, einer Aufnahmesoftware. Es ist sehr gut für Aufnahmen mit geringer Latenz geeignet, was Ihnen meiner Meinung nach dabei helfen kann, die gewünschte Qualität zu erzielen.

Mit ihm können Sie Audio einfach von jeder Quelle auf Ihrem Computer an viele verschiedene Aufnahmewerkzeuge weiterleiten. Tatsächlich gibt es dafür eine sehr schöne GUI namens QjackCtl .

Auf dieser Seite erfahren Sie, wie Sie Audio vom Browser (Flash und möglicherweise Ihrem Java-Tool) an Jack weiterleiten. Wie dies geschieht, hängt von Ihrem System ab.

Zum Beispiel:

Ändern Sie Ihre ~/.asoundrcoder ~/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"
    }
}

Dann sollten Sie in der Lage sein zu verwenden

arecord -D pcm.jack <file>

Für das, was es wert ist, ist dies genau der falsche Grund, JACK zu verwenden. JACK hat eine geringe Latenz. pavucontrolwird das Gleiche tun wie Sie QjackCtl, und Sie können sich immer bewegen pacmd move-sink-input.
Evan Carroll

1
Echte Neugier meinerseits hier; Warum ist niedrige Latenz eine schlechte Sache?
TheHerk

Es ist nicht. Es gibt jedoch zwei Distributionen, die standardmäßig Jack verwenden . Jemanden zu befürworten, seinen Sound-Daemon aus einem anderen Grund als "geringerer Latenz" von der de facto Wahl zu ändern, ist eine ziemlich schlechte Antwortrichtung.
Evan Carroll

Sie machen es klingen wie es schwierig ist , ein Programm zu installieren , die ganz gut neben Pulseaudio arbeitet , pasuspender -- jackd. Wenn das Poster jedoch Qualitätsprobleme aufweist, kann es hilfreich sein, etwas so Einfaches auszuprobieren. Außerdem macht es QjackCtl sehr einfach, Einstellungen anzupassen, die sichtbares Feedback zu Latenz und Xruns geben, die häufig eine Ursache für verstümmeltes Audio sind .
TheHerk

Und wenn sich das Poster fragt, warum andere Dinge, die den Pulse-Treiber verwenden, nicht mehr funktionieren, weil ein Programm mit einer Null-Senke abgespielt wird (in JACK anstelle von Pulse), was dann?
Evan Carroll
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.