【问题标题】:Can I use ffmpeg to encode a procedurally generated video for livestream?我可以使用 ffmpeg 对程序生成的视频进行编码以进行直播吗?
【发布时间】:2020-07-23 07:04:28
【问题描述】:

我有一个连续生成图像(视频帧)的 python 脚本。

我通常会将这些图像保存到文件中,然后使用命令行使用 ffmpeg 将它们转换为视频。需要哪些额外步骤来调整此工作流以进行直播?

我不想将帧保存到文件中,而是想将它们流式传输到 YouTube,并且我的脚本可能会无限期地运行以生成视频帧。

我正在寻找一般指南,以便我可以自己在 Google 上搜索更多详细信息。我假设像 YouTube 这样的视频平台有一些 API,我可以在其中发送数据以进行直播。我不知道这样的 API 会期望什么类型的数据格式,但我认为仅仅将每一帧发送到 API 并不是这样做的。

我是否需要使用某个库在内存中对我的帧进行编码?我可以使用 ffmpeg 吗?

【问题讨论】:

  • 让您的脚本创建一个 y4m 流,将其打印到标准输出,然后通过管道将其传输到 ffmpeg。

标签: ffmpeg video-streaming


【解决方案1】:

您可以通过 RTMP 从 ffmpeg 流式传输到 YouTube。

对于您的 ffmpeg 命令中的输出参数,只需传递您打算流式传输到的 YouTube RTMP 地址,然后是您唯一的 YouTube 流密钥。

例子:

ffmpeg -i <input> [additional arguments] -f flv rtmp://x.rtmp.youtube.com/live2/STREAM_KEY

请注意,YouTube 可能无法识别流,除非它有伴随的音频;你可以使用 ffmpeg 中的anullsrc 过滤器来产生一个空的音频流。

您需要调整比特率和其他参数,以在质量与您的计算机和网络可以处理的内容之间取得平衡。

有关使用 ffmpeg 进行流式传输的更多信息:

正如@szatmary 所评论的,您可以将原始帧通过管道传输到标准输出,并让 ffmpeg 从标准输入中读取它。

我能够在我的个人 YouTube 频道上进行直播。它循环播放红色、绿色、蓝色帧每秒改变颜色:https://www.youtube.com/watch?v=cfWbDwrmCYA

我使用以下 Python 脚本实现了它(取决于 Pillow):

import os
import itertools
import PIL
from PIL import Image
from PIL import ImageColor

colors = itertools.cycle([ImageColor.getrgb('red'), ImageColor.getrgb('green'), ImageColor.getrgb('blue')])

while True:
    color = next(colors)
    for i in range(30):
        os.write(1, Image.new('RGBA', [640, 360], color).tobytes())

然后我在终端中使用 PATH 中的脚本和 ffmpeg 运行它:

python3 script.py | \
ffmpeg \
-f rawvideo \
-vcodec rawvideo \
-s 640x360 \
-pix_fmt rgba \
-r 30 \
-i - \
-f lavfi \
-i anullsrc \
-c:v libx264 \
-b:v 1M \
-f flv \
rtmp://x.rtmp.youtube.com/live2/STREAM_KEY

以上是可执行的;这是一个 pastebin,每个参数旁边都有 cmets 描述它们(不可执行):https://pastebin.com/3G2y0tjm

最后要注意的两件事:

  1. 我尝试使用 Pillow ImageMode 'RGB',我认为它与 ffmpeg pix_fmt rgb8 相对应,但这会产生损坏的帧。确保两种像素格式匹配。

  2. YouTube 抱怨 ffmpeg 流比实时 fps 更快(在“30fps”流上约为 350fps)。您可能需要某种方式来包含睡眠功能或其他东西,并对其进行调整以匹配您所需的 fps。

来源:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 2014-05-02
    • 2011-12-23
    • 2011-09-30
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多