
나는 다음을 사용하여 절단 및 접합에 대해 읽었습니다.연결하지만 이것만으로는 충분하지 않습니다.
표시된 비디오 부분을 잘라서 다시 인코딩하지 않고 하나의 비디오 파일로 합치고 싶습니다. 한 번에 잘라내기와 병합(메모리 내)이 가능합니까?
잘라내거나 결합할 비디오 부분 수에는 이론적 제한이 있어서는 안 됩니다. 오디오는 동기화되어야 합니다.
비디오: H.264+AAC
편집하다:
답변을 통해 비디오 재인코딩이 여전히 필요하다는 것을 알게 되었습니다.
비디오 파일 중간에서 비디오 클립을 자르는 작업은 여러 단계를 거쳐 수행될 수 있다는 점을 분명히 하고 싶습니다. I/O 활동을 일부 저장하면 한 번에 비디오를 처리하는 것이 성능 측면에서 현명할 것이라고 생각했습니다. 그러나 그것은 그 자체로 목적이 아니다.
답변1
귀하의 질문이 맞다면 다음과 같은 네 가지 주요 부분으로 구성됩니다.
- 영화에서 시간 부분을 자르는 방법
- 여러 세그먼트를 병합하는 방법
- 영화를 트랜스코딩하지 않고 품질 저하 없이 위의 작업을 수행하는 방법
- 위의 작업을 속도 측면에서 효율적으로 수행하는 방법
시간 세그먼트 자르기
옵션을 사용하여 시작점으로 건너뛴 후 를 사용 -ss
하여 세그먼트 지속 시간을 설정하거나 -t
다음을 사용하여 끝점을 설정하여 세그먼트를 잘라낼 수 있습니다 -to
.
# skip 30 seconds, then copy the next 60 seconds
ffmpeg -ss 30 -t 60 full-movie.mp4 segment.mp4
ffmpeg 문서에서 섹션을 참조하세요.5.4 주요 옵션입력 파일 앞이나 출력 파일 앞에 -ss
및 옵션을 배치하는 것의 차이점에 대해 설명합니다 . -t
이것을 실험해 보면 이 차이점이 귀하의 사례와 관련이 있다는 것을 알 수 있습니다.
중요 사항: 위의 예에서는 비디오가 트랜스코딩됩니다. 트랜스코딩 없이 이를 수행할 수 있는 가능성에 대해서는 아래에서 논의하겠습니다.
여러 세그먼트 병합
동영상 병합을 수행하는 세 가지 기본 방법이 있으며 그 중 두 가지가 이 문서에 가장 잘 설명되어 있습니다.ffmpeg 위키 기사, 그리고 세 번째는연결 디먹서. 모든 세그먼트가 a/v 인코딩 사양 및 컨테이너 형식 측면에서 동일한 경우 프로토콜을 사용하는 가장 쉬운 방법을 찾을 수 있습니다 concat:
.
# merge the segments
ffmpeg -i "concat:seg1.mp4|seg2.mp4|seg3.mp4" final.mp4
자르기와 마찬가지로 이 병합도 영화를 다시 한 번 트랜스코딩하므로 여기에 트랜스코드의 트랜스코드가 있어 비디오 품질이 저하될 수 있으므로정말이 트랜스코딩을 최대한 피하고 싶습니다!
트랜스코딩 없이 잘라내기 및 병합하기
이전 섹션의 예에서 트랜스코딩이 필요한 이유는 각 파일과 각 결과 세그먼트가 전체 영화를 열 때 기대하는 모든 항목(예: 영화 재생 시간 및 기타 정보)을 제공하도록 압축된 독립형 영화이기 때문입니다. 메타데이터. 하지만 여러분은 이러한 세그먼트를 독립형 영화로 재생하려는 것이 아니라 이러한 세그먼트가 더 큰 비디오 스트림의 일부가 되기를 원합니다. 따라서 박스형 영화와 함께 ffmpeg를 제공하는 대신 입력 파일을 실시간 스트리밍 컨테이너로 다시 패키징(재다중화)하는 것이 좋습니다. 이때 실제로 필요하지 않은 헤더 항목은 잊어버리세요. H.264의 경우 스트리밍 mux 형식을 MPEG-TS라고 하며, 스트림을 트랜스코딩하지 않고 다시 다중화하는 방법은 다음과 같습니다.
# re-muxing the whole movie (see a better option in next example)
ffmpeg -i full-movie.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb full-movies-as-ts.ts
글쎄요, 이미 작업을 완료했으므로 이 기회를 활용하여 필요한 부분만 잘라낼 수도 있습니다.
# skip 30 seconds and re-mux a 60 seconds segment
ffmpeg -ss 30 -t 60 -i full-movie.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb segment.ts
TS 세그먼트를 병합하면 mp4 컨테이너로 다시 다중화할 수도 있습니다.
# merge the segments and re-mux them as mp4
ffmpeg -i "concat:seg1.ts|seg2.ts|seg3.ts" -c:v copy -c:a copy -movflags empty_moov -flags global_header -bsf:v dump_extra edited-final.mp4
이제 우리는 영화를 트랜스코딩하지 않고 원본 품질을 유지하면서 모든 작업을 완료했습니다. 하지만 언제나 그렇듯이 주의사항이 있습니다.
경고: 키프레임 경계에서만 자르기가 가능합니다. 설명: H.264는 압축된 프레임을 패킷으로 구성합니다. 각 프레임은 첫 번째 프레임의 전체 압축 이미지로 시작하고 그 뒤에 다음 프레임의 델타가 옵니다. 따라서 각 패킷에 필요한 저장 공간이 줄어듭니다. 우리의 목적을 위해 각 패킷은 해당 기간 동안 모든 프레임의 봉인된 zip과 같습니다. 전부이거나 전혀 아닙니다. 패킷의 일부만 원하는 경우에는 압축을 풀고 다시 압축해야 합니다. 즉, 트랜스코딩해야 합니다. 따라서 위의 방법은 동영상을 자르려는 각 위치에 키프레임이 있는 경우에만 관련이 있습니다. 예를 들어, 5초마다 키프레임이 있는 경우 5초마다만 잘라낼 수 있습니다.
이제 문제는 절단 지점에 대한 제한을 받아들일 수 있는지 여부입니다. 특히 영화의 어느 부분에 키프레임이 있는지 모르기 때문입니다. 그리고 그것이 제가 위에서 읽어보라고 제안한 이유입니다.5.4 주요 옵션입력 전 또는 출력 전을 -s
지정 하는 방법 에 대해 설명합니다 . -t
입력 전에 지정하면 ffmpeg는 요청을 수행하기 위해 근처의 키프레임을 찾습니다. 이는 컷을 수행하려는 위치가 "다소"가 됩니다. 절단의 정확성에 대해 신경 쓰지 않는다면 좋습니다.
그러나 정확한 위치에 컷이 있어야 한다면 선택의 여지가 없습니다. 찾고 있는 프레임을 정확히 찾아내기 위해 영화를 디코딩해야 합니다. 글쎄, 적어도 우리는일부좋은 소식: 트랜스코딩 및 재트랜스코딩 대신 단일 트랜스코딩으로 수행할 수 있으므로 상황이 다소 개선됩니다.
# skip PRECISELY 30 seconds and transcode a 60 seconds TS segment
ffmpeg -i full-movie.mp4 -ss 30 -t 60 -bsf:v h264_mp4toannexb segment.ts
결과 세그먼트는 TS에 있으므로 세그먼트를 병합할 때 또 다른 트랜스코딩이 필요하지 않습니다.
속도
에서병합에 관한 ffmpeg wiki 기사파이프를 통해 전체 프로세스를 실행하여 중간 파일이 필요하지 않고 전체 프로세스 속도를 높이는 방법에 대한 설명이 있습니다.하지 않다.그것은 당신을 데려갈 것이다더 길게. 메모리에서 모든 작업을 수행하는 데 시간이 더 오래 걸리는 이유는 실행 시간이 길어지기 때문이 아니라 전체 작업을 수행하는 방법을 파악하는 동안 중간 결과가 없고 전체 프로세스를 다시 실행하게 되므로 다시. 따라서 파이프 이론은 좋지만 귀하의 경우에는 각 단계를 연습하고 완성하는 것부터 시작해야 합니다. 모든 것이 작동하고 괜찮은 결과를 얻으려면 좀 더 조정하고 조정해야 한다는 것을 알게 될 것입니다. 전체 프로세스를 숙지하고 자동화된 대량 편집을 위한 일부 스크립팅을 수행하려는 경우 배관 개념을 다시 검토할 수 있습니다.
위 내용이 도움이 되기를 바랍니다.