Token导航 LogoToken导航

Agent Skill · 研究检索

streaming-patterns(流模式)

streaming-patterns 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

streaming-patterns 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为执行命令;许可证为 MIT,第三方扫描有未通过项,按安装量在研究检索类的 73,675 个 Skill 里排第 56,028。

总安装 465周安装 19GitHub Stars 2下载 150核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:streaming-patterns(流模式)
来源仓库:https://github.com/mindmorass/reflex
仓库路径:skills/streaming-patterns
安装命令:
npx skills add https://github.com/mindmorass/reflex --skill streaming-patterns
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/mindmorass/reflex --skill streaming-patterns

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中快速定位候选结果。支持基于关键词、任务场景或来源线索进行信息筛选与整理。通过 npx skills add 命令从指定 GitHub 仓库安装使用。安装前需确认权限范围、维护状态及是否触发联网或文件操作。

streaming-patterns 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/streaming-patterns

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/mindmorass/reflex --skill streaming-patterns;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要执行命令,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

streaming-patterns 怎么安装?

在终端执行 npx skills add https://github.com/mindmorass/reflex --skill streaming-patterns。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

streaming-patterns 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

streaming-patterns 需要什么权限?

权限级别是执行命令。安装流程涉及命令执行,可能通过 npx skills add https://github.com/mindmorass/reflex --skill streaming-patterns;npx skills add mindmorass/reflex --skill "streaming-patterns" 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

streaming-patterns 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

streaming-patterns 用的人多吗?

公开数据是累计安装 465 次,近一周安装 19 次,下载 150 次,GitHub 2 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

streaming-patterns 安全吗?

第三方扫描有未通过项,风险较高。除非你确认过源码,否则不建议直接安装到常用环境。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 3 个目录同时收录,说明这个 Skill 流传比较广。
  • 许可证明确为 MIT,商用和分发边界好判断。

先想清楚的地方

  • 需要执行命令,装到常用环境前要先评估影响面。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 不能接受 Skill 在你机器上执行命令的人。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
streaming-patterns

流模式 · 本页

4652执行命令MIT未通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Live Streaming Patterns

Best practices for live streaming to YouTube, Twitch, and other platforms.

Platform Configuration

YouTube Live

from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials

def create_youtube_broadcast(
    credentials: Credentials,
    title: str,
    description: str,
    scheduled_start: str,
    privacy: str = "unlisted"
):
    """Create a YouTube live broadcast."""
    youtube = build('youtube', 'v3', credentials=credentials)

    # Create broadcast
    broadcast = youtube.liveBroadcasts().insert(
        part="snippet,status,contentDetails",
        body={
            "snippet": {
                "title": title,
                "description": description,
                "scheduledStartTime": scheduled_start
            },
            "status": {
                "privacyStatus": privacy,
                "selfDeclaredMadeForKids": False
            },
            "contentDetails": {
                "enableAutoStart": True,
                "enableAutoStop": True,
                "enableDvr": True,
                "recordFromStart": True
            }
        }
    ).execute()

    # Create stream
    stream = youtube.liveStreams().insert(
        part="snippet,cdn",
        body={
            "snippet": {
                "title": f"Stream for {title}"
            },
            "cdn": {
                "frameRate": "60fps",
                "ingestionType": "rtmp",
                "resolution": "1080p"
            }
        }
    ).execute()

    # Bind stream to broadcast
    youtube.liveBroadcasts().bind(
        part="id,contentDetails",
        id=broadcast['id'],
        streamId=stream['id']
    ).execute()

    return {
        "broadcast_id": broadcast['id'],
        "stream_key": stream['cdn']['ingestionInfo']['streamName'],
        "rtmp_url": stream['cdn']['ingestionInfo']['ingestionAddress'],
        "watch_url": f"https://youtube.com/watch?v={broadcast['id']}"
    }

def transition_broadcast(credentials: Credentials, broadcast_id: str, status: str):
    """Transition broadcast status: testing, live, complete."""
    youtube = build('youtube', 'v3', credentials=credentials)

    return youtube.liveBroadcasts().transition(
        broadcastStatus=status,
        id=broadcast_id,
        part="status"
    ).execute()

