ffmpeg를 사용하여 입력 비디오 반복 / 루프?


52

ffmpeg로 mp4 비디오를 반복하고 현재 설정 및 코덱을 유지하고 싶습니다.

예를 들어 input.mp4의 길이가 0:10이고 출력을 4 번 반복하여 output.mp4의 길이가 0:40 인 경우 다음 명령 줄을 변경하려면 어떻게해야합니까?

ffmpeg -i input.mp4 -c copy output.mp4

나는 시도했다 ...

ffmpeg -loop 4 -i input.mp4 -c copy output.mp4

...하지만 "옵션 루프를 찾을 수 없습니다"라는 오류가 발생합니다.


quicktime 7 pro 및 mov 컨테이너를 사용하십시오. 따라서 오픈 소스 파일보다 파일 크기가 더 크지 않습니다.
Дмитрий Мышков

답변:


69

Concat demuxer

이를 통해 다시 인코딩하지 않고도 입력을 반복 할 수 있습니다.

  1. 텍스트 파일을 만드십시오. 예제 텍스트 파일의 내용이 4 번 반복됩니다.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. 그런 다음 다음을 실행하십시오 ffmpeg.

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Linux 사용자의 경우

이 예제는 위와 동일하지만 수동으로 만들 필요는 없습니다 list.txt.

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

가장 일반적으로 사용되는 최신 쉘을 사용하면 list.txt파일 작성을 완전히 피할 수도 있습니다. 예를 들어, bash를 사용하면 :

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

참조 :


루프 필터

루프 필터 를 사용하여 4 번 반복 하는 예제 , 각 루프는 75 프레임이며 각 루프는 입력의 처음 25 프레임을 건너 뜁니다.

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • 또는 속기를 사용하십시오. loop=3:75:25
  • 필터링에는 다시 인코딩이 필요합니다.
  • 이 필터 는 모든 프레임을 메모리에 배치합니다 .
  • 사용 loop=3하면 4 번 반복됩니다.
  • 무한 반복하려면을 사용하십시오 -1.
  • 루프 할 프레임 수를 나열해야합니다 (위 예에서 75로 표시). 최대 값은 32767입니다.
  • 도 참조하십시오 ffmpeg -h filter=loop.

영화 필터

영화 필터는 루프 옵션이 있습니다. Monah Tuk의 아래 답변을 참조하십시오 . 필터링에는 다시 인코딩이 필요합니다. 오디오의 경우 영화 필터를 사용하십시오.


-stream_loop 선택권

참조 대답 꼬추 아래 및 답변 기안에 의해.

