O Alsa Pulse Audio não pode abrir o pulso de pulso do dispositivo de áudio (Nenhum arquivo ou diretório): Erro de entrada / saída

0

Estou tentando transmitir meu Gnome Desktop que instalei no meu servidor OpenVZ VPS e não estou tentando executar isso do SSH, mas o terminal dentro da área de trabalho do GNOME,

Eu sei que provavelmente não tem uma placa de som, mas não é como se eu estivesse tentando tocar o som, eu só quero direcioná-lo para o fluxo.

Dentro do meu controle de volume do PulseAudio

Aquiestácomoparecequandotentotransmiti-lo.

Mais coisas que eu tentei mais erros aconteceram aqui

Aquiéquandoeuexecutoopacmdlist-source-outputs

[removed@removed~]$pacmdlist-source-outputsWelcometoPulseAudio!Use"help" for usage information.
>>> 2 source outputs(s) available.
    index: 0
    driver: <protocol-native.c>
    flags: DONT_MOVE 
    state: RUNNING
    source: 0 <auto_null.monitor>
    current latency: 3.08 ms
    requested latency: 20.00 ms
    sample spec: float32le 1ch 25Hz
    channel map: mono
                 Mono
    resample method: peaks
    owner module: 6
    client: 4 <PulseAudio Volume Control>
    properties:
        media.name = "Peak detect"
        application.name = "PulseAudio Volume Control"
        native-protocol.peer = "UNIX socket client"
        native-protocol.version = "16"
        application.id = "org.PulseAudio.pavucontrol"
        application.icon_name = "audio-card"
        application.version = "0.9.10"
        application.process.id = "997"
        application.process.user = "removed_for_stackexchange(wasn't root)"
        application.process.host = "removed_for_stackexchange"
        application.process.binary = "pavucontrol"
        window.x11.display = ":1.0"
        application.language = "en_US.UTF-8"
        application.process.machine_id = "27be3273f5d5332051ccdc3100000002"
        application.process.session_id = "27be3273f5d5332051ccdc3100000002-1394085585.776225-694791372"
        module-stream-restore.id = "source-output-by-application-id:org.PulseAudio.pavucontrol"
    index: 1
    driver: <protocol-native.c>
    flags: DONT_MOVE 
    state: RUNNING
    source: 0 <auto_null.monitor>
    current latency: 3.11 ms
    requested latency: 20.00 ms
    sample spec: float32le 1ch 25Hz
    channel map: mono
                 Mono
    resample method: peaks
    owner module: 6
    client: 4 <PulseAudio Volume Control>
    direct on input: 2
    properties:
        media.name = "Peak detect"
        application.name = "PulseAudio Volume Control"
        native-protocol.peer = "UNIX socket client"
        native-protocol.version = "16"
        application.id = "org.PulseAudio.pavucontrol"
        application.icon_name = "audio-card"
        application.version = "0.9.10"
        application.process.id = "997"
        application.process.user = "removed_for_stackexchange(wasn't root)"
        application.process.host = "removed_for_stackexchange"
        application.process.binary = "pavucontrol"
        window.x11.display = ":1.0"
        application.language = "en_US.UTF-8"
        application.process.machine_id = "27be3273f5d5332051ccdc3100000002"
        application.process.session_id = "27be3273f5d5332051ccdc3100000002-1394085585.776225-694791372"
        module-stream-restore.id = "source-output-by-application-id:org.PulseAudio.pavucontrol"

Mais informações sobre o coletor que estou usando

[removed@removed ~]$ pacmd list-sinks
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 sink(s) available.
  * index: 0
    name: <auto_null>
    driver: <module-null-sink.c>
    flags: DECIBEL_VOLUME LATENCY FLAT_VOLUME DYNAMIC_LATENCY
    state: RUNNING
    suspend cause: 
    priority: 1000
    volume: 0: 100% 1: 100%
            0: 0.00 dB 1: 0.00 dB
            balance 0.00
    base volume: 100%
                 0.00 dB
    volume steps: 65537
    muted: no
    current latency: 3.49 ms
    max request: 3 KiB
    max rewind: 3 KiB
    monitor source: 0
    sample spec: s16le 2ch 44100Hz
    channel map: front-left,front-right
                 Stereo
    used by: 1
    linked by: 3
    configured latency: 20.00 ms; range is 0.50 .. 10000.00 ms
    module: 9
    properties:
        device.description = "Dummy Output"
        device.class = "abstract"
        device.icon_name = "audio-card"
    
por SSpoke 06.03.2014 / 03:08

3 respostas

1

(esperançosamente) CÓDIGO MELHORADO NO FUNDO

Lendo o script fornecido em sua própria resposta, cheguei às seguintes conclusões sobre sua solução. Por favor, corrija-me sobre qualquer / todos os erros que eu possa ter cometido.

Você acrescenta um conjunto de dados xwininfo $GAME_WINDOW -específico a um despejo de arquivo tmp depois de especificar a geometria de $GAME_WINDOW via wmctl . Antes de iniciar o despejo, você trunca efetivamente seu arquivo tmp para 0 bytes com rm -f , o que presumivelmente ocorre apenas uma vez por sessão porque o fluxo é específico da sessão ou para evitar que o arquivo tmp fique muito grande. Eu estou presumindo ambos. Eu baseio as conclusões acima nestas três linhas:

> rm -f twitch_tmp 2> /dev/null
> wmctrl -r "$GAME_WINDOW" -e 0, 411,51,160,144
> xwininfo -name "$GAME_WINDOW" >> twitch_tmp

Embora eu não esteja intimamente familiarizado com wmctl ou xwininfo , eu sei que eles são utilitários comuns para automatizar vários comportamentos de janelas X em X. Eu estou supondo que você está transmitindo esse conjunto de dados apenas para acompanhar quaisquer mudanças que possam ocorrer, então ffmpeg pode fazer a coisa certa com seu transcodificador ao invés de realmente bombear os dados da fonte gráfica / sonora através dos dois seguintes > ambiente variáveis como eu duvido muito seriamente que o último comportamento funcionaria por mais do que alguns segundos se em todos:

> TOPXY=$(cat twitch_tmp | grep -oEe 'Corners:\s+\+[0-9]+\+[0-9]+' | grep -oEe '[0-9]+\+[0-9]+' | sed -e 's/\+/,/' )
> INRES=$(cat twitch_tmp | grep -oEe 'geometry [0-9]+x[0-9]+' | grep -oEe '[0-9]+x[0-9]+')

Aqui você:

  • Abra dois sub-grupos $(command substitution) , um para cada atribuição de valor $TOPXY e $INRES .

Por $TOPXY you:

  • Con cat chame seu arquivo tmp com stdin e anonimamente |pipe os resultados para grep ' stdin que, então ...
  • oEe Omite qualquer linha e qualquer porção de qualquer linha não omitida que não contenha a string:
    • " Cantos: " seguido por ...
    • em + pelo menos um caractere de espaço em branco \s , então ...
    • um sinal de mais \+ literal e, em seguida ...
    • em + menos um [0-9] digit ...
    • outro \+ literal mais ...
    • e, finalmente, pelo menos + mais um [0-9] digit ...
  • Os resultados são anonimamente |piped para outra instância de grep , que subsequentemente -oEe omite tudo antes de sua primeira captura [0-9] dígito e anonimamente |pipe de seus resultados para ...
  • sed which tr forma o literal \+ plus recebe para , vírgulas e despeja para seu stdout que é ...
  • finalmente capturado e armazenado em $TOPXY por meio da atribuição da variável subshell $(command substituted) .

O processo para $INRES parece o mesmo, embora um pouco menos complexo.

O mais notável para mim é que todo o arquivo tmp está con cat enatado pelo menos duas vezes para cada chamada, o que é para não mencionar todos os |pipes . Provavelmente, há muitas maneiras de fazer isso, mas não posso imaginar que isso esteja entre as melhores delas.

Depois disso, você invoca ffmpeg referenciando as duas variáveis acima e várias outras opções, incluindo outras variáveis de ambiente que você especificou também:

ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i $DISPLAY+$TOPXY \
    -f pulse -i default \
    -vcodec libx264 -preset $PRESET -crf 30 -x264opts keyint=50:min-keyint=20 -s $INRES \
    -acodec libmp3lame -ab $AUDIO_BITRATE -ar $AUDIO_RATE_HZ \
    -threads 0 -pix_fmt yuv420p \
    -f flv "rtmp://$SERVER.twitch.tv/app/$STREAM_KEY"

PROBABLY MORE DIRECT

O que segue não envolve tmp arquivos, um único |pipe , chama apenas uma única invocação de sed e um único subshell command substitution para analisar suas configurações de geometria e está contido em uma única função. Todas as variáveis de ambiente são definidas em here-documents transmitidas para seu stdin e, portanto, estão efetivamente no escopo local. Eles também são definidos via parameter-substitution e, portanto, são configuráveis. Por exemplo, para alterar o valor de $FPS para uma única chamada que você precisa fazer somente:

% FPS=28 desk_stream

Por que vale a pena, no entanto, eu ainda acho que vlc seria uma opção muito melhor.

desk_stream() { sed -rn '\
    /.*((Corners:|geometry)\s*\+*([x|+|0-9]*\+)).*/{\
        s///;\ 
            /X/s/.*/\
                    INRES="&";/p;\
                s/(.*)\+(.*)\+$/\
                    DISPLAY='"${DISPLAY}"'"+,,";/p;\
    };$a\. 0<&3 /dev/stdin\n' | . /dev/stdin
} <<FFOPTS 3<<-\FFCMD
${FPS="15"}                                    # target FPS
${PRESET="ultrafast"}                    # one of the many FFMPEG preset on (k)ubuntu found in /usr/share/ffmpeg
${THREADS="0"}                 #0 autostarts threads based on cpu cores.
${AUDIO_BITRATE="1k"}               #Audio bitrate to 96k
${AUDIO_RATE_HZ ="44100"}       #Audio rate 44100 hz
${GAME_WINDOW="MYGAMETEST"}
${STREAM_KEY=live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx}
${SERVER="live-jfk"}    # NY server
$(wmctrl -r "$GAME_WINDOW" -e 0, 411,51,160,144 &&\
      xwininfo -name "$GAME_WINDOW")
