Могу ли я использовать ffmpeg для кодирования процедурно сгенерированного видео для прямой трансляции? - PullRequest
1 голос
/ 10 апреля 2020

У меня есть скрипт python, который непрерывно генерирует изображения (кадры видео).

Обычно я сохраняю эти изображения в файлы, а затем преобразую их в видео с помощью ffmpeg с помощью командной строки. Какие дополнительные шаги требуются для адаптации этого рабочего процесса для прямой трансляции?

Вместо сохранения кадров в файлы, я хотел бы передать их, скажем, на YouTube, и мой сценарий мог потенциально выполнять бесконечно генерирующие кадры видео.

Я ищу общие рекомендации, чтобы я мог сам гуглить подробнее. Я предполагаю, что у видео платформ, таких как YouTube, есть некоторый API, куда я могу отправлять данные для прямой трансляции. Я понятия не имею, какой тип данных ожидает такой API, но я предполагаю, что просто отправка каждого отдельного кадра в API - это не то, как это делается.

Нужно ли мне кодировать свои кадры в памяти, используя некоторые библиотека? Могу ли я использовать ffmpeg для этого?

1 Ответ

1 голос
/ 11 апреля 2020

Вы можете вести потоковую передачу на YouTube из ffmpeg через RTMP.

В качестве выходного аргумента в своей команде ffmpeg просто передайте адрес YouTube RTMP, на который вы собираетесь передавать, а затем свой уникальный ключ потока YouTube.

Пример:

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

Обратите внимание, что YouTube может не распознать поток, если у него нет сопровождающего аудио; Вы можете использовать фильтр anullsrc в ffmpeg для создания и очистки аудиосигнала.

Вы можете настроить битрейт и другие аргументы, чтобы достичь баланса качества и возможностей вашего компьютера и сети.

Дополнительная информация о потоковой передаче с помощью ffmpeg: https://trac.ffmpeg.org/wiki/StreamingGuide

Как прокомментировал @szatmary, вы можете передать необработанные кадры на стандартный вывод и заставить ffmpeg читать его из стандартного ввода.

Мне удалось создать прямую трансляцию на моем личном канале YouTube. Это циклы красной, зеленой, синей рамок, меняющие цвет каждую секунду: https://www.youtube.com/watch?v=cfWbDwrmCYA

Я добился этого с помощью следующего сценария Python (зависит от подушки):

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())

И затем я запустил это в своем терминале с помощью скрипта и ffmpeg в моем PATH:

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

Вышеприведенное является исполняемым; Вот пастбина с комментариями рядом с каждым аргументом, описывающим их (не исполняемый): https://pastebin.com/3G2y0tjm

Обратите внимание на две вещи:

  1. I попытался использовать Pillow ImageMode 'RGB', который, как я предполагал, соответствовал ffmpeg pix_fmt rgb8, но при этом получались поврежденные кадры. Убедитесь, что оба пиксельных формата соответствуют друг другу.

  2. YouTube пожаловался на скорость потоковой передачи ffmpeg быстрее, чем в режиме реального времени (~ 350 к / с в потоке '30 к / с). Возможно, вы захотите каким-либо образом включить функцию сна или что-то в этом роде и настроить ее так, чтобы она соответствовала желаемому fps.

Источники:

...