Я написал следующий сценарий оболочки для создания потоковых трансляций для записи потоков с использованием ffmpeg :
[ -z $1 ] && { echo "No recording device selected!" 2>&1 && exit ; } || DEV=$1
VIDFILE=video/bvid.mkv
AUDFILE=audio/baud.wav
DIM=$(xdpyinfo | grep dimensions: | awk '{print $2;}')
(sleep 10 && echo "Streaming...") &
ffmpeg -nostdin -loglevel panic -f x11grab -s $DIM -i $DISPLAY.0 -c:v libx264 "$VIDFILE" &
ffmpeg -nostdin -loglevel panic -f alsa -i hw:$DEV -c:a libmp3lame "$AUDFILE" &
sleep 1
[ -f $VIDFILE ] && (echo "Created video" 1>&2) || (echo "No video!" 1>&2)
sleep 1
[ -f $AUDFILE ] && (echo "Created audio" 1>&2) || (echo "No audio!" 1>&2)
wait
trap "killall background -s 2" SIGINT
Это создает видео- и аудиофайл, который затем можно использовать для создания потока через make с помощью команды make stream
. Вот Makefile
(обратите внимание, что есть 3-минутный аудиофайл и файл с изображениями, который используется для открытия экрана spla sh):
FULLAUDIO=audio/full.wav
AUDSTART=84
TITLE="Stats Aside:\\nInterpreting\\nProbability"
SIZEW=1920
SIZEH=1080
audio/clip.wav : $(FULLAUDIO)
ffmpeg -ss $(AUDSTART) -i $< -t 6 -af "afade=t=in:st=0:d=3:curve=qsin,afade=t=out:st=3:d=3:curve=qsin" -c:a libmp3lame $@
img/thumb.png : img/bg.png img/ico.png
convert -stroke white -fill white -background black -transparent "#000000" \
-font "URWBookman-Light" -gravity Center -size 928x1080 \
label:$(TITLE) png:- | composite -gravity west -geometry +64+0 - \
img/bg.png $@
convert img/ico.png -transparent "#ffffff" png:- | composite \
-gravity southeast -geometry +32+32 - $@ $@
convert $@ -resize $(SIZEW)x$(SIZEH) $@
video/intro.mp4 : img/thumb.png audio/clip.wav
ffmpeg -i audio/clip.wav -loop 1 -t 6 -i img/thumb.png -vf "fade=t=in:st=0:d=1,fade=t=out:st=5:d=1:c=white,scale=$(SIZEW):$(SIZEH)" -c:v libx264 -c:a libmp3lame $@
ProbabilityInterpretation.mp4 : video/bvid.mkv video/intro.mp4 audio/baud.wav
ffmpeg -i video/intro.mp4 -ss 11 -i video/bvid.mkv \
-ss 10 -i audio/baud.wav \
-filter_complex \
"[1]fade=t=in:st=0:d=1:c=white,scale=$(SIZEW):$(SIZEH)[bvid];\
[2]afftdn=nr=20[baud];\
[0:v][0:a][bvid][baud]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" \
-c:v libx264 -c:a libmp3lame $@
stream : ProbabilityInterpretation.mp4
clean:
-rm ProbabilityInterpretation.mp4
-rm video/intro.mp4
-rm audio/clip.wav
-rm img/thumb.png
veryclean:
make clean
-rm video/bvid.mkv
-rm audio/baud.wav
Из-за задержки между моя веб-камера и то, что появляется на экране, я намеренно запускаю видео и аудио в разное время, чтобы они в конечном итоге могли синхронизироваться c. Однако конечным результатом является видео, которое начинается с одновременной синхронизации видео и звука, но в конечном итоге становится рассинхронизированной c, при этом видео значительно отстает от звука. Вот ссылка на видео с конечным результатом ; он длинный, но обратите внимание, что видео начинается синхронно c и заканчивается несинхронно c. Я, вероятно, также должен отметить, что операционная система находится на виртуальной машине (VirtualBox).
Почему это происходит и что я могу сделать, чтобы предотвратить или исправить?