Twitch

import requests

class TwitchAPI:
    def __init__(self, client_id: str, access_token: str):
        self.client_id = client_id
        self.access_token = access_token
        self.base_url = "https://api.twitch.tv/helix"
        self.headers = {
            "Client-ID": client_id,
            "Authorization": f"Bearer {access_token}"
        }

    def get_stream_key(self, broadcaster_id: str) -> str:
        """Get stream key for broadcaster."""
        response = requests.get(
            f"{self.base_url}/streams/key",
            headers=self.headers,
            params={"broadcaster_id": broadcaster_id}
        )
        return response.json()['data'][0]['stream_key']

    def update_stream_info(
        self,
        broadcaster_id: str,
        title: str,
        game_id: str = None,
        language: str = "en"
    ):
        """Update stream title and category."""
        data = {
            "broadcaster_id": broadcaster_id,
            "title": title,
            "broadcaster_language": language
        }
        if game_id:
            data["game_id"] = game_id

        return requests.patch(
            f"{self.base_url}/channels",
            headers=self.headers,
            json=data
        )

    def get_stream_status(self, user_login: str) -> dict:
        """Check if channel is live."""
        response = requests.get(
            f"{self.base_url}/streams",
            headers=self.headers,
            params={"user_login": user_login}
        )
        data = response.json()['data']
        return data[0] if data else None

    def create_clip(self, broadcaster_id: str) -> dict:
        """Create clip from live stream."""
        response = requests.post(
            f"{self.base_url}/clips",
            headers=self.headers,
            params={"broadcaster_id": broadcaster_id}
        )
        return response.json()['data'][0]

RTMP Streaming

FFmpeg RTMP Push

# Stream to YouTube
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset veryfast -maxrate 4500k -bufsize 9000k \
    -pix_fmt yuv420p -g 60 \
    -c:a aac -b:a 160k -ar 44100 \
    -f flv "rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY"

# Stream to Twitch
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset veryfast -maxrate 6000k -bufsize 12000k \
    -pix_fmt yuv420p -g 60 \
    -c:a aac -b:a 160k -ar 44100 \
    -f flv "rtmp://live.twitch.tv/app/YOUR_STREAM_KEY"

# Stream desktop (macOS)
ffmpeg -f avfoundation -framerate 30 -i "1:0" \
    -c:v libx264 -preset ultrafast -tune zerolatency \
    -c:a aac -b:a 128k \
    -f flv "rtmp://destination/stream_key"

# Stream desktop (Linux)
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 \
    -f pulse -i default \
    -c:v libx264 -preset ultrafast -tune zerolatency \
    -c:a aac -b:a 128k \
    -f flv "rtmp://destination/stream_key"

Multi-Platform Streaming

# Using tee muxer to stream to multiple platforms
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset veryfast -b:v 4500k \
    -c:a aac -b:a 160k \
    -f tee -map 0:v -map 0:a \
    "[f=flv]rtmp://a.rtmp.youtube.com/live2/YT_KEY|\
     [f=flv]rtmp://live.twitch.tv/app/TWITCH_KEY|\
     [f=flv]rtmp://live-api-s.facebook.com:443/rtmp/FB_KEY"

Python RTMP Handler

import subprocess
from dataclasses import dataclass
from typing import List, Optional

@dataclass
class StreamDestination:
    name: str
    rtmp_url: str
    stream_key: str

    @property
    def full_url(self) -> str:
        return f"{self.rtmp_url}/{self.stream_key}"