FFOPTS
ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i $DISPLAY \
        -f pulse -i default \
        -vcodec libx264 -preset $PRESET -crf 30 -x264opts keyint=50:min-keyint=20 -s $INRES \
        -acodec libmp3lame -ab $AUDIO_BITRATE -ar $AUDIO_RATE_HZ \
        -threads 0 -pix_fmt yuv420p \
        -f flv "rtmp://$SERVER.twitch.tv/app/$STREAM_KEY"
FFCMD        
    
por 11.03.2014 / 07:00
1

Então você definitivamente tem pulseaudio instalado, mas aparentemente você está faltando os drivers de emulação ALSA pulseaudio. O Pulseaudio é interligado por aplicativos clientes de várias maneiras, mas o mais comum é que os aplicativos abordem o ALSA e o pulseaudio intercepte. O Alsamixer evern funciona desta maneira em um sistema configurado corretamente. Aqui é uma página muito útil para entender como funciona o pulseaudio. Em particular, isso tem a dizer em module-alsa-sink :

You should (almost) never have to load this module manually.

Você pode estar interessado no módulo que algumas linhas estão lá, module-pipe- {sink, source} :

Provides a simple test {sink,source} that {writes,reads} the audio data {to,from} a FIFO...

Para isso, se você tem o VLC ou pode obtê-lo, tente fazer streaming com ele:

pacmd list-source-outputs

deve conter um endereço de saída semelhante ao que colei abaixo para sua fonte fictícia:

cvlc pulse://alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor \
    --sout '#transcode{acodec=mpga,ab=128,channels=2}:\
     standard{access=http,dst=0.0.0.0:8080/pc.mp3}' &

Ah, e você também pode ter algum interesse em pacat e provavelmente já o tem. É o único executável que ambos parec e paplay vinculam.

Um pouco mais no Pulse / ALSA (embora a documentação seja muito boa nisso):

O Pulseaudio tenta imitar o ALSA para qualquer aplicativo que ainda não tenha sido atualizado para interagir com ele. Basicamente, a teoria diz que, se um aplicativo não estiver equipado para fazer o dbus com pulso, o pulse será o intermediário ALSA, de qualquer maneira, através da interface do plugin módulo-alsa-sink que mencionei antes. De fato, o mesmo vale para o OSS e o Esound e seus respectivos módulos, caso sejam necessários.

Mas talvez você esteja pensando demais nisso - o streaming de som mais simples pode ser realizado com o mkfifo, ou até mesmo com o gato, se desejar. Dependendo da sua largura de banda e requisitos de latência, o netcat pode ser bastante útil aqui. Você também pode olhar para o Sox - ele oferece uma interface semelhante ao pacat.

Qual é a sua distribuição linux? Eu entendo que está em um contêiner, mas verificar se você atualizou todos os pacotes relevantes provavelmente é solicitado aqui, especialmente se o pulso não estiver em execução. Tente isto:

pulseaudio --start

Se for executado, tente isto para talvez uma melhor dica do que sua fonte pode ser:

pacmd list-source-outputs | grep 'source:'
    
por 06.03.2014 / 06:17
0

Resolvi o problema sozinho, Este abaixo funciona perfeito mesmo sem uma placa de som no seu VPS, ele transmite áudio e vídeo para a área de trabalho.

FPS="15"                                    # target FPS
PRESET="ultrafast"                    # one of the many FFMPEG preset on (k)ubuntu found in /usr/share/ffmpeg
THREADS="0"                 #0 autostarts threads based on cpu cores.
AUDIO_BITRATE="1k"               #Audio bitrate to 96k
AUDIO_RATE_HZ ="44100"       #Audio rate 44100 hz
GAME_WINDOW="MYGAMETEST"
STREAM_KEY=live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
SERVER="live-jfk"    # NY server

rm -f twitch_tmp 2> /dev/null
wmctrl -r "$GAME_WINDOW" -e 0, 411,51,160,144
xwininfo -name "$GAME_WINDOW" >> twitch_tmp
TOPXY=$(cat twitch_tmp | grep -oEe 'Corners:\s+\+[0-9]+\+[0-9]+' | grep -oEe '[0-9]+\+[0-9]+' | sed -e 's/\+/,/' )
INRES=$(cat twitch_tmp | grep -oEe 'geometry [0-9]+x[0-9]+' | grep -oEe '[0-9]+x[0-9]+')

ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i $DISPLAY+$TOPXY \
             -f pulse -i default \
             -vcodec libx264 -preset $PRESET -crf 30 -x264opts keyint=50:min-keyint=20 -s $INRES \
             -acodec libmp3lame -ab $AUDIO_BITRATE -ar $AUDIO_RATE_HZ \
             -threads 0 -pix_fmt yuv420p \
             -f flv "rtmp://$SERVER.twitch.tv/app/$STREAM_KEY"
    
por 07.03.2014 / 08:36