使用 USB 网络摄像头流 (pytgcalls) 的电报视频通话

Telegram video call with USB webcam stream (pytgcalls)

我正在尝试在 Telegram 上使用 pytgcalls 发送 USB 网络摄像头的流。 documentation 中没有相关内容,但有几个流式传输 youtube 视频或本地 mp4 文件的示例。我发现了这个流式传输 youtube 视频的示例,我认为流式传输 usb 网络摄像头非常相似。 首先,导入模块:

import asyncio
from pyrogram import Client

from pytgcalls import idle
from pytgcalls import PyTgCalls
from pytgcalls import StreamType
from pytgcalls.types.input_stream import AudioImagePiped, AudioVideoPiped
from pytgcalls.types.input_stream.quality import HighQualityVideo, HighQualityAudio, LowQualityAudio, LowQualityVideo

现在,启动 pyrogram 和 pytgcalls 客户端:

app = Client('py-tgcalls', api_id=API_ID, api_hash=API_HASH)

call_py = PyTgCalls(app)
call_py.start()

声明将 youtube link 转换为流的函数:

def get_youtube_stream():
    async def run_async():
        proc = await asyncio.create_subprocess_exec(
            'youtube-dl',
            '-g',
            '-f',
            'best[height<=?720][width<=?1280]',
            # Some random YT link
            'https://www.youtube.com/watch?v=AAAAAAA',
            stdout=asyncio.subprocess.PIPE,
            stderr=asyncio.subprocess.PIPE,
        )
        stdout, stderr = await proc.communicate()
        return stdout.decode().split('\n')[0]
    return asyncio.get_event_loop().run_until_complete(run_async())

在群中声明通过电报发送流的功能:

def youtube():
    remote = get_youtube_stream()
    call_py.join_group_call(
        # Group ID
        -10011111111,
        AudioVideoPiped(
            remote,
            HighQualityAudio(),
            HighQualityVideo(),
        ),
        stream_type=StreamType().pulse_stream,
    )

现在函数youtube()可以执行了:

youtube()

使用 idle() 来阻止脚本:

idle()

这是脚本,有人可以帮我直播 USB 网络摄像头吗?

最近 pytgcalls (0.9.0) 增加了从 upd 流流式传输的可能性,您可以直接使用 ffmpeg 捕获媒体设备并制作本地 UDP 流式传输