ffmpeg 오디오 싱크 문제

최근 게임 플레이 영상 녹화를 자주 하면서 mp4 영상을 쉽게 자르는 방법을 찾아보니 ffmpeg의 기본 기능을 이용하는 것이 제일 간편하다는 사실을 알게 되었습니다. 그리고 구글 검색을 통해 한 블로그에서 아래의 명령줄을 발견하게 되었습니다. 참고로 이건 windows powershell에서 쓰는 명령어이고, cmd에서는 처음 부분이 ./ffmpeg.exe가 됩니다.

.\ffmpeg.exe -i input_file -ss starting_point -t duration -vcodec copy -acodec copy output_file

이렇게 하면 입력된 파일에서 시작 위치로부터 지정된 시간 동안의 영상을 출력 파일로 저장할 수 있습니다. 그런데 가끔 오디오 싱크가 안맞게 되는 현상이 벌어집니다. 해당 영상을 하나 보여드리려고 하였더니, 유튜브에서는 정상으로 나오더군요. 그래서 오디오 싱크가 안맞는 영상을 여러 플레이어를 통해 테스트해보니 어떤 경우에는 안맞고, 어떤 경우에는 잘 맞는 현상이 벌어졌습니다. 그래도 여전히 찝찝합니다. 일단 오디오가 어긋난 파일의 영상을 재녹화하여 업로드하였습니다.

오디오가 싱크가 안맞는 근본적인 이유를 알아보았더니 그 이유는 바로 명령어 체계를 잘못 이해하고 있었기 때문입니다. -ss 옵션은 입력과 출력 파일 모두에 적용할 수 있는데, 앞서 적은 명령줄은 출력 파일에 대해서 지정된 옵션이었던 것이죠. ffmpeg documentation에 보면 아래와 같이 나와 있습니다. 입력, 출력 파일에 적용시에 -ss옵션이 미묘하게 다르게 작용합니다.1

-ss position (input/output)

When used as an input option (before -i), seeks in this input file to position. Note that in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position. When transcoding and -accurate_seek is enabled (the default), this extra segment between the seek point and position will be decoded and discarded. When doing stream copy or when -noaccurate_seek is used, it will be preserved.

When used as an output option (before an output url), decodes but discards input until the timestamps reach position.

 

입력 파일 기준으로 설정을 하여야 오디오 싱크 문제가 발생하지 않는다는 것을 발견하였고, 그 경우에 올바른 명령줄은 다음과 같아야 합니다.2

.\ffmpeg.exe -ss starting_point -i input_file -t duration -vcodec copy -acodec copy output_file

이렇게 만들어진 결과물을 다시 한 번 확인해 보면 이번에는 문제가 발생하지 않는다는 것을 알 수 있습니다.

특이하게도 영상이 짧거나, 어떤 경우에는 오디오가 잘 맞는 것처럼 보이지만 사실은 mp4 출력 파일에서의 seek 포인트가 우연히 맞거나 가까워서일 뿐이고 정상적인 결과물을 언제나 원한다면 후자와 같이 옵션을 입력 파일에 주는 것이 맞습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *