쇼츠 배경음이 매 바퀴 뚝 끊기던 문제
쇼츠 배경음은 영상 끝에서 다시 처음으로 돌아갑니다. 영상 안에서는 자연스럽던 음악도 이 지점에서 소리가 끊기면 반복 재생이라는 사실이 바로 드러났는데 48초짜리 앰비언트 음원을 55.55초 영상에 넣었을 때는 영상 끝보다 먼저 48초 지점에서 배경음이 되돌아갔습니다.
처음에는 음원을 그냥 반복하면 될 줄 알았지만, 짧은 음원을 이어 붙인 지점과 영상의 마지막 지점은 별개였고 음량까지 제각각이라 비율만 낮춘 파일은 거의 들리지 않았습니다. 원인은 음악 파일 하나가 아니라 음량 측정, 채널 형식, 루프 끝 처리가 맞물린 과정에 있었습니다.
먼저 결론부터
- 배경음은 원본 음량을 먼저
loudnorm으로 맞춘 뒤에 줄였습니다. -47dB RMS 파일에 비율만 곱했을 때는 -72dB까지 내려갔습니다.
ffmpeg -i input.wav -af "loudnorm=I=-16:TP=-2.0:LRA=11" normalized.wav
- 필요한 길이보다 2.5초 길게 준비하고, 꼬리 2.5초와 머리 2.5초를 겹쳐 섞었습니다.
- 합성 음성과 룸톤을 이어 붙이기 전에는 모두 44100Hz 스테레오로 변환했습니다.
ffmpeg -i input.wav -ar 44100 -ac 2 output.wav
- 영상은 다시 렌더하지 않았습니다. 영상 스트림은
-c:v copy로 복사하고, 오디오만 192k AAC로 다시 넣었습니다. - 음량은 -18, -14, -10 단계 파일을 같이 만들어 놓고 들었습니다. 한 단계씩 바꾸는 방식보다 차이가 훨씬 빨리 들렸습니다.
비율을 곱하기 전에 기준 음량을 만들었습니다
Freesound에서 받은 앰비언트 음원은 -47dB RMS였는데 이 파일을 다른 배경음과 같은 방식으로 줄이자 거의 소리가 나지 않았고 확인해 보니 -72dB까지 내려가 있었습니다.
비율은 기준이 아닙니다. 원본이 이미 작은 파일이라면 같은 비율을 적용해도 결과가 달라집니다. 먼저 loudnorm=I=-16:TP=-2.0:LRA=11으로 기준점을 만든 뒤에 원하는 만큼 줄이는 순서로 바꿨습니다.
ffmpeg -i input.wav -af "loudnorm=I=-16:TP=-2.0:LRA=11" normalized.wav
정규화 뒤에는 음량 차이를 들으며 결정했습니다. -18, -14, -10 파일을 한꺼번에 뽑아 놓고 같은 영상에 붙였습니다. 앞 파일을 오래 듣고 다음 파일을 들으면 귀가 먼저 들은 음량에 적응합니다. 파일을 나란히 놓고 번갈아 들었습니다.
루프 끝은 시작 소리와 섞었습니다
55.55초짜리 쇼츠에 48초 음원을 넣으면 음악이 중간에서 다시 시작합니다. 단순 반복이 자연스러운 경우는 음원의 끝과 시작이 맞아떨어질 때뿐입니다. 앰비언트 음원은 끝의 잔향과 시작의 공기감이 다릅니다. 반복 지점이 바로 들렸습니다.
처리는 길이를 조금 더 확보하는 방식으로 했습니다. 필요한 길이보다 2.5초 길게 자르고 마지막 2.5초를 처음 2.5초 위에 올려 섞었습니다. 결과 파일 길이는 영상 길이로 맞아도 끝부분에는 이미 시작 소리가 들어갑니다.
고리가 닫혔습니다.
음원이 짧을 때는 먼저 이어 붙일 재료를 만듭니다. 이때 단순히 같은 파일을 여러 번 나열해도 중간 이음새는 그대로입니다. 다만 마지막에 넣는 크로스페이드가 그 구간까지 덮도록 잡으면 음원 길이보다 긴 쇼츠에서도 반복 지점이 덜 드러납니다.
56초짜리가 31초로 잘린 적이 있습니다
합성 API에서 받은 음성은 모노였고 따로 만든 룸톤은 스테레오였는데 이 파일들을 목록으로 이어 붙였더니 예상한 56초 대신 31초짜리 결과가 나왔습니다.
처음에는 합성 요청이 덜 끝났다고 생각해 요청 결과와 파일 생성 순서를 다시 봤지만 빠진 조각은 없었습니다. 원인은 concat 단계에서 형식이 맞지 않는 조각이 빠진 일이었습니다. 오류가 크게 보이지 않아 더 오래 돌아갔습니다.
이후에는 이어 붙이기 전에 모든 파일을 같은 형식으로 바꿨습니다.
ffmpeg -i voice.wav -ar 44100 -ac 2 voice-stereo.wav
ffmpeg -i roomtone.wav -ar 44100 -ac 2 roomtone-stereo.wav
목록 파일의 경로도 한 번 막혔던 부분입니다. 작업 폴더를 기준으로 경로를 적었지만 ffmpeg가 찾는 기준은 목록 파일이 놓인 위치입니다. 목록 파일을 옮긴 뒤에는 모든 파일을 못 찾았습니다. 경로 문제였습니다. 합성 결과 문제는 아니었습니다.
영상은 건드리지 않고 소리만 교체했습니다
Remotion으로 만든 영상은 1,665장을 헤드리스 크롬에서 렌더합니다. 이 과정은 4~5분입니다. 배경음 크기나 루프 지점만 바꾸는데 영상 전체를 다시 만들면 소리 확인보다 렌더 대기 시간이 길어집니다.
그래서 완성된 영상에서는 영상 스트림을 복사했고 -c:v copy로 화면은 그대로 두고 새로 만든 루프 배경음과 음성을 넣은 오디오만 192k AAC로 인코딩했습니다. 이 작업은 렌더보다 훨씬 짧게 끝납니다.
이 흐름으로 바꾸니 확인 과정도 달라져서 음악이 작으면 정규화 뒤 음량 파일만 다시 만들고 루프가 어색하면 2.5초 겹침 구간만 조정했습니다. 프레임 1,665장을 다시 그릴 이유가 없었습니다.
마무리
이번에는 배경음을 영상 길이에 맞춰 자르는 일보다 반복될 끝을 시작과 섞는 일이 더 오래 걸렸습니다. 특히 48초 음원을 55.55초 영상에 그대로 넣었을 때처럼 중간에서 되돌아가는 경우는 영상 끝만 확인해서는 발견되지 않았습니다.
음량이 안 들리면 먼저 원본의 -47dB RMS 상태를 봤고 조각이 사라지면 44100Hz와 스테레오 여부를 확인했습니다. 56초가 31초가 된 사례처럼 결과 길이 자체가 달라졌을 때는 루프 계산보다 결합 형식부터 확인했습니다.