기술 · 실용 가이드
FFmpeg concat에서 DTS 비단조 경고가 나오나요? 결과를 채택하기 전에 패킷 시간 점검하기
스트림 복사 연결이 성공해도 모든 디코딩 프레임을 보존한 채 재생 시간이 줄 수 있습니다. 복구 방법을 고르기 전에 스트림 조건, 구간 길이, 두 타임스탬프를 비교하세요.

FFmpeg의 비단조 DTS 경고만으로 프레임이 삭제됐다고 판단할 수는 없습니다. 명령이 성공적으로 종료됐다고 결과가 올바른 것도 아닙니다. 연결 작업은 디코딩된 그림 내용을 보존하면서 잘못된 재생 시간축을 배정할 수 있습니다.
입력, concat 목록, 전체 명령과 로그부터 보존하세요. 경고가 가리키는 실제 스트림을 확인하고 스트림 조건 불일치, 잘못된 구간 길이, 실제 타임스탬프 누락을 구분합니다. 작업 복사본을 교체하기 전에 내용과 시간을 별도 결과로 검증하세요.
증거를 보존하고 실제 스트림 확인하기
원본 클립은 바꾸지 말고 실험 결과를 새 출력 이름에 저장하세요. 전체 FFmpeg 버전, concat 목록, 명령, stderr, 스트림 매핑을 남깁니다. 경고의 출력 인덱스는 매핑을 따릅니다. 0:1이 항상 오디오라고 가정하거나 첫 비디오만 조사하지 않습니다.
각 입력에 ffprobe -v error -show_streams -show_format -of json input.mp4를 실행하고 실제 경로로 바꾸세요. 대응 스트림 수와 종류, 코덱, time_base, 화면 크기, 픽셀 형식, 샘플링 속도와 채널 구성을 비교합니다. 추가 오디오, 자막, 데이터는 의도적으로 보존하세요. 자동 선택으로 명령이 성공했다고 필요한 모든 스트림이 포함됐다는 증거는 아닙니다.
타임스탬프 플래그 전에 경계 찾기
문제 비디오에 ffprobe -v error -select_streams v:0 -show_packets -show_entries packet=pts_time,dts_time,duration_time -of json input.mp4를 실행하고 a:0 또는 실제 해당 스트림도 따로 살핍니다. JSON은 얻을 수 없는 값을 생략할 수 있습니다. 이를 0이 아닌 미상으로 기록하고 다른 시간 기준의 원시 카운트 대신 시간 필드를 비교하세요.
관련 마지막 패킷과 concat의 duration, inpoint, outpoint 지시문을 확인합니다. 디멀티플렉서는 길이를 이용해 다음 파일을 이동시킵니다. 조건이 일치해도 추정 길이가 다음 구간을 너무 일찍 배치할 수 있습니다. 프레임 간 압축 영상의 절단도 요청 경계 주변의 추가 패킷을 내보낼 수 있습니다. 컨테이너 표기 길이를 정확한 편집 지점이라고 단정하지 않습니다.
누락된 시각과 기존의 잘못된 시간축 구분하기
현재 형식 문서는 +genpts를 디코딩 타임스탬프가 있을 때 누락된 표시 타임스탬프를 생성하는 옵션으로 정의합니다. PTS와 DTS를 각각 검사하세요. DTS만 표시한 보고서의 N/A는 PTS 부재를 입증하지 않습니다. 필드 누락이나 기존 역행만으로 보편적인 복구 명령을 도출할 수도 없습니다.
avoid_negative_ts 역시 시각을 이동시킬 뿐 시간 기준 호환이나 올바른 연결 길이를 입증하지 않습니다. 로그 수준을 낮춰 경고를 숨기면 가시성만 달라집니다. 플래그를 시험한다면 원래 로그를 보존하고 결과 패킷 시간, 길이, 필요한 내용을 기준과 비교하세요.
측정된 복구와 적용 범위 확인하기
측정 증거가 concat 길이만 잘못됐음을 보여 준다면 복사본에서 수정한 duration을 시험합니다. 경고를 없애려고 숫자를 만들지 마세요. 스트림이 호환되지 않으면 호환 복사본을 준비하거나 디코딩 concat 필터와 재인코딩을 사용합니다. 대응 스트림과 0에서 시작하는 구간 시각이 필요하며 해상도는 명시적으로 맞춰야 합니다.
동기화된 영상과 오디오를 함께 처리합니다. 필터는 마지막이 아닌 각 구간의 가장 긴 스트림 길이를 사용하고 짧은 오디오에 무음을 채울 수 있습니다. 다른 프레임 속도는 가변 프레임 속도 출력이 될 수 있으니 의도한 결과를 선택하세요. 과거 한 사용자의 MKV 성공은 그 사례의 증거이며 컨테이너 변경이 모든 입력을 고친다는 보장은 아닙니다.
내용과 재생 시간을 따로 검증하기
Ubuntu FFmpeg 6.1.1에서 격리된 비디오 전용 사례 네 가지를 시험했습니다. 2초 H.264 클립 둘은 정상적으로 4초가 됐습니다. 첫 duration을 0.5초로 설정하면 37개 경고와 2.5초 출력이 나왔으며 +genpts를 추가해도 같았습니다. 별도 시간 기준 불일치에서는 50개 경고와 1.967031초 출력이 나왔습니다. 모두 종료 코드 0이었고 순서 있는 100개 디코딩 프레임 해시가 일치했습니다.
이 합성 실험은 독자의 클립, 오디오, 자료 누락을 재현하지 않습니다. SWGDE는 디코딩 프레임과 샘플 해시를 내용 확인 방법으로 설명하지만 시간 열은 따로 비교해야 합니다. 실제 결과의 이음새, 알아볼 수 있는 시작과 끝 내용, 동기화와 의도한 전체 길이를 확인하세요. 해시 일치나 경고 없는 인코딩만으로 재생 시간의 정확성을 인증하거나 원본에 없는 바이트를 복구할 수는 없습니다.
