ffmpeg를 사용하여 MP4 비디오의 프레임 속도 변경


8

프레임 속도가 .33(3 초 동안 1 프레임) mp4 형식의 비디오가 있습니다. 프레임 속도를 5 프레임 / 초로 늘리고 싶습니다. 아래 명령을 시도했지만 아무것도하지 않습니다.

ffmpeg -i <input.mp4> -r 5 <output.mp4>

ffmpeg가 -r옵션을 무시하는 이유는 무엇입니까?


프레임을 복제 / 삭제하는 대신 비디오 속도를 높이거나 속도를 줄이려면 superuser.com/questions/854753/… 및 / 또는 askubuntu.com/questions/370692/…를
Peter Cordes

답변:


7

나는 이것이 오래된 질문이라는 것을 알고 있지만 현재 답변 중 더 이상 권장되는 방법은 없습니다.

무손실 (비디오) 리 먹싱

의견에서 언급했듯이 비디오 를 다시 인코딩 할 필요 가 없는 경우이를 수행 할 수있는 방법이 있습니다. 그것은 필요 remuxing 되돌려 MP4로 그것을 remuxing 다음 다른 containter 포맷 MKV에 파일을합니다. 다음은 비디오를 12 프레임 / 초로 변경하는 예입니다.

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

비디오에 오디오가 포함 된 경우 피치를 변경하지 않고 속도를 늦출 수 있지만 무손실 변환 은 아닙니다 . 아래 예는 소스 비디오가 초당 24 프레임이므로 ffmpeg의 템포 필터를 사용하여 오디오의 속도를 절반 (0.5)으로 느리게해야한다고 가정합니다 .

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

FFMPEG 위키 안내

이것은 ffmpeg 위키 의 지침 입니다 . 이러한 모든 옵션을 사용하려면 비디오를 다시 인코딩해야합니다.

비디오 가속 / 감소

setpts 비디오 필터를 사용하여 비디오 스트림의 속도를 변경할 수 있습니다. 다음 예에서 오디오 스트림은 변경되지 않으므로 -an을 사용하여 비활성화해야합니다.

비디오 속도를 두 배로 높이려면 다음을 사용할 수 있습니다.

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

필터는 각 비디오 프레임의 프리젠 테이션 타임 스탬프 (PTS)를 변경하여 작동합니다. 예를 들어 타임 스탬프 1과 2에 두 개의 성공적인 프레임이 표시되고 비디오 속도를 높이려면 타임 스탬프가 각각 0.5와 1이되어야합니다. 따라서 우리는 0.5를 곱해야합니다.

이 방법은 원하는 속도를 얻기 위해 프레임을 떨어 뜨립니다. 입력보다 높은 출력 프레임 속도를 지정하여 프레임 손실을 방지 할 수 있습니다. 예를 들어, 4 FPS의 입력에서 최대 4 배속 (16 FPS)의 입력으로 이동하려면 다음을 수행하십시오.

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

비디오 속도를 늦추려면 1보다 큰 승수를 사용해야합니다.

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

부드러운

보간 비디오 필터를 사용하여 느리고 빠른 비디오를 부드럽게 할 수 있습니다. 이것을 "모션 보간"또는 "광학 흐름"이라고도합니다.

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

다른 옵션으로는 slowmoVideo 및 Butterflow가 있습니다. 오디오 속도 향상 / 감소

atempo 오디오 필터를 사용하여 오디오 속도를 높이거나 늦출 수 있습니다. 오디오 속도를 두 배로 늘리려면

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

템포 필터는 0.5와 2.0 사이의 값을 사용하도록 제한됩니다 (따라서 원래 속도의 절반 이상으로 속도를 늦추고 입력의 두 배 이하로 속도를 늦출 수 있습니다). 필요한 경우 여러 템포 필터를 함께 연결하여이 제한을 해결할 수 있습니다. 오디오 속도가 4 배인 다음은 다음과 같습니다.

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

복잡한 필터 그래프를 사용하면 비디오 및 오디오 속도를 동시에 높일 수 있습니다.

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

1
그냥 remuxing하여 속도 / 느려질 수 있지만 FFmpeg는 그것을 수행하는 방법을 모른다 . 예를 들어 mkv의 경우 mkvtoolnix가 수행 할 수 있습니다. 예 : mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv MKV 컨테이너에서 프레임 속도 변경 . MKV와 MP4로 리 뮤싱하거나 MP4를 위해 직접 수행하는 도구를 찾을 수 있습니다. xcode 비디오는 CPU를 많이 사용하고 손실이 많으므로 끔찍한 옵션입니다.
Peter Cordes

리소스를 덜 사용하는 무손실 방식이므로 낮은 프레임 속도로 리 뮤싱하는 것이 바람직하다는 데 완전히 동의했습니다. 실제로 MP4로 그렇게하는 데 유용한 도구를 찾지 못했습니다. 나는 최근에 실제로 시도하지 않았지만이 답변을 처음 썼을 때 MP4-> MKV-> MP4 remuxing을하고 있었고 mkvtoolnix, ffmpeg 및 / 또는 mp4box를 사용하여 작동하지 못했습니다. 제안한 매개 변수로 시도해야합니다.
pseudosavant

