Usando o FFMPEG para transmitir ao Twitch.tv com áudio de mesa?

6

Eu tenho tentado pela última hora para transmitir ao Twitch.tv com áudio de desktop no fluxo. Atualmente, posso usá-lo para exibir um vídeo no Twitch:

#! /bin/bash

INRES="1280x800"             # input resolution
OUTRES="640x480"             # Output resolution
FPS="30"                     # target FPS
QUAL="medium"                # one of the many FFMPEG presets
STREAM_KEY=$(cat ~/.twitch_key)

ffmpeg \
    -f x11grab -s $INRES  -r "$FPS" -i :0.0 \
    -f alsa -ac 2 -i pulse  \
    -vcodec libx264 -s $OUTRES -preset $QUAL \
    -acodec libmp3lame -ar 44100 -threads 6 -qscale 3 -b 712000  -bufsize 512k \
    -f flv "rtmp://live.justin.tv/app/$STREAM_KEY"

O que eu quero é que, junto com meu microfone, eu precise do áudio que meu computador está reproduzindo (por exemplo, o áudio de um vídeo do YouTube) para fazer o upload para o fluxo também.

Também estou aberto a outras opções, mas ainda não consegui encontrar nenhuma.

    
por jackcook 17.08.2013 / 03:54

2 respostas

1

Tentativa # 2

(o método ALSA funcionou, mas o áudio é silencioso!)

Encontrou esses dois métodos em um post intitulado: Transmitindo para twitch.tv usando o ffmpeg .

Primeiro defina essas variáveis da seguinte forma:

SIZE=”1600×1200″
BITRATE=”128k”
FRAMERATE=”20″
KEY=”your key here”

Em seguida, use isso para o ALSA:

$ ffmpeg \
       -f x11grab -s $SIZE -r $FRAMERATE -i :0.0 \
       -f alsa -ac 2 -i hw:0,0 -vb $BITRATE -vcodec libx264 \
       -threads 0 -acodec libmp3lame -ab 128k -ar 22050 \
       -f flv “rtmp://live.justin.tv/app/$KEY”

Ou se estiver usando o OSS:

$ ffmpeg \
       -f x11grab -s $SIZE -r $FRAMERATE -i :0.0 \
       -f oss -i /dev/dsp -vb $BITRATE -vcodec libx264 \
       -threads 0 -acodec libmp3lame -ab 128k -ar 22050 \
       -f flv “rtmp://live.justin.tv/app/$KEY”

Também encontrei informações adicionais sobre como configurá-lo nas seguintes páginas:

Tentativa # 1 - (não funcionou)

Obteve este erro: Formato de entrada desconhecido: 'pulse'

Eu encontrei isso no wiki do ffmpeg. Estava na página intitulada Guia de Transmissão .

$ ffmpeg \
       -f x11grab -s $INRES -r $FPS -i :0.0 \
       -f pulse -ac 2 -i default -c:v libx264 -preset $QUAL \
       -pix_fmt yuv420p -s $OUTRES -c:a libmp3lame -ab 96k -ar 22050 \
       -threads 0 -f flv "rtmp://live.justin.tv/app/$STREAM_KEY"
    
por 17.08.2013 / 06:06
1

Primeiro você precisa configurar o ALSA corretamente, carregando o módulo snd_aloop e usando seu dispositivo nomeado em um plugin mdev. Você emitirá simultaneamente o áudio de um aplicativo através do dispositivo de loopback e de outro dispositivo de sua escolha.

# ~/.asoundrc

pcm.!default {
  type plug
  slave.pcm mdev
  route_policy duplicate
}

pcm.mdev {
  type multi

  slaves.a.pcm "hw:Loopback,0,0"
  slaves.a.channels 2
  slaves.b.pcm "hw:0,0"
  slaves.b.channels 2

  bindings.0.slave a
  bindings.0.channel 0
  bindings.1.slave a
  bindings.1.channel 1
  bindings.2.slave b
  bindings.2.channel 0
  bindings.3.slave b
  bindings.3.channel 1
}

pcm.loopback {
  type hw
  card Loopback
  device 1
  subdevice 0
}

pcm.mic {
  type hw
  card 1
  device 0 
} 

O FFMPEG pode mesclar vários fluxos de áudio usando o filtro amerge. Você fornecerá a fonte de loopback e poderá fornecer entradas adicionais. Este exemplo inclui um microfone. Este script está configurado para streaming no TwitchTV.

#!/bin/bash

FPS="30"
QUAL="faster"
GOP="60"
GOPMIN="30"
CBR="1500k"
ABR="96k"
SIZE="960x540"
OUTPUT=""rtmp://live-jfk.twitch.tv/app/${STREAM_KEY}"

function GetWindowPos() {
  echo $(xwininfo | grep 'Absolute' | awk '{ORS=" "; print $4;}' | awk '{print ":0.0+"$1","$2"+draw_mouse=0";}')
}

function GetWindowSize() {
  echo $(xwininfo | grep 'Width\|Height' | awk '{ORS=" "; print $2;}' | awk '{print $1"x"$2;}')
}

ffmpeg \
  -f alsa -i mic \
  -f alsa -i loopback \
  -f x11grab -s $(GetWindowSize) -i $(GetWindowPos) \
  -acodec aac -ab "$ABR" -strict -2 \
  -vcodec libx264 -preset "$QUAL" \
  -g "$GOP" -keyint_min "$GOPMIN" \
  -b:v "$CBR" -minrate "$CBR" -maxrate "$CBR" -bufsize "$CBR" \
  -filter_complex "[2:0]format=pix_fmts=yuv420p[vstream];[0:0][1:0]amerge=inputs=2[astream]" \
  -flags:v +global_header -flags:a +global_header \
  -r "$FPS" -s "$SIZE" \
  -map "[vstream]" -map "[astream]" \
  -f flv "$OUTPUT"

Isso seria uma ordem de grandeza mais fácil de usar o PulseAudio, mas eu geralmente experimento latência usando as fontes do monitor, o que é terrível para a transmissão ao vivo. Se você está livre de latência no PulseAudio, você pode simplesmente desligar os dispositivos ALSA para duas entradas de pulso.

-f alsa -i mic \
-f alsa -i loopback \

Isso mudaria para:

-f alsa -i pulse \
-f alsa -i pulse \

Então você definiria as entradas no pavucontrol.

por 09.04.2015 / 16:18