지난 한 시간 동안 저는 데스크톱 오디오를 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"