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

Эти входные файлы являются записями 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 ответ1

2

Фильтр amix синхронизирует все входы для одновременного запуска. Обходной путь - пропустить -ss для аудиовходов, применить aresample=async=1,atrim=225.398 к каждому аудиовходу и затем смешать эти отфильтрованные потоки.

225.398 - это 224.1+1.298 - ваше значение ss + время начала предыдущего видеопотока. Я использовал значение видеопотока, так как соответствующий звук запускается раньше, поэтому вы можете потерять синхронизацию, если используете его значение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .