Потоковая передача с FFMpeg: Splashscreen?

Я экспериментировал с потоковой передачей через FFMpeg. Я люблю, насколько мощный это! В настоящее время у меня есть настроенный так, чтобы это передало мой экран потоком и добавило наложение для моей веб-камеры. Хотя, существует одна вещь, что я хотел бы смочь сделать это, я просто не могу вполне выяснить: Подбросьте экран-заставку по запросу.

Возможно, это было бы лучше объяснено через пример. Скажите потоковую передачу игры или чего-то через Подергивание долгое время. Затем необходимо ступить далеко. Вы могли

  1. Просто уйдите, или
  2. Подбросьте "Скоро вернуться!" экран-заставка или что-то, возможно, с небольшой музыкой (мне выяснили ту часть благодаря великолепию Pulseaudio),

Я изобразил лучший способ выполнить, это было через второе наложение, которое накладывает наложение экрана/веб-камеры.

Я попытался добавить, что треть ввела сродни этому:

 ffmpeg -f v4l2 -i /dev/video0 -f xllgrab -i :0.0+738,0 \
        -i ~/splashscreen.png -loop 1 \
        -filter_complex "[0:1][0:0]overlay=0:0[out];[out][2:0]overlay=0:0[final]" \
        -f flv ~/Videos/test.flv 

Это требует более новой версии ffmpeg, чем находится в Дерзком repos.

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

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

Если существуют какие-либо ffmpeg гуру там, я хотел бы услышать некоторые идеи!

1
задан 8 January 2016 в 05:29

1 ответ

Я сделал это! Предоставленный, требовались некоторые перевороты назад, но тем не менее это работает =D

Вот сценарий, который я использовал:

#!/bin/bash

#NOTE: The framerate throttling can probably be removed due to the limit in
#the amount of data that can be written to a pipe before it blocks. My
#streams are at 1920x1080 and cat only puts 5 frames onto the pipe
#before it hangs waiting for a program to tread the pipe. I found this odd
#since my splash screen images were only 8k, whereas the pipe size is 1M.
#Therefore, it might be highly dependent on the resolution of your splash
#images. By removing the FPS logic of this script, a higher potential
#framerate can be achieved by the script if that's necessary.

#This is my third FFMpeg input. My other two are at framerates of
#10 (screen) and 30 (webcam). My output is 10 FPS. I had originally
#set this to 10 as well, but it caused FFMpeg to choke and start dropping
#frames for some reason, so I just added 5 since it's a common denominator
#of both 10 and 30. +2 may have also worked, but that seemed a little too
#close for me since even 11 had issues with output framerate, hovering
#around 9.9 FPS rather than the target 10 FPS.

framerate=15

#Tracks how many frames we've written this second
files_this_second=0
this_second=$(date +%s)

while [ 1 ]
do
  #Haven't written all the frames for this second
  if [ $files_this_second -lt $framerate ]
  then
    if [ ! -f /file/to/test/to/throw/up/splash ]
    then
      #Output the transparent "splash screen" (no splash screen)
      cat /path/to/a/transparent.png
    else
      #Output the splash screen
      cat /path/to/a/splashscreen.png
    fi
    files_this_second=$(($files_this_second + 1))
  else
    #The second has changed
    if [ "$(date +%s)" != "$this_second" ]
    then
      this_second=$(date +%s)
      files_this_second=0
    fi
  fi
done

Я могу затем подать вывод этого сценария в FFMpeg как так:

splash.sh | ffmpeg -f image2pipe -vcodec png -framerate 15 -i - (some other video source and parameters) -filter_complex "[1:0]setpts=PTS-STARTPTS[video];[0:0]setpts=PTS-STARTPTS[splashscreen];[video][splashscreen]overlay=0:0" (output format options and file)

Затем я настроил горячую клавишу для запущения другого простого скрипта:

#!/bin/bash

if [ -f /file/to/test/to/throw/up/splash ]
then
  rm /file/to/test/to/throw/up/splash
else
  touch /file/to/test/to/throw/up/splash
fi

Когда я хочу подбросить экран-заставку, я поразил горячую клавишу. Когда я хочу удалить его, я поразил горячую клавишу снова.

Это полезно для нескольких вещей:

  1. Экран-заставка (как упомянуто)
  2. Очищение экрана при вводе паролей или чего-то

Это также обходит проблему изображений, кэшируемых как в моем вопросе выше, таким образом, необходимо было бы просто заменить изображение другим для установки другого экрана-заставки.

Я думаю, что это является блестящим! Что делает Вас, парни думают?

Примечание: Я использую самоскомпилированную версию FFMpeg, потому что одно доступное в Дерзких репозиториях довольно устарело. Кроме того, image2pipe формат не документирован, который я могу найти.

3
ответ дан 7 December 2019 в 12:52

Другие вопросы по тегам:

Похожие вопросы: