Можно ли приостановить аудио и видео в течение периода наложения? После того, как аудио приостановлено, можно ли добавить новую звуковую дорожку только в течение этого интервала? оставшееся время исходного аудио должно воспроизводиться.
Например,
Я использую ffmpeg для наложения нескольких изображений в видео с помощью указанной ниже команды:
ffmpeg -i 2.mp4 -i gloves.png -i socks.png -filter_complex "[1:v]scale=320:240 [ovrl]; [0:v][ovrl]overlay=y=Hh:enable='between(t,3,8)'[v1];[2:v]scale=320:240 [ovrl1];[v1][ovrl1]overlay=y=Hh:enable='between(t,15,20)'[v2]" -map "[v2]" -map 0:a -c:a копировать outputVideo.mp4
Теперь мне нужно приостановить видео и звук на 3–8 секунд и воспроизвести новый звук в течение этих 3–8 секунд, а затем продолжить воспроизведение старого звука в течение оставшегося времени.
Пожалуйста, помогите мне с этим.
решение1
Чтобы приостановить аудио и видео, вы можете либо loop
запустить потоки, либо сместить PTS.
Циклические потоки
loop=loop={len_frames}:size=1:start={pos_frames},setpts=N/FRAME_RATE/TB
Здесь {len_frames}
— длина цикла в кадрах, а {pos_frames}
— позиция паузы в кадрах. Вы можете рассчитать эти числа, получив частоту кадров видео и умножив ее на выбранную длину и временную метку в секундах.
То же самое касается аудиочасти, для которой вам нужно использовать aloop
и asetpts
, соответственно, и частоту дискретизации в Гц. Кроме того, вам нужно отключить звук, установив volume=0
.
Зацикленные видео- и аудиопотоки будут длиннее оригиналов, и вы затем сможете отобразить наложение на них.
Поскольку такие команды довольно сложны в составлении, я написалПрограмма на Pythonкоторый вставляет индикатор «буферизации» во время паузы видео и аудио. Вы можете проверить, как генерируются команды циклаздесь.
Смещение для PTS
См. Gyan'sответь здесь, который по сути делает:
setpts='PTS+gte(T\,{start_time})*({shift}/TB)'
в сочетании с -vsync vfr
, где {start_time}
— время смещения кадров, а {shift}
— примененный сдвиг.
Сдвиг звука
Что касается воспроизведения звука в течение определенного временного интервала, вы можетеиспользуйте -itsoffset
опцию вводачтобы компенсировать его начало.
Или вы смещаете PTS аудиопотока на фиксированную величину с помощью фильтра asetpts
.