duplex_record: mixando áudio do microfone e saída de áudio de um programa via P

Publicado por Luís Fernando C. Cavalheiro (última atualização em 07/04/2016)

[ Hits: 2.691 ]

Homepage: https://github.com/lcavalheiro/

Download duplex_record




Clicadores e servos da Canonical, aqui começa mais um Script do Dino® trazendo para todos vocês mais uma loucura qualquer do tempo em que os dinossauros eram vivos e o Sílvio Santos vendia o Carnê do Baú para eles.

No Script de hoje, vamos aprender como mixar o áudio do microfone com a saída de áudio de um programa via PulseAudio.

Mixagem é o procedimento pelo qual dois canais de áudio distintos se transformam em um único. Assim, com este Script você pode mixar o áudio do microfone com a saída de um outro programa (por exemplo, o VLC) e enviar a mixagem para um outro programa (seguindo o exemplo, enviar a mixagem pelo Hangouts para que um amigo possa escutar uma música que você esteja a reproduzir localmente).

COMO USAR

Usage
    
    duplex_record [-c | -C | -L | -h | -v ] [ -m arg ] [ -l arg ]

    Options
    -c          Required: create two virtual sinks
    -C          Required: delete virtual sink. Ignores -m and -l options
    -m arg      Optional: name virtual mic sink (default: Mic)
                "arg" must be a single-word, no quotes, no special characters, string
    -l arg      Optional: name virtual line sink, (default: Line)
                "arg" must be a single-word, no quotes, no special characters, string
    -L          Show GPLv3 licence abstract, ignores -m and -l options
    -h          Show this help, ignores -m and -l options
    -v          Show version and changelog info, ignores -m and -l options

    In case -c, -C, -L, -h or -v being issued at same time, only the last one will be considered</div>
Escrevi em inglês porque isso pode ser útil não apenas para nós, Brasileiros.

COMO FUNCIONA

O Script do Dino® cria dois sumidouros virtuais (nomes padrão: Virtual_Mic e Virtual_Line), liga o monitor do segundo sumidouro virtual ao sumidouro padrão e ao primeiro sumidouro virtual via loopback, e então liga o primeiro sumidouro ao sumidouro padrão por loopback. Na prática, isso traça o seguinte mapa de áudio:

Microfone (l)
Saída de áudio de um programa ------> segundo sumidouro virtual (m)> primeiro sumidouro virtual (m)> sumidouro padrão

Legenda:

(l)> redirecionamento por loopback
(m)> redirecionamento pelo monitor

O truque aqui reside no uso sagaz e maroto dos monitores e dos loopbacks de sumidouros.

O monitor é um canal do sumidouro que permite que ele seja escutado por outro sumidouro (monitorado é o termo certo). Já o loopback é um canal do sumidouro que permite a gravação da saída de áudio daquele sumidouro.

Com este Script do Dino®, a saída do microfone padrão é enviado via loopback pro primeiro sumidouro virtual. Quando o programa é instruído a usar o segundo sumidouro virtual como sua saída de áudio (via pavucontrol), envia-se o loopback do monitor tanto para a saída padrão de áudio (para permitir que você escute o que está sendo reproduzido) quanto para o primeiro sumidouro virtual. Assim, o primeiro sumidouro virtual recebe ao mesmo tempo o microfone e o segundo sumidouro virtual. Para direcionar o resultado dessa mixagem para algum programa que aceite entrada de áudio (desde o Audacity até o Google Hangouts), basta apenas configurar, via pavucontrol, o programa que receberá o áudio para usar o monitor do primeiro sumidouro virtual (o PulseAudio não permite gravação direta de sumidouros virtuais).

  



Esconder código-fonte

#!/bin/bash
#
# duplex_record Copryright (C) 2016 Luís Fernando Carvalho Cavalheiro
# Licence: GPLv3 (see below)
# Short description: this script creates two virtual sinks in PulseAudio and
# configures them to allow correct recording of an audio output (for example,
# a game) and an audio input (for example, a microphone) at same time.
#
# ------------------------------- Legal notice -------------------------------
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Tradução não-oficial:
#
# Este programa é um software livre; você pode redistribuí-lo e/ou 
# modificá-lo dentro dos termos da Licença Pública Geral GNU como 
# publicada pela Fundação do Software Livre (FSF); na versão 3 da 
# Licença, ou (na sua opinião) qualquer versão.
#
# Este programa é distribuído na esperança de que possa ser útil, 
# mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO
# a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
# Licença Pública Geral GNU para maiores detalhes.
#
# Você deve ter recebido uma cópia da Licença Pública Geral GNU junto
# com este programa. Se não, veja <http://www.gnu.org/licenses/>.
#
# ------------------------------- Legal notice -------------------------------
#

# Check for pavucontrol
which pavucontrol > /dev/null 2>&1
status_which=$?
if [ $status_which -ne 0 ] ; then
    echo "duplex_record needs pavucontrol installed! Please install it before running duplex_record!"
    exit 1
fi

# Define funcionts

version_info() {
    cat << EOF

    Copyright(C) 2016 Luís Fernando Carvalho Cavalheiro
    Licenced under GPLv3. Please run "$ duplex_record -l" to read licence abstract

    duplex_record: simple script to allow simultaneous recording of two different
                   audio outputs or inputs. Since PulseAudio sinks config is easier
                   done using pavucontrol, this script checks if it is installed
                   and stops running if pavucontrol can't be found.

    Version:    0.1 (20160324)
                Script finalized. Basic tests done, published on
                http://www.vivaolinux.com.br under "scripts" session

EOF
}

