mp4 파일을 세그먼트로 분할하는 ffmpeg… 첫 번째 세그먼트 이후 오디오가 동기화되지 않음

mp4 파일을 세그먼트로 분할하는 ffmpeg… 첫 번째 세그먼트 이후 오디오가 동기화되지 않음

주의: 제가 잘못했어요이런 질문을 했어요스택오버플로우에서

나는 다음에 표시된 ffmpeg 명령줄을 사용했습니다.이 질문MKV 파일을 오랫동안 완벽하게 분할하려면 이제 분할하고 싶은 일부 MP4 파일이 있는데 처음에는 작동하는 것처럼 보였지만 첫 번째 이후의 모든 후속 세그먼트에는 오디오가 동기화되지 않았습니다! 그리고 몇 초 정도.

키프레임을 강제로 적용해 보았지만(다른 사이트에서 찾은 조언) 도움이 되지 않았습니다.

나는 완전히 다른 프로그램(Avidemux)을 시도했고 적절한 출력으로 파일을 분할할 수 있었지만 ffmpeg를 사용하는 경우 2초 미만이 소요되는 데 비해 3분 이상 걸리는 등 훨씬 더 느렸습니다. Avidemux를 사용하면 분할하려는 i-프레임의 정확한 위치를 결정할 수 있었기 때문에 아마도 이것이 동기화 문제라고 생각하여 정확한 위치(예: 00:12:16 대신 00:12:17.111 또는 00:12:17.111)를 시도했습니다. 어쨌든) 하지만 그것도 도움이 되지 않았습니다.

분할할 때 오디오를 비디오에 올바르게 동기화하기 위해 ffmpeg에 누락된 옵션이 있습니까?

참고 사항: 저는 ffmpeg 2013 버전을 사용하고 있었습니다. 방금 최신 2.6으로 업데이트했지만 문제가 남아 있습니다.

답변1

문서에서 -ss 플래그는 명령의 위치에 따라 다른 작업을 수행합니다.

-ss 위치(입력/출력) 입력 옵션으로 사용되는 경우(-i 이전) 이 입력 파일에서 위치를 찾습니다. 대부분의 형식에서는 정확하게 검색하는 것이 불가능하므로 ffmpeg는 위치 이전에 가장 가까운 검색 지점을 검색합니다. 트랜스코딩 및 -accurate_seek가 활성화되면(기본값) 탐색 지점과 위치 사이의 이 추가 세그먼트가 디코딩되어 삭제됩니다. 스트림 복사를 수행하거나 -noaccurate_seek를 사용하면 보존됩니다.

출력 옵션(출력 파일 이름 앞)으로 사용되는 경우 타임스탬프가 해당 위치에 도달할 때까지 입력을 디코딩하지만 입력을 삭제합니다.

위치는 초 단위 또는 hh:mm:ss[.xxx] 형식일 수 있습니다.

따라서 자신의 대답에 따르면 첫 번째 명령은 출력에 논리를 적용하고 두 번째 명령은 논리를 입력에 적용합니다.

답변2

왜 그런지는 잘 모르겠지만 문제는 매개변수 순서였습니다.

연결된 예에서 명령은 다음과 같습니다.

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

물론 avi 대신 mp4를 사용하고 있지만 그 외에는 위와 똑같이 명령을 입력했고 (mp4 사용 시) 오디오 결과가 동기화되지 않았습니다. 실수로 이 "수정"을 발견했습니다... 대신에 다음 명령을 입력하면:

ffmpeg -ss 00:30:00 -i input.mp4 -vcoded copy -acodec copy -t 00:30:00 output2.mp4

동기화 문제가 발생하지 않습니다. 왜? 몰라. 하지만 작동합니다. 확인하기 위해 몇 번 시도했지만... 해당 매개변수 순서만 변경하면 문제가 해결됩니다.

관련 정보