ffmpeg를 사용하여 MPEG 비디오를 10분 단위로 분할하는 방법은 무엇입니까?

ffmpeg를 사용하여 MPEG 비디오를 10분 단위로 분할하는 방법은 무엇입니까?

오픈 소스 또는 활동적인 개발자 커뮤니티에서는 대규모 비디오 클립을 온라인에 게시해야 하는 경우가 많습니다. (파티 비디오, 캠프, 기술 강연...) 저는 비디오 작가가 아닌 개발자이기 때문에 프리미엄 Vimeo 계정에 추가 비용을 지출하고 싶지 않습니다. 그렇다면 비디오 공유 웹사이트에 쉽게 업로드할 수 있도록 12.5GB(1:20:00) MPEG 기술 토크 비디오를 00:10:00 세그먼트로 어떻게 분할합니까?

답변1

다음은 한 줄 솔루션입니다.:

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:20:00 -f segment output%03d.mp4

이렇게 하면 정확한 분할이 제공되지는 않지만 필요에 따라야 합니다. 대신, 지정된 시간 이후 첫 번째 프레임에서 잘라냅니다 segment_time. 위 코드에서는 이 시간이 20분 이후입니다.

첫 번째 블록만 재생할 수 있다고 판단되면 -reset_timestamps 1설명에 설명된 대로 추가해 보세요.

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:20:00 -f segment -reset_timestamps 1 output%03d.mp4

답변2

$ ffmpeg -i source-file.foo -ss    0 -t 600  first-10-min.m4v
$ ffmpeg -i source-file.foo -ss  600 -t 600 second-10-min.m4v
$ ffmpeg -i source-file.foo -ss 1200 -t 600  third-10-min.m4v
...

루프에서 실행하기 위해 이를 스크립트로 래핑하는 것은 어렵지 않습니다.

호출 기간 출력을 기준으로 반복 횟수를 계산하려는 경우 ffprobe이는 다음과 같습니다 .추정된인수를 제공하지 않는 한 클립 시작 부분의 평균 비트 전송률과 클립의 파일 크기를 기준으로 계산되므로 -count_frames작업 속도가 크게 느려집니다.

-ss주목해야 할 또 다른 사항은 명령줄에 옵션을 배치하는 것입니다.문제. 나는 느리지만 정확하다. 링크된 기사에서는 빠르지만 부정확하고 느리지만 여전히 정확한 대체 공식을 설명합니다. 후자에 대해서는 어느 정도의 복잡성을 지불해야 합니다.

그 모든 것을 제쳐두고, 각 클립의 길이가 정확히 10분인 것을 정말로 원하지는 않을 것 같습니다. 이렇게 하면 문장이나 단어 중간에 잘리는 현상이 발생합니다. 10분 이내의 간격으로 자연스러운 전환 지점을 찾으려면 비디오 편집기나 플레이어를 사용해야 한다고 생각합니다.

파일이 YouTube에서 직접 허용할 수 있는 형식이라고 가정하면 다시 인코딩하지 않고도 클립을 얻을 수 있습니다. 자연스러운 컷 포인트 오프셋을 에 전달하여 ffmpeg"복사" 코덱을 사용하여 영향을 받지 않고 인코딩된 A/V를 전달하도록 지시합니다.

$ ffmpeg -i source.m4v -ss       0 -t  593.3 -c copy part1.m4v
$ ffmpeg -i source.m4v -ss   593.3 -t 551.64 -c copy part2.m4v
$ ffmpeg -i source.m4v -ss 1144.94 -t 581.25 -c copy part3.m4v
...

-c copy매개변수는 모든 입력 스트림(오디오, 비디오 및 자막과 같은 기타 스트림)을 있는 그대로 출력에 복사하도록 지시합니다. 단순한 A/V 프로그램의 경우 보다 세밀한 로고나 -c:v copy -c:a copy구식 로고 에 해당합니다 -vcodec copy -acodec copy. 스트림 중 하나를 복사하고 다른 스트림을 다시 인코딩하려는 경우 더 자세한 스타일을 사용할 수 있습니다. 예를 들어, 수년 전 QuickTime 파일의 일반적인 관행은 H.264 비디오를 사용하여 비디오를 압축하고 오디오는 그대로 두는 것이었습니다.비압축 PCM;오늘 이러한 파일을 발견하면 해당 파일을 현대화하고 -c:v copy -c:a aac오디오 스트림만 다시 처리하고 비디오는 변경하지 않을 수 있습니다.

첫 번째 명령 이후의 각 명령의 시작점은 이전 명령의 시작점에 이전 명령의 지속 시간을 더한 값입니다.

답변3

이 작업을 수행하려면 ffmpeg에 내장된 것을 사용하세요.

ffmpeg -i invid.mp4 -threads 3 \
       -vcodec copy -f segment -segment_time 10:00 \
       -reset_timestamps 1 \
       cam_out_h264_%02d.mp4

이렇게 하면 약 10분 단위로 분할되고 관련 키프레임에서 분할되어 파일 등 으로 출력됩니다 cam_out_h264_01.mp4.cam_out_h264_02.mp4

답변4

완전히 동일한 청크를 생성하려면 ffmpeg가 각 청크의 첫 번째 프레임에 i-프레임을 생성하도록 강제해야 하므로 이 명령을 사용하여 0.5초 청크를 생성할 수 있습니다.

ffmpeg -hide_banner  -err_detect ignore_err -i input.mp4 -r 24 -codec:v libx264  -vsync 1  -codec:a aac  -ac 2  -ar 48k  -f segment   -preset fast  -segment_format mpegts  -segment_time 0.5 -force_key_frames  "expr: gte(t, n_forced * 0.5)" out%d.mkv

관련 정보