web-dev-qa-db-ja.com

ALSAループデバイスを使用してWebベースのオーディオプレーヤーからオーディオを録音する

Verizon Fios電話からのボイスメールメッセージを可能な限り最高の品質で保存しようとしています。ボイスメールメッセージは利用可能 オンライン ですが、再生のみ(Javaベースのプレーヤー)の場合は保存されません。正式には、元のデジタルボイスメッセージをFiosデジタルボイスサービスからファイルとして保存する方法はサポートされていません(有料サービス、何もない、理由はありません)。

私の唯一のアイデアは、サウンドカードに向かう途中でプレーヤーからデジタルデータを録音することでした。ループデバイスで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 kHzと48 Khzの両方をテストしました) )

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オーディオプレーヤーの出力は文字化けしており、長さが一致していないようです。8kHzでモノである可能性があり、さまざまなことを試して、頻度とフォーマット、しかし何も助けにはなりませんでした。

ここで何が問題になっているのか、メッセージを録音する方法はありますか? ALSA構成に問題がありますか?それともカーネルの問題ですか? (私は3.4.88を使用しています)。どんなアイデアでも大歓迎です。

9
Martin Vegter

興味深い質問ですが、昔、私はデジタルオーディオとビデオの単純な録音について考えていました。仮想オーディオとビデオドライバーを介して可能ですが、そこに到達することはできませんでした。

私はあなたの構成ファイルを使用しましたが、あなたが説明したのとまったく同じ問題がありました。 (私は確かに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"
}

問題は解決しました!デフォルトのデバイスがループアウトの場合、機能します。 arecord -f cd -D loopin | aplay -f cd -D frontは効果がありませんでした。ループがどのように機能するかはわかりませんが、これはオーディオをキャプチャすることができました。またはALSAのバグ? Debianを使用していますか?それはあなたのために働きますか?

問題を解決するための他の提案へのメモ:

ネットワークストリームをダンプするには:アプリケーションでデータの保存を望まない場合、転送は暗号化されます(https ???)。プレーヤーがサーバー証明書を確認しない場合、どのようにデータをキャプチャしますか?真ん中の男になってストリームをキャプチャする方法として、お気に入りのすばやく簡単な方法は何ですか?

Pulseaudio:Debian Wheezyで実行するにはどうすればよいですか? The Wiki は、機能することを示しています。それはしませんでした。

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

何が起こっているのかトラブルシューティングするにはどうすればよいですか? (ツール、診断?)

ジャック:ジャックをインストールする簡単な手順は見つかりませんでした。かなり複雑に見えます。 Pulseaudioが実行されていると想定していますか?ドキュメントは紛らわしいです。 Niceクイックスタートへのリンクはありますか(インストールしてテストし、機能することを確認する方法)。

ほとんどのオーディオアプリケーション(FiosボイスメールJavaプレーヤーなど)はPulseaudioまたはJackで再生でき、ALSAにオーディオを送信できないと思いますか?

5
Robert Hayek

DebianでALSAループバックデバイスを無駄にセットアップしようと1時間以上費やした後、最も効果的で最も時間のかからないソリューションは、実際のdeviceを5分ではんだ付けすることでした。

真剣に、私はALSAループバックを有効にするためにカーネルを再コンパイルし、/ etc/asound.confと〜/ .asound.rcを微調整しましたが、結果は出ませんでした。

Loopback device

4
davide

「modprobe snd-aloop」を覚えていますか?私は試してみましたが、youtube、Pandora、tunein、vonage、および this Java player のasound.confで動作します。 Fiosですが、テストするFiosがありません。問題の原因となっている別の公開サイトを見つけられますか?

また、ファイルに録音してから再生します。

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

最高のアイデア

最初に、あなたの質問を読んで、私はこのようにはしません。ネットワークをスヌーピングしてストリームをキャプチャしようとしています。おそらく、予測可能な場所にあり、tsharkを呼び出すだけでスクリプトを作成できます。それは別の質問です。

ALSAの改善

あなたの方法は有効なアプローチですが、私はALSAを使用しません。ALSAはハードウェアアブストラクションレイヤーです。 PulseAudioのほぼすべてにあるサウンドデーモンを使用します。それはもっと理にかなっています。ヌルシンクを作成します。

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

そのコマンドはあなたのmodule idを返します。それは私たちには役に立たない。

次に、環境変数Pulse_SINKを設定します。 (上記の例では、sink_nameは「MySink」です)

export Pulse_SINK=MySink;

または、Pulse_SINK=MySinkでプログラムを開始すると、そのnullシンクがストリームをキャプチャします。

それをファイルにストリーミングしたいときはいつでも、単に実行します:

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

低ビットレートのオーパスは、電話での会話を録音するのに最適です。

脚注:

  • また、前後の無音部分をtrimすることもできます。そのためのストリームにsoxを追加します。 man soxを参照し、vadを検索してください。
  • ステレオストリームで--downmix-monoを使用しています。最初のステップでchannels=1引数をmodule-null-sinkに送信してみてください。電話はすべてモノラルです。
4
Evan Carroll

JACKの使用を強くお勧めします。それは、JACK Audio Connection Kitの再帰的な頭字語です。あるソフトウェアからオーディオをルーティングしている場合は、Java再生ツールから別の記録ソフトウェアにオーディオをルーティングします。低遅延の記録に非常に適しています。 、あなたが探している品質を手に入れるのに役立つと思います。

これを使用すると、コンピューター上の任意のソースからさまざまな録音ツールにオーディオを簡単にルーティングできます。実際、 QjackCtl と呼ばれる非常に素晴らしいGUIがあります。

このページ は、ブラウザ(FlashおよびおそらくJavaツール)からジャックにオーディオをルーティングする方法をカバーしています。これがどのように行われるかは、システムによって異なります。

例えば:

~/.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>
0
TheHerk