Я экспериментировал с потоковой передачей через FFMpeg. Я люблю, насколько мощный это! В настоящее время у меня есть настроенный так, чтобы это передало мой экран потоком и добавило наложение для моей веб-камеры. Хотя, существует одна вещь, что я хотел бы смочь сделать это, я просто не могу вполне выяснить: Подбросьте экран-заставку по запросу.
Возможно, это было бы лучше объяснено через пример. Скажите потоковую передачу игры или чего-то через Подергивание долгое время. Затем необходимо ступить далеко. Вы могли
Я изобразил лучший способ выполнить, это было через второе наложение, которое накладывает наложение экрана/веб-камеры.
Я попытался добавить, что треть ввела сродни этому:
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 гуру там, я хотел бы услышать некоторые идеи!
Я сделал это! Предоставленный, требовались некоторые перевороты назад, но тем не менее это работает =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
Когда я хочу подбросить экран-заставку, я поразил горячую клавишу. Когда я хочу удалить его, я поразил горячую клавишу снова.
Это полезно для нескольких вещей:
Это также обходит проблему изображений, кэшируемых как в моем вопросе выше, таким образом, необходимо было бы просто заменить изображение другим для установки другого экрана-заставки.
Я думаю, что это является блестящим! Что делает Вас, парни думают?
Примечание: Я использую самоскомпилированную версию FFMpeg, потому что одно доступное в Дерзких репозиториях довольно устарело. Кроме того, image2pipe формат не документирован, который я могу найти.