class MultiStreamer:
    def __init__(
        self,
        input_source: str,
        destinations: List[StreamDestination],
        video_bitrate: str = "4500k",
        audio_bitrate: str = "160k"
    ):
        self.input_source = input_source
        self.destinations = destinations
        self.video_bitrate = video_bitrate
        self.audio_bitrate = audio_bitrate
        self.process: Optional[subprocess.Popen] = None

    def build_command(self) -> List[str]:
        """Build FFmpeg command for multi-platform streaming."""
        cmd = [
            "ffmpeg",
            "-re", "-i", self.input_source,
            "-c:v", "libx264",
            "-preset", "veryfast",
            "-b:v", self.video_bitrate,
            "-maxrate", self.video_bitrate,
            "-bufsize", str(int(self.video_bitrate[:-1]) * 2) + "k",
            "-pix_fmt", "yuv420p",
            "-g", "60",
            "-c:a", "aac",
            "-b:a", self.audio_bitrate,
            "-ar", "44100"
        ]

        if len(self.destinations) == 1:
            cmd.extend(["-f", "flv", self.destinations[0].full_url])
        else:
            # Use tee muxer for multiple destinations
            tee_outputs = "|".join(
                f"[f=flv]{dest.full_url}" for dest in self.destinations
            )
            cmd.extend([
                "-f", "tee",
                "-map", "0:v", "-map", "0:a",
                tee_outputs
            ])

        return cmd

    def start(self):
        """Start streaming."""
        cmd = self.build_command()
        self.process = subprocess.Popen(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )

    def stop(self):
        """Stop streaming."""
        if self.process:
            self.process.terminate()
            self.process.wait()

OBS WebSocket Integration

import obswebsocket
from obswebsocket import obsws, requests as obs_requests

class OBSController:
    def __init__(self, host: str = "localhost", port: int = 4455, password: str = ""):
        self.ws = obsws(host, port, password)

    def connect(self):
        self.ws.connect()

    def disconnect(self):
        self.ws.disconnect()

    def start_streaming(self):
        """Start OBS streaming."""
        self.ws.call(obs_requests.StartStream())

    def stop_streaming(self):
        """Stop OBS streaming."""
        self.ws.call(obs_requests.StopStream())

    def start_recording(self):
        """Start OBS recording."""
        self.ws.call(obs_requests.StartRecord())

    def stop_recording(self):
        """Stop OBS recording."""
        self.ws.call(obs_requests.StopRecord())

    def switch_scene(self, scene_name: str):
        """Switch to a different scene."""
        self.ws.call(obs_requests.SetCurrentProgramScene(sceneName=scene_name))

    def get_scenes(self) -> list:
        """Get list of available scenes."""
        response = self.ws.call(obs_requests.GetSceneList())
        return [scene['sceneName'] for scene in response.getScenes()]

    def set_source_visibility(self, scene: str, source: str, visible: bool):
        """Show or hide a source in a scene."""
        self.ws.call(obs_requests.SetSceneItemEnabled(
            sceneName=scene,
            sceneItemId=self._get_source_id(scene, source),
            sceneItemEnabled=visible
        ))

    def _get_source_id(self, scene: str, source: str) -> int:
        """Get source ID by name."""
        response = self.ws.call(obs_requests.GetSceneItemId(
            sceneName=scene,
            sourceName=source
        ))
        return response.getSceneItemId()

    def set_stream_settings(self, server: str, key: str):
        """Update stream settings."""
        self.ws.call(obs_requests.SetStreamServiceSettings(
            streamServiceType="rtmp_common",
            streamServiceSettings={
                "server": server,
                "key": key
            }
        ))

Stream Automation

Scheduled Stream

import asyncio
from datetime import datetime, timedelta
from typing import Callable

class StreamScheduler:
    def __init__(self):
        self.scheduled_streams = []

    async def schedule_stream(
        self,
        start_time: datetime,
        duration: timedelta,
        start_callback: Callable,
        stop_callback: Callable
    ):
        """Schedule a stream for a specific time."""
        now = datetime.now()
        delay = (start_time - now).total_seconds()

        if delay > 0:
            await asyncio.sleep(delay)

        # Start stream
        await start_callback()

        # Wait for duration
        await asyncio.sleep(duration.total_seconds())

        # Stop stream
        await stop_callback()

# Usage
async def main():
    scheduler = StreamScheduler()
    obs = OBSController()
    obs.connect()

    start_time = datetime.now() + timedelta(minutes=5)
    duration = timedelta(hours=2)

    await scheduler.schedule_stream(
        start_time=start_time,
        duration=duration,
        start_callback=lambda: obs.start_streaming(),
        stop_callback=lambda: obs.stop_streaming()
    )

Chat Bot Integration

from twitchio.ext import commands

class StreamBot(commands.Bot):
    def __init__(self, token: str, prefix: str, channels: list):
        super().__init__(token=token, prefix=prefix, initial_channels=channels)
        self.obs = OBSController()
        self.obs.connect()

    async def event_ready(self):
        print(f'Bot is ready | {self.nick}')

    async def event_message(self, message):
        if message.echo:
            return
        await self.handle_commands(message)

    @commands.command(name='scene')
    async def scene_command(self, ctx, scene_name: str):
        """Switch OBS scene via chat command."""
        if ctx.author.is_mod:
            try:
                self.obs.switch_scene(scene_name)
                await ctx.send(f"Switched to scene: {scene_name}")
            except Exception as e:
                await ctx.send(f"Error switching scene: {e}")

    @commands.command(name='brb')
    async def brb_command(self, ctx):
        """Switch to BRB scene."""
        if ctx.author.is_mod:
            self.obs.switch_scene("BRB")
            await ctx.send("Be right back!")

    @commands.command(name='back')
    async def back_command(self, ctx):
        """Switch back to main scene."""
        if ctx.author.is_mod:
            self.obs.switch_scene("Main")
            await ctx.send("We're back!")

Stream Quality Presets

from dataclasses import dataclass
from enum import Enum

class StreamQuality(Enum):
    LOW = "480p"
    MEDIUM = "720p"
    HIGH = "1080p"
    ULTRA = "1440p"

@dataclass
class EncodingPreset:
    resolution: str
    video_bitrate: str
    audio_bitrate: str
    framerate: int
    preset: str

QUALITY_PRESETS = {
    StreamQuality.LOW: EncodingPreset(
        resolution="854x480",
        video_bitrate="1500k",
        audio_bitrate="96k",
        framerate=30,
        preset="veryfast"
    ),
    StreamQuality.MEDIUM: EncodingPreset(
        resolution="1280x720",
        video_bitrate="3000k",
        audio_bitrate="128k",
        framerate=30,
        preset="veryfast"
    ),
    StreamQuality.HIGH: EncodingPreset(
        resolution="1920x1080",
        video_bitrate="4500k",
        audio_bitrate="160k",
        framerate=60,
        preset="veryfast"
    ),
    StreamQuality.ULTRA: EncodingPreset(
        resolution="2560x1440",
        video_bitrate="9000k",
        audio_bitrate="192k",
        framerate=60,
        preset="fast"
    )
}

Health Monitoring

import asyncio
from dataclasses import dataclass
from datetime import datetime

@dataclass
class StreamHealth:
    bitrate: float
    dropped_frames: int
    fps: float
    cpu_usage: float
    timestamp: datetime

class StreamMonitor:
    def __init__(self, obs: OBSController):
        self.obs = obs
        self.health_history: list[StreamHealth] = []

    async def monitor(self, interval: float = 5.0):
        """Continuously monitor stream health."""
        while True:
            try:
                stats = self.obs.ws.call(obs_requests.GetStats())
                health = StreamHealth(
                    bitrate=stats.getKbitsPerSec(),
                    dropped_frames=stats.getOutputSkippedFrames(),
                    fps=stats.getActiveFps(),
                    cpu_usage=stats.getCpuUsage(),
                    timestamp=datetime.now()
                )
                self.health_history.append(health)

                # Alert on issues
                if health.dropped_frames > 100:
                    print(f"Warning: High dropped frames: {health.dropped_frames}")
                if health.fps < 25:
                    print(f"Warning: Low FPS: {health.fps}")

            except Exception as e:
                print(f"Monitor error: {e}")

            await asyncio.sleep(interval)

References

平台分布

Claude Code

27.22%
按下载量换算41

Gemini CLI

21.73%
按下载量换算33

Antigravity

18.72%
按下载量换算28

windsurf

14.9%
按下载量换算22

trae

8.5%
按下载量换算13

Codex

4.08%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

未通过

权限和风险

执行命令

安装流程涉及命令执行,可能通过 npx skills add https://github.com/mindmorass/reflex --skill streaming-patterns;npx skills add mindmorass/reflex --skill "streaming-patterns" 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。

继续浏览同类 Skills