open_pavucontrol() {
    read -e -n 1 -p "Do you want to run pavucontrol to configure audio inputs and outputs (Y/N)? " open_pavucontrol
    case $open_pavucontrol in
        [Yy] )
            pavucontrol &
            ;;
        [Nn] )
            echo "Please remember to manually run pavucontrol to configure audio inputs and outputs!"
            ;;
        * )
            echo "Invalid option! Please answer Y or N."
            open_pavucontrol
            ;;
    esac
}


create_virtual_sinks() {
    pactl load-module module-null-sink sink_name=first_out sink_properties=device.description="Virtual_$DUPLEX_MIC" > /dev/null && echo "Virtual sink \"Virtual_mic\" created! Please use pavucontrol to point your desired recording devices to it"
    pactl load-module module-null-sink sink_name=second_out sink_properties=device.description="Virtual_$DUPLEX_LINE" > /dev/null && echo "Virtual sink \"Virtual_line\" created! Please use pavucontrol to point all outputs you want to record to it."
    # Loopback second virtual sink to default output
    pactl load-module module-loopback source=second_out.monitor > /dev/null
    # Loopback second virtual sink to first virtual sink
    pactl load-module module-loopback source=second_out.monitor sink=first_out > /dev/null
    # Loopback first virtual sink to default output
    pactl load-module module-loopback sink=first_out > /dev/null
    open_pavucontrol
}

remove_virtual_sinks() {
    pactl unload-module module-loopback > /dev/null
    pactl unload-module module-null-sink > /dev/null
    echo "All virtual sinks removed! Please run pavucontrol to check your audio inputs and outputs."
    open_pavucontrol
}

licence_text() {
    cat << EOF

    Copyright(C) 2016 Luís Fernando Carvalho Cavalheiro
    Licenced under GPLv3. Please run "$ duplex_record -l" to read licence abstract

    duplex_record: simple script to allow simultaneous recording of two different
                   audio outputs or inputs. Since PulseAudio sinks config is easier
                   done using pavucontrol, this script checks if it is installed
                   and stops running if pavucontrol can't be found.

    Generic Public Licence, version 3, abstract:

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

EOF
}

help_text() {
    cat << EOF

    Copyright(C) 2016 Luís Fernando Carvalho Cavalheiro
    Licenced under GPLv3. Please run "$ duplex_record -l" to read licence abstract

    duplex_record: simple script to allow simultaneous recording of two different
                   audio outputs or inputs. Since PulseAudio sinks config is easier
                   done using pavucontrol, this script checks if it is installed
                   and stops running if pavucontrol can't be found.

    Usage
    
    duplex_record [-c | -C | -L | -h | -v ] [ -m arg ] [ -l arg ]

    Options
    -c          Required: create two virtual sinks
    -C          Required: delete virtual sink. Ignores -m and -l options
    -m arg      Optional: name virtual mic sink (default: Mic)
                "arg" must be a single-word, no quotes, no special characters, string
    -l arg      Optional: name virtual line sink, (default: Line)
                "arg" must be a single-word, no quotes, no special characters, string
    -L          Show GPLv3 licence abstract, ignores -m and -l options
    -h          Show this help, ignores -m and -l options
    -v          Show version and changelog info, ignores -m and -l options

    In case -c, -C, -L, -h or -v being issued at same time, only the last one will be considered

EOF
}

# Eval command line options
while getopts ":m:l:cCLhv" opt ; do
    case "$opt" in
        c)
            ACTION="c"
            ;;
        C)
            ACTION="C"
            ;;
        L)
            ACTION="l"
            ;;
        h)
            ACTION="h"
            ;;
        v)
            ACTION="v"
            ;;
        m)
            DUPLEX_MIC=$OPTARG
            ;;
        l)
            DUPLEX_LINE=$OPTARG
            ;;
        :)
            echo "Option -$OPTARG requires an argument." >&2
            exit 1
            ;;
        \?)
            echo "Invalid option: -$OPTARG" >&2
            exit 1
            ;;
    esac
done

# Shows help text if no option is provided
if [ $OPTIND -eq 1 ] ; then
    cat << EOF

    duplex_record requires at least one valid option!

EOF
    ACTION="h"
fi

# Do as defined for last option among -c, -C, -l and -h
case $ACTION in
    c)
        DUPLEX_MIC=${DUPLEX_MIC:-Mic}
        DUPLEX_LINE=${DUPLEX_LINE:-Line}
        create_virtual_sinks
        ;;
    C)
        remove_virtual_sinks
        ;;
    l)
        licence_text
        ;;
    h)
        help_text
        ;;
    v)
        version_info
        ;;
esac

Scripts recomendados

Linkswitch (The POG)

Criação de usuario / gerando senha automatica

Testando se a conexão com a Internet está ativa

Autenticar usuários squid+shellscript+mysql

Backup, restore e leitura de log com Dialog


  

Comentários
[1] Comentário enviado por MattF em 17/04/2016 - 20:32h

perfeito!

[2] Comentário enviado por MattF em 14/06/2016 - 14:56h

Realmente muito útil! kkk


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts