시작 시간이 다른 두 개의 비디오를 오버레이하고 오디오 트랙을 함께 믹싱하려고 합니다.
이러한 입력 파일은 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
각 오디오 입력에 적용한 다음 필터링된 스트림을 믹싱하는 것입니다.
225.398
is 224.1+1.298
- 귀하의 ss
값 + 이전에 시작하는 비디오 스트림의 시작 시간입니다. 해당 오디오가 더 일찍 시작되므로 비디오 스트림 값을 사용했기 때문에 해당 값을 사용하면 동기화가 끊어질 수 있습니다.