FFmpeg 비디오 분할 및 병합


8

FFmpeg를 사용하여 일부 start_timeend_time입력을 기반으로 비디오를 분할 하고 다른 비디오 파일로 대체 하려고 합니다. 예를 들어 입력 10 15하려면 EXACT 초 10 to 15를 다른 비디오 로 바꿔야 합니다.

확인. 내 마음에 오는 것은 이것입니다.

  1. 먼저 비디오를 분할합니다 (이 경우 0-10, 10-15 및 15 끝)
  2. 10-15를 다른 비디오로 교체
  3. 모든 하위 비디오를 다시 병합

첫 번째 질문 : 이것이 가장 빠르고 빠른 솔루션입니까? 비디오의 특정 기간을 다른 비디오로 대체 할 수있는 더 쉬운 명령이나 도구가 있습니까?

두 번째 질문 : FFmpeg가 실행 가능한 솔루션이라고 가정하면, 단순히 명령을 사용하면 ffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4비디오 처리 코드가 파일을 읽고 처리 할 수 ​​없습니다. 내가 사용 mediainfo관련 물건 코덱 모든 비디오가 동일한 동안 헤더 크기의 두 개의 파일과 주목의 차이를 비교하는 도구. HEADER SIZE가 다르기 때문에 문제를 일으키는 것으로 나타났습니다. 코덱을 제외하고 헤더 크기를 동일하게 만드는 방법이 있습니까?

업데이트 : 다음은.mp4 에뮬레이터에서 정상적으로 작동 하는 원본 파일 입니다.


먼저 두 번째 질문에서 언급 한 문제를 해결해야합니다. 사용중인 정확한 명령과 ffmpeg에서 얻은 전체 커트되지 않은 명령 행 출력을 보여주십시오. 또한 파일을 읽을 때 발생하는 실제 오류도 표시하십시오. "처리 코드"가 무엇인지 정확히 아는 것이 좋습니다.
slhck

@slhck 비디오 처리 코드는 거대한 코드 기반입니다. 공유 할 수 없습니다. 어떤 이유로 원본 파일을 읽지 만 다시 생성하지는 않습니다. 그러나 .mp4필요한 경우 원본 파일을 공유 할 수 있습니다 .
Ariana

mediainfo 도구를 사용하여 두 파일을 비교하고 헤더 크기와 내용의 차이를 확인했습니다.
Ariana

원본이 있으면 도움이되지만 읽을 수없는 이유를 해결할 수는 없습니다. 내부 코드 인 경우 두렵습니다.
slhck

@slhck 파일을 업로드했습니다. 내 질문이 업데이트되었습니다
Ariana

답변:


9

다른 코덱을 사용 trim하여 concat– 소스 파일 사용

이를 위해 개별 파일의 해상도가 동일하고 프레임 레이트 및 채도 서브 샘플링 등이 동일해야합니다. 이렇게하면 연결 중에 오류나 글리치가 발생하지 않습니다.

trimconcat필터를 사용하여 파일을 분할하지 않고 한 번에 모든 작업을 수행 할 수 있습니다 .

ffmpeg -i edv_g24.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[v0][v1][v2]concat=n=3:v=1:a=0[out]" \
-map "[out]" output.mp4

여기서는 나중에 연결하려는 trim입력 비디오 스트림 ( 0:v, 1:v) 의 개별 부분을 지정하는 데 사용됩니다 . 이 부분은를 v0통해 이름이 지정 됩니다 v2. ( setpts필터는 이러한 개별 부품의 타임 스탬프를 0으로 재설정하며 이는 연결에 필요합니다). 나중에 우리는 세 부분을 연결합니다.

특정 타임 스탬프에서 끝까지 트리밍 trim=start=15하려면 범위를 지정하는 대신 사용 하십시오.

파일에 오디오가있는 경우 해당 스트림을 개별적으로 트리밍해야합니다.

ffmpeg -i edv_g24_2.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[1:a]atrim=0:5,asetpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=15:30,asetpts=PTS-STARTPTS[a2]; \
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4

이 경우 비디오 및 오디오가 다시 인코딩됩니다. 적절한 출력 품질 대상을 지정하십시오 (예 : -crfx264, x265 또는 libvpx-vp9). VP9 또는 H.264 와 같은 FFmpeg Wiki에서 이에 대한 자세한 내용을 읽을 수 있습니다 .

개별 세그먼트 사용

클립을 분리하고 나중에 다시 조립하려면 다음을 수행하십시오.

ffmpeg -i edv_g24.mp4 -ss 0 -to 10 -c copy part1.mp4
ffmpeg -i edv_g24.mp4 -ss 10 -to 15 -c copy part2.mp4
ffmpeg -i edv_g24.mp4 -ss 15 -c copy part3.mp4

ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv]" \
-map "[outv]" -t 30 output.mp4

파일에 오디오가있는 경우 위와 동일한 방법을 사용하십시오.

ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" -t 30 output.mp4

비디오 스트림이 다시 인코딩됩니다. 좀 더 간단하지만 위의 방법과 동일해야합니다.

concat디 먹서 사용

원칙적으로 concat demuxer를 사용하여 비트 스트림을 다시 인코딩하지 않고 연결하려고 시도 할 수 있습니다. 이라는 파일 concat.txt을 만들고 다음 항목을 추가하십시오 (위에서 만든 비디오 클립에 해당).

file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'

그런 다음이 개별 파일을 연결하십시오.

ffmpeg -f concat -i concat.txt -c copy output.avi

그러나 클립의 코덱, 해상도, 프레임 속도 등이 같아야하므로 모든 종류의 이기종 소스에서 작동하지 않습니다.

concat프로토콜 사용

위와 concat같은 종류의 제약 조건 (동일한 코덱, 해상도 등)으로 프로토콜을 사용하여 위의 파일 수준 연결을 수행 할 수 있습니다 .

ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4

연결에 대한 자세한 내용은 해당 FFmpeg Wiki 페이지를 참조하십시오 .


이것은 매우 완전 해 보입니다! 감사. 나는 그들을 시도 할 것이다!
Ariana

Idk 왜 concat메소드를 사용하면 오류가 발생합니다 :[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
Ariana

"개별 세그먼트 사용"의 경우 출력이 중단되고 작게 끊어집니다. 이 문제를 해결하는 방법이 있습니까?
Ariana

방법 1은 완벽하게 작동합니다. 한 가지 : 특정 숫자 (30 초 대신)를 지정하지 않고 "끝까지"를 지정하는 방법
Ariana

1
죄송합니다. 실수했습니다. 를 들어 concat디멀티플렉서, 구문은 달랐다. 지금 수정했습니다. 끝날 때 까지을 사용 trim=start=15하려면 트림 필터 설명서 ffmpeg.org/ffmpeg-filters.html#trim을 참조하십시오. 타이밍 문제는 소스 자료에 따라 다릅니다. 업로드 한 클립과 연결하는 데 문제가 없었습니다.
slhck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.