컴퓨터와 잡동사니 자료

FFmpeg 합치기 중 DTS 오류는 어떻게 최소화해야 하는가.

K66Google 2019. 7. 16. 14:28

"Non-monotonous DTS in output stream 0:0; previous..."


동영상을 합치면서 이러한 오류가 몇 백개씩 뜨는 걸 자주 보았다. timestamp가 어쩌구 저쩌구 하는데 팟플레이어로 열면 잘 재생되다가 마지막 동영상 파트로 넘어가면 화면이 빨라지는 등 제대로 재생되지 않았다. 그렇다면 어떻게 해야 DTS 오류를 최소화하고 정상 재생이 되게끔 합칠 수 있는 것일까.



Stackoverflow의 한 게시물에서 이를 수정하기 위한 방안을 찾을 수 있었다. (링크)

이 방법을 정리해서 블로그에 다시 작성하자면 이렇다.



* DTS 오류 최소화 하는법


1. 합칠 동영상을 준비한다. 이때 합쳐야 할 동영상들의 비디오 코덱과 오디오 코덱은 동일해야 한다.

예를 들어서, 합칠동영상1.mp4 / 합칠동영상2.mp4 파일을 합쳐야 한다고 가정해보자.



2. FFmpeg 폴더의 탐색기 주소 창에 cmd를 치고 열린 명령 프롬프트에 다음과 같이 입력한다.


ffprobe "합칠동영상2.mp4"

합치는 영상들 중 마지막 파트의 영상 파일명을 입력해야 한다.


그럼 이런 식으로 합칠동영상2의 tbn 값을 알아낼 수 있다. 11988이다.



3. 이제 마지막 파트 영상의 tbn 값을 나머지 파트의 영상에도 적용해야 한다. 다음과 같이 입력한다.


ffmpeg -i "합칠동영상1.mp4" -video_track_timescale 11988 -vcodec copy -acodec copy "합칠동영상1_fix.mp4"

이렇게 하면 tbn 값이 11988로 바뀐 합칠동영상1_fix 영상이 생성된다.

3개 이상의 영상을 합칠때도 마지막 파트 영상을 제외한 나머지 파트 영상들에게 모두 이 작업을 해줘야 한다.



4. 다 했으면 txt 파일로 합칠 파일들을 지정하고 합치기 명령어를 실행하면 된다.


* 메모장 (merge.txt)

file './merge/합칠동영상1_fix.mp4'

file './merge/합칠동영상2.mp4'


* cmd 명령어

ffmpeg -f concat -safe 0 -i ".\merge.txt" -c copy "출력파일명.mp4"

합칠 파일을 지정할때 마지막 파트가 아닌 영상들은 원본이 아닌 tbn값을 바꾼 수정본을 지정해야 한다는 점에 유의한다.

이렇게 하고 명령을 실행하면 DTS 오류가 몇 백 개씩 나오던게 1~2개 정도로 최소화되고 팟플레이어에서 영상도 정상적으로 출력될 것이다.

그럼 이만...