이 옵션 버그가 많으므로 (버그 보고서 # 5719 , # 6121# 7043 참조 ) 이전 빌드 (FFmpeg 4.0.x 릴리스 분기를 포함하여 2018 06-27 이전 버전)에서는 작동하지 않을 수 있습니다. 티켓 # 6121에서 mulvya가 언급 한대로 이전 빌드 사용자의 경우 우선 해결 방법은 먼저 MKV 또는 TS로 리 뮤싱 한 후 -stream_loop다음 명령에서 사용 하는 것입니다.


-loop 선택권

-loop옵션은 이미지 파일 demuxergif muxer 에만 적용되므로 일반적인 비디오 파일에는 사용할 수 없지만 일련의 입력 이미지를 무한대로 반복하는 데 사용할 수 있습니다. 이 예제는 계속 반복되지만 -t 30출력 지속 시간은 30 초로 제한됩니다.

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

또는 GIF 출력을 반복하려면 :

ffmpeg -i input -loop 3 output.gif

이것은 mp4 파일에서 잘 작동합니까?
Thomas King

3
이 오류가 발생합니다> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11

1
@ jamesfzhang-파일에 대한 절대 경로가 필요하기 때문에 ( trac.ffmpeg.org/wiki/Concatenate ) 이를 달성하기 위해 다음과 같이 작성할 수 있습니다. ffmpeg -safe 0 -f concat -i <(i의 경우 {1..4}의 경우 printf "file '$ PWD'/ '% s'\ n"input.mp4; done ) -c copy output.mp4
Franckly

1
나를 위해 이것은 4 번 명성을 건너 뛰지 않고 풀 타임 비디오 를 반복 작동ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
Vlad

이 문제는 4 살 -stream_loop
이며이

15

적어도 FFmpeg 2.8.x에서 (그러나 oldie도 작동해야 함) 옵션 의 인수로 및 필터를 lavfi사용하여 입력 형식 및 복잡한 필터 그래프로 사용할 수 있습니다.moviesetpts-i

이 작업을 수행하는 다음 명령은 다음과 같습니다.

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

loop=인수가 0 이면 무한 루프를 의미합니다. 0보다 큰 값은 반복 횟수를 설정합니다. setpts두 번째 및 그 이후의 반복에 대한 PTS 조정에 필요한 필터, 그렇지 않으면 대부분의 출력 멀티플렉서가 비단 조 PTS 증가로 실패합니다. 루프는 PTS를 다시 계산하지 않습니다.

디코딩 / 인코딩없이 바이 패스 프레임을 가정 할 때 필터를 사용하는 것은 불가능합니다. 설계 필터는 디코딩 된 프레임 만 처리합니다.

FFmpeg 2.8.2에서 새로운 입력 옵션이 도입되었습니다 -stream_loop. 먼저 더 간단하게 작동하고 코드 변환없이 내용을 복사 할 수 있습니다.

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

그러나 PTS를 다시 계산하지 않고 출력 파일이 잘못되었습니다. PTS를 수정하기 위해 필터를 추가하는 경우 (참조 setpts) -c copy너무 제거해야합니다 . 비트 스트림 필터 만 인코딩 된 패킷을 처리 할 수 ​​있지만 PTS를 수정하기위한 비트 스트림 필터는 없습니다 ( https://ffmpeg.org/ffmpeg-bitstream-filters.html 참조 )

어쨌든 두 번째 패스의 ffmpeg는 오류와 함께 실패합니다.

input.mp4: Resource temporarily unavailable

알려진 해결 방법 : PTS 제한이없는 입력 파일에 컨테이너를 사용하십시오 (스트리밍 컨테이너). 그중 하나는 MPEG-TS입니다. 따라서 MP4 파일을 MPEG-TS로 간단하게 변환 할 수 있습니다.

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

그리고 다음 명령을 사용하여 무한대 파일을 작성하십시오.

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(비트 스트림 필터는 필요한 경우에만 사용해야하며 내 샘플에는 필요합니다)

이 경우 FFmpeg> = 2.8.2가 필요합니다.


1
해당 명령을 실행하면 오류가 발생합니다. "[mp4 @ 00000000053fa1a0] 스트림 # 0에서 코덱 rawvideo에 대한 태그를 찾을 수 없습니다. 현재 컨테이너에서 코덱이 지원되지 않습니다." 입력 전에 -vcodec h264를 추가하면 해당 오류가 사라지지만 인코더는 종료되지 않습니다. 0이 아닌 루프 수를 제공하면 많은 오류가 발생하지만 종료됩니다. 파일이 유효한 출력이 아닙니다.
Gyan

1
stream_loop에 대한 문서는 "루프 0은 루프가 없음을, 루프 -1은 무한 루프를 의미합니다."라고 말합니다.
Gyan

잘못된 입력 파일 인 것 같습니다. 당신의 간청이 그것을 공유 할 수 있습니까? "루프 0은 루프가 없음을 의미하고 루프 -1은 무한 루프를 의미합니다." -내가 오래된 문서를 본 것 같습니다 :-)
Monah Tuk

1
나는 잊었다 : 트랜스 코딩 (디코딩 / 인코딩)을 가정하는 필터. 디자인에 의해. 따라서를 제거해야합니다 -c copy. 답변이 수정되었습니다.
Monah Tuk

1
알아두면 좋지만, 생성 할 루프가 크면 이는 큰 한계입니다.
Gyan

14

ffmpeg 2.8.4를 사용하여 다음 명령은 ffmpeg 프로세스가 중지 될 때까지 input.mp4의 반복 사본 인 output.mp4를 작성합니다.

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

이 명령은 자체적으로 종료되지 않으며 출력 파일은 무한대로 커집니다.


2
가장 빠른 방법 인 것 같습니다
josef

2
가장 빠른 방법은 과소 평가이며,이 방법은 몇 시간 만에 최대 몇 시간 분량의 비디오를 만들 수 있습니다.
SleighBoy

반복되는 줄로 파일을 만들 필요가 없기 때문에 매우 편리한 방법입니다.
Markus Zeller

-1

Q : "... 어떻게하면 다음 명령 줄을 변경할 수 있습니까? ffmpeg -i input.mp4 -c copy output.mp4"?

A : 어떤 명령이 어떤 버전으로 작동하는지 문제를 피하는 간단한 방법은 '사소한 해결책'입니다.

ffmpeg -i 입력 .mp4 -i 입력 .mp4 -i 입력 .mp4 -i 입력 .mp4 -c 복사 출력 .mp4

https://trac.ffmpeg.org/wiki/Concatenate 도 참조하십시오 .


2
이것은하지 않는 모든 연결을. 프로토콜, 필터 또는 디 먹서 중 하나 이상의 연결 방법을 사용해야합니다. 이 명령에서 ffmpeg의 자동 매핑은 입력 중에서 하나의 비디오, 하나의 오디오 및 하나의 자막 스트림을 선택합니다. 그것들은 동일하기 때문에 OP의 첫 번째 명령과 같습니다.
Gyan

Mulvya가 문서에 설명 된 동작과 다르기 때문에 Mulvya를 테스트 해 주셔서 감사합니다. ffmpeg.org/ffmpeg.html#Description- "-i -i /tmp/test%d.mp4"를 사용하여 파일 이름에 유사성이있는 경우 ( et al.)도 가능합니다.
Rob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.