mp4 스트림 복사+구간설정해서 영상들 자르고 있는데,
시작시간, 종료시간 모두 i프레임 맞춰서 컷하다가
시작시간만 i프레임에 맞추고, 종료시간은 프레임과 무관하게 제가 원하는 시간에 맞춰서 컷해봤는데 거의 동일하게 나오네요.
(거의=0.0x초단위까지는 아닌듯하나 최소한 0.x초 단위까지는 의도한대로 나온다는 것)
우연이라고 하기에는 여러 개를 테스트해도 동일합니다.
종료시간 프레임 일일이 안 맞춰도 되서 편하긴한데.. 왜 이런 걸까요?
자르는 종료 시점 기준으로, 디코딩할 수 있는 데까지 재생하고 (대개 P 프레임까지), 종료 시점보다 앞서지만 디코딩 불가능한 나머지 B프레임들이 있다면 재생시 무시됩니다. 그런데 H.264의 경우 대부분 P프레임들 사이의 연속된 B프레임들 숫자가 그다지 많기 않기 때문에 (가령 M=3 이라면 최대 2개) 재생되지 않는 프레임들이 있더라도 시점 차이가 무시할 만하기 때문에 깔끔하게 잘리는 것처럼 보이는 거죠.
이와 반대로 앞부분은, 자르는 시작 지점이 디코딩 가능하도록 그 앞의 참조 프레임들까지 전부 딸려옵니다. 그래서 시작 지점을 포함한 GOP의 I 프레임 또는 IDR 프레임에서 잘리게 되죠. 자르는 시작 지점 설정에 따라 그 구간 차이가 GOP 사이즈만큼 커질 수도 있기 때문에 (H.264에서 N=12라면 11까지 가능) 재생되지 않는 프레임들이 많이 남아서 시점 차이가 커질 수 있습니다. 그래서 깔끔하게 자르려면 앞부분을 반드시 I 프레임 또는 IDR 프레임에서 자르라고 권고하는 겁니다.
근데 사실 이것도 원본과 코덱에 따라 다릅니다. H.264 같이 GOP 구조가 비교적 단순한 코덱에서는 위에 설명한 대로 끝이 나름 깔끔하게 잘 잘라지는 경우가 많긴 한데, HEVC 같이 open GOP에 GOP 구조가 복잡한 경우엔 해당 GOP가 어떤 구조냐에 따라 복불복이 됩니다. 그래서 원본이 HEVC인 경우엔 웬만하면 스트림 복사 컷을 안 하는 게 정신건강에 좋습니다.