流式傳輸至 twitch.tv - Arch Linux 中文维基

跳至內容

# 流式傳輸至 twitch.tv

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Streaming to twitch.tv，最近一次同步於 2022-11-18，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

Twitch.tv 是一個流行的 RTMP 的流媒體服務。因此，本頁面為 Twitch.tv 提供流媒體服務的解決方案列表。使用案例可能包括流媒體遊戲、Linux 桌面等。

## Twitch 廣播要求

根據 Twitch.tv 支持頁面:

視頻要求

- 編解碼器：H.264 (x264)
- 模式：嚴格恆定比特率
- 關鍵幀間隔：2 秒

音頻要求

- 編解碼器：AAC-LC，立體聲或單聲道
- 最大比特率：160 kbps
- 採樣頻率：任意

注意：已取消支持 MP3 編解碼器

其他要求

- 頁面未列出對 Y'UV420p 像素格式的要求，因為對 Y'UV444 的支持還不廣泛。

## 圖形用戶界面解決方案

- Open Broadcaster Software（obs-studio包）是一款流行的流媒體程序。Alpha Linux 構建的安裝包（obs-studio-gitAUR）也可用於編譯和測試。
- Castawesome（castawesomeAUR）是一款用於 ffmpeg 流媒體的 Gtk3 前端，內置 Twitch.tv 支持。
- SimpleScreenRecorder（lib32-simplescreenrecorder包）可對 Twitch 串流（直播）進行配置：
  - 容器需設置為 FLV
  - RTMP URL 需要放在『另存為』欄中
  - 確保沒有選中「文件分段」
  - 視頻編解碼器設置為 libx264（不是 H.264）
  - 設定合理的比特率，如 2000 kbps
  - 在自定義選項欄中，輸入`preset=fast,minrate=2000,maxrate=2000,bufsize=2000,keyint=60`

    注意：「minrate」、「maxrate」和「bufsize」的值應等於比特率。

## 命令行界面解決方案

- FFmpeg (ffmpeg包)
  - PyLivestream (pylivestream-gitAUR)
- GStreamer (gstreamer包)
  - gst-live

### FFmpeg

下面的解決方案利用了 FFmpeg 來實現向 Twitch.tv 串流（直播）。

#### shell 腳本方法

使用 FFmpeg 實現的向 Twitch.tv 串流（直播）的 shell 腳本。它支持對桌面和 OpenGL 元素進行串流。可通過運行 `stream-to-twitch path/to/stream_key` 在 shell 中調用，密鑰則使用 pass 安全存儲。腳本內容如下：

    /usr/local/sbin/stream-to-twitch

    #!/usr/bin/env sh
    #
    # Stream screen and audio (speakers and microphone) to Twitch.tv using FFmpeg.
    #
    # Usage: stream-to-twitch path/to/key

    set -euo pipefail

    #######################################
    # Stream to Twitch.tv.
    # Globals:
    #   None.
    # Arguments:
    #   Stream key. A string.
    # Returns:
    #   None.
    #######################################
    stream_to_twitch() {
        res_input="1920x1080" # input resolution
        res_output="1280x720" # output resolution
        fps="30" # target FPS
        gop="60" # i-frame interval, should be double of fps
        gop_min="30" # min i-frame interval, should be equal to fps
        probesize="42M" # https://stackoverflow.com/a/57904380
        threads="2" # max 6
        cbr="1000k" # constant bitrate (should be between 1000k–3000k)
        quality="ultrafast" # one of the many FFmpeg presets
        audio_input_speakers="0" # speakers' sink id
        audio_input_mic="default" # microphone's sink id
        audio_rate="44100"
        stream_server="live-prg" # see https://stream.twitch.tv/ingests for list
        stream_key="${1}" # key will be passed as an agument from the command line
        loglevel="warning" # supress unecessary information from printing

        ffmpeg \
            -loglevel "${loglevel}" \
            -f x11grab -s "${res_input}" -r ${fps} -probesize ${probesize} -i :0.0 \
            -f pulse -i "${audio_input_speakers}" \
            -f pulse -i "${audio_input_mic}" \
            -filter_complex "[2]highpass=f=200,lowpass=f=3000[hl]; [1][hl]amix=inputs=2[a]" \
            -map 0:v -map [a] \
            -f flv -ac 2 -ar ${audio_rate} \
            -vcodec libx264 -g ${gop} -keyint_min ${gop_min} -b:v ${cbr} \
            -minrate ${cbr} -maxrate ${cbr} -pix_fmt yuv420p \
            -s ${res_output} -preset "${quality}" -tune film -acodec aac \
            -threads ${threads} -strict normal \
            -bufsize ${cbr} \
            "rtmp://${stream_server}.twitch.tv/app/${stream_key}"
    }

    # Get stream key securely stored with the password manager "pass"
    # and pass the key to the script to start the stream.
    stream_to_twitch "$(pass "${1}")"

提示：如果使用 PulseAudio，請運行 `pactl list sinks short` 尋找輸入音頻流。也可使用混音器（例如 pulsemixer包 或 pavucontrol包）在腳本運行時編輯音源。
注意：根據你的網絡上傳速度，你可能需要修改 FFmpeg 的參數。請使用參數明細作為參考。

FFmpeg 參數明細
參數 | 描述
--- | ---
`ffmpeg` | 轉換器
`-loglevel "${LOGLEVEL}"` | -loglevel 設置日誌輸出級別
`-f x11grab` | -f 強制從 x11grab 輸入
`-s $RES_INPUT` | -s 從輸入源設置一個指定的圖像尺寸，由變量 $RES_INPUT 提供
`-r $FPS` | -r 設置幀率為 $FPS
`-probesize "${PROBESIZE}"` | -probesize 設置要分析的數據大小，以獲得流信息
`-i :0.0` | -i 獲取顯示（器）輸入，在這裡，是從 x11 的 :0.0 顯示（器）獲取。可以調整，例如：-i :0.0+500,100 是指在屏幕位置 500/100 處開始獲取
`-f pulse` | 強制從 PulseAudio 輸入
`-i "${AUDIO_INPUT_SPEAKERS`"} | 選擇揚聲器的 sink ID
`-i "${AUDIO_INPUT_MIC`"} | 選擇麥克風的 sink ID
`-filter_complex ...` | 將過濾器應用到麥克風，以減少噪音並合併音頻流
`-map 0:v` | 映射視頻流
`-map [a]` | 映射音頻流
`-f flv` | 強制格式為 FLV
`-ac 2` | 設置聲道為 2
`-ar "${AUDIO_RATE}"` | -ar 設置音頻比特率
`-vcodec libx264` | 設置視頻編解碼器為 libx264
`-b:v "$CBR"` | -b:v 指定要改變到的視頻比特率。比特率的值由 $CBR 決定
`-pix_fmt yuv420p` | 設置像素格式為 Y'UV420p。否則默認使用 Y'UV444，這與 Twitch 不兼容
`-s $RES_OUTPUT` | -s 為輸出設置一個指定的圖像尺寸，由變量 $RES_OUTPUT 提供
`-preset "{$QUALITY}"` | 設置預設的壓縮質量和速度
`-acodec aac` | 設置音頻編解碼器以使用 AAC
`-threads 0` | 設置啟動的 CPU 線程，為 0 則根據 CPU 核心數自動啟動線程

分類：​

- 多媒體
- 串流

流式傳輸至 twitch.tv
新增話題