Первая попытка, используя-copyts

Первая попытка, используя-copyts

Я пытаюсь наложить два видео с разным временем начала и смешать их звуковые дорожки.

Эти входные файлы представляют собой записи 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.398is 224.1+1.298- ваше ssзначение + время начала более раннего видеопотока. Я использовал значение видеопотока, так как соответствующее аудио начинается раньше, поэтому вы можете потерять синхронизацию, если использовали его значение.

Связанный контент