私はこの1時間ほど、デスクトップオーディオをストリームに入れて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ビデオのオーディオなど)も必要です。
他のオプションも利用できますが、まだ見つけることができません。
まず、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でレイテンシーがない場合は、2つのPulse入力用にALSAデバイスを切り替えるだけです。
-f alsa -i mic \
-f alsa -i loopback \
これらは次のように変更されます。
-f alsa -i Pulse \
-f alsa -i Pulse \
次に、pavucontrolで入力を設定します。
(ALSAメソッドは機能しましたが、オーディオは静かです!)
次のタイトルのブログ投稿でこれらの2つの方法を見つけました: 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”
また、次のページでこれを設定する方法に関する追加情報を見つけました。
このエラーが発生しました:不明な入力形式: 'パルス'
私はこれをffmpegwikiで見つけました。 ---(ストリーミングガイド というタイトルのページにありました。
$ 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"