Я пытаюсь наложить два видео с разным временем начала и смешать их звуковые дорожки.
Эти входные файлы представляют собой записи WebRTC, и каждый из них содержит одну аудио- или видеодорожку.
Входные данные:
RTc0.webm
: аудио, Opus 40k, время начала 9.078 сек.RT5f.webm
: аудио, Opus 40k, время начала 1.262 сек.RT8c.mkv
: видео, H.264, время начала 9.078 сек.RTf7.mkv
: видео, H.264, время начала 1,298 сек.
Я хочу разместить эти видео рядом и смешать их звук.
Первая попытка, используя-copyts
Моя первая мысль была использовать-copyts
и просто позвольте всему синхронизироваться, используя их общий временной код.
Моя командная строка выглядит так:
ffmpeg \
-copyts \
-ss 224.1 -i RTc0.webm -t 60 \
-ss 224.1 -i RT5f.webm -t 60 \
-ss 224.1 -i RTf7.mkv -t 60 \
-ss 224.1 -i RT8c.mkv -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[2:v] scale=640x480 [left];
[3:v] scale=640x480 [right];
[background][left] overlay [background+left];
[background+left][right] overlay=x=640 [vout];
[1:a][0:a] amix [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska combined.mkv
Запустив это, я получаю вывод, где видео правильное (одно видео начинается с 0 сек, другое начинается на 7 секунд позже), но обе аудиодорожки начинаются с 0 сек. Ожидаемое поведение — одна аудиодорожка начинается с 0 сек, а другая начинается на 7 секунд позже, синхронизированная со второй видеодорожкой.
Вторая попытка, с использованием -itsoffset
иasetpts
Я также пробовал использовать -itsoffset
для сдвига видеодорожек. Это сработало, но -itsoffset
ничего не дало для моих аудиодорожек. Это имело странные эффекты, иногда, ставя его для одной, сдвигало их обе во времени.
ffmpeg \
-ss 0.00000000 -itsoffset 0 -i RTf7.mkv -t 60 \
-ss 0.00000000 -itsoffset 7.781 -i RT8c.mkv -t 60 \
-ss 0.00000000 -itsoffset 7.816 -i RT5f.webm -t 60 \
-ss 0.00000000 -itsoffset 0 -i RTc0.webm -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[0:v] scale=640x480 [left];
[1:v] scale=640x480 [right];
[background][left] overlay=shortest=1 [background+left];
[background+left][right] overlay=shortest=1:x=640 [vout];
[2:a][3:a] amix=inputs=2:duration=longest [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska combined.mkv
Затем я попробовал использоватьasetpts
фильтрчтобы сместить звуковую дорожку, чтобы сохранить выравнивание, но это не сработало. Команда asetpts=PTS+(7.816/TB)
была просто проигнорирована:
ffmpeg \
-copyts \
-ss 0 -i RTc0.webm -t 60 \
-ss 0 -i RT5f.webm -t 60 \
-ss 0 -itsoffset 0 -i RTf7.mkv -t 60 \
-ss 0 -itsoffset 7.781 -i RT8c.mkv -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[2:v] scale=640x480 [left];
[3:v] scale=640x480 [right];
[background][left] overlay [background+left];
[background+left][right] overlay=x=640 [vout];
[1:a] asetpts=PTS+(7.816/TB), [0:a] amix [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska segment_0.mkv
Что я делаю не так?
решение1
Фильтр amix синхронизирует все входы, чтобы они начинались одновременно. Обратный путь — пропустить -ss
для аудиовходов, применить aresample=async=1,atrim=225.398
к каждому аудиовходу, а затем amix эти отфильтрованные потоки.
225.398
is 224.1+1.298
- ваше ss
значение + время начала более раннего видеопотока. Я использовал значение видеопотока, так как соответствующее аудио начинается раньше, поэтому вы можете потерять синхронизацию, если использовали его значение.