6

입력 파일의 프레임 속도가 유효하지 않으면 명시 적으로 설정해야합니다.

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4

이것은 실제로 remux 만 필요할 때 코드 변환됩니다. (실제로 비디오 속도를 줄이거 나 속도를 높이는 대신 프레임을 복제 / 삭제하지 않는 한)
Peter Cordes

3

입력 파일이 "원시"파일로 분류 된 경우 변경된 프레임 속도 만 적용 할 수있었습니다.

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

지정하지 않으면 -f h264기본값은 25fps이며 변경할 수 없습니다. 스트림에 프레임 속도 정보가 전혀 없기 때문에 이것은 ffmpeg의 기본 프레임 속도이기 때문입니다.

-r출력 옵션으로 사용하면 프레임을 복제하거나 삭제하여 비디오가 동일한 속도로 재생되므로 원하는 경우가 아닙니다! 그러나 위와 같이 입력 프레임 속도를 변경하면 프레임이 손실되거나 복제되지 않고 비디오 속도가 느려지거나 느려집니다.


1
유용한 답변입니다. 여기에 다시 인코딩이 없습니다
yota

1

프레임 속도를 변경하는 이러한 기능을 "적합성"이라고하며, 몇 분 만에 식물의 성장을 보여주는 것처럼 느린 동작 또는 빨리 감기를 생성하는 데 종종 사용됩니다. ffmpeg는 다시 인코딩하지 않고 프레임 속도를 덮어 쓰거나 변경할 수 없습니다 . 그렇게하면 별도의 언급이없는 한 지속 시간이 변경되고 오디오가 동기화되지 않습니다. 하지만 프레임 률이 .33 인 오디오는 관심이없는 것 같습니다.

프레임 속도를 변경하고 싶기 때문에 준수를 원하지만 ffmpeg는 -r자동으로 무시합니다.입력 파일에 프레임 속도가 지정된 경우 입력 파일은 .mp4 형식이므로 자체 프레임 속도가 우선합니다.-r다시 인코딩이 필요하지 않은 경우. 이를 위해 다른 도구 인 mencoder가 필요합니다.

입력 파일에 소리가 없다고 가정하면 프레임 속도가 .33 인 모든 비디오에 해당 될 수 있습니다. 필요한 것은 다음과 같습니다.

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

mencoder는 기본적으로 AVI 형식의 출력을 생성합니다.


1
이것은 잘못이다. r출력 스위치로 지정된 경우 ffmpeg는 입력의 프레임 속도에 관계없이 지정된 프레임 속도로 출력을 생성합니다. r입력 스위치로 지정된 경우 , ffmpeg는 초당 지정된 수의 프레임을 필터 / 인코더에 공급하는 데 필요한만큼 프레임을 복제하거나 삭제합니다.
Gyan

r입력 스위치가 언제 인지 설명하는 동작 은 .mp4 형식, Malvineous 'note (이 페이지) 및 버그 설명 403 trac.ffmpeg.org/ticket/403에 대한 이전 실험과 모순됩니다 . r출력에 사용될 때의 설명 은 다시 인코딩 할 때 발생하지만 OP 시나리오는 그가 .33 프레임 레이트를 가졌다는 사실에 따라 적합한 경우 (다시 인코딩하지 않은 고정 프레임 레이트) 인 것 같습니다.
Tankman 六四

1
여기에 붙여진 보고서를 확인 하십시오 . 맨 위의 명령 행, 입력 및 출력 메타 데이터 및 마지막으로 no를 기록하십시오. 인코딩 된 프레임 수
Gyan

1
OP는 파일을 준수하려고하지만 복사 스위치가 지정되지 않았으므로 주어진 명령이 다시 인코딩됩니다. 이 시나리오에서 ffmpeg는 rfps 에서 새 스트림을 생성해야합니다 .
Gyan

확실한 샘플 출력에 대해 Mulvya에게 감사합니다. 예,의 사용법이 맞습니다 -r. 이 사례는 OP에 대한 응답으로 이전 실험에 영향을 줄 수 없었습니다. 적합한 사례를 생각하면서 ffmpeg에서 copy 매개 변수를 절대로 삭제하지 않았기 -r때문에 무시되었습니다. 기능 요청을 작성했습니다 : trac.ffmpeg.org/ticket/5170
Tankman 六四

0

가장 빠른 방법은 디렉토리에 다음 행으로 BAT 파일을 작성하는 것입니다.

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

동일한 디렉토리에 mkvmerge 및 ffmpeg가 있어야합니다. 그것은 품질의 손실없이 자동으로 모든 mp4 파일을 초 단위로 변경합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.