ffmpeg аудио и видео постепенно go рассинхронизируется c при записи с помощью сценария оболочки и сделать - PullRequest
0 голосов
/ 06 августа 2020

Я написал следующий сценарий оболочки для создания потоковых трансляций для записи потоков с использованием 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).

Почему это происходит и что я могу сделать, чтобы предотвратить или исправить?

...