FFMPEG를 사용하여 데스크톱 오디오를 통해 Twitch.tv로 스트리밍하시겠습니까?

FFMPEG를 사용하여 데스크톱 오디오를 통해 Twitch.tv로 스트리밍하시겠습니까?

지난 한 시간 동안 저는 데스크톱 오디오를 Twitch.tv로 스트리밍하려고 노력해 왔습니다. 현재 이를 사용하여 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"

내가 원하는 것은 마이크와 함께 내 컴퓨터에서 재생되는 오디오(예: YouTube 비디오의 오디오)도 스트림에 업로드하는 것입니다.

다른 옵션도 열려 있지만 지금까지는 찾지 못했습니다.

답변1

먼저 snd_aloop 모듈을 로드하고 mdev 플러그인에서 명명된 장치를 사용하여 ALSA를 올바르게 설정해야 합니다. 루프백 장치와 선택한 다른 장치를 통해 애플리케이션의 오디오를 동시에 출력합니다.

# ~/.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 
} 

FFMPEG는 병합 필터를 사용하여 여러 오디오 스트림을 결합할 수 있습니다. 루프백 소스를 제공하고 추가 입력을 제공할 수 있습니다. 이 예에는 마이크가 포함되어 있습니다. 이 스크립트는 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"

이렇게 하면 PulseAudio를 더 쉽게 사용할 수 있지만 청취 소스를 사용할 때 종종 지연이 발생하여 라이브 스트리밍에 매우 좋지 않습니다. PulseAudio에 지연이 없으면 ALSA 장치를 두 개의 펄스 입력으로 간단히 전환할 수 있습니다.

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

다음과 같이 변경됩니다.

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

그런 다음 pavucontrol에서 입력을 설정할 수 있습니다.

답변2

시도 #2

(ALSA 방식은 작동하지만 오디오가 조용합니다!)

두 방법 모두 다음 제목의 블로그 게시물에서 발견되었습니다.ffmpeg를 사용하여 twitch.tv로 방송.

먼저 이러한 변수를 다음과 같이 설정하십시오.

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

그런 다음 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”

또는 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”

또한 다음 페이지에서 이를 설정하는 방법에 대한 자세한 정보를 찾았습니다.

시도 #1 - (성공하지 않음)

다음 오류가 발생했습니다.알 수 없는 입력 형식: '펄스'

ffmpeg 위키에서 이것을 찾았습니다. 제목 아래에 있습니다스트리밍 가이드.

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

관련 정보