프레임 속도가 .33
(3 초 동안 1 프레임) mp4 형식의 비디오가 있습니다. 프레임 속도를 5 프레임 / 초로 늘리고 싶습니다. 아래 명령을 시도했지만 아무것도하지 않습니다.
ffmpeg -i <input.mp4> -r 5 <output.mp4>
ffmpeg가 -r
옵션을 무시하는 이유는 무엇입니까?
프레임 속도가 .33
(3 초 동안 1 프레임) mp4 형식의 비디오가 있습니다. 프레임 속도를 5 프레임 / 초로 늘리고 싶습니다. 아래 명령을 시도했지만 아무것도하지 않습니다.
ffmpeg -i <input.mp4> -r 5 <output.mp4>
ffmpeg가 -r
옵션을 무시하는 이유는 무엇입니까?
답변:
나는 이것이 오래된 질문이라는 것을 알고 있지만 현재 답변 중 더 이상 권장되는 방법은 없습니다.
의견에서 언급했듯이 비디오 를 다시 인코딩 할 필요 가 없는 경우이를 수행 할 수있는 방법이 있습니다. 그것은 필요 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 위키 의 지침 입니다 . 이러한 모든 옵션을 사용하려면 비디오를 다시 인코딩해야합니다.
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
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
mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv
MKV 컨테이너에서 프레임 속도 변경 . MKV와 MP4로 리 뮤싱하거나 MP4를 위해 직접 수행하는 도구를 찾을 수 있습니다. xcode 비디오는 CPU를 많이 사용하고 손실이 많으므로 끔찍한 옵션입니다.
입력 파일의 프레임 속도가 유효하지 않으면 명시 적으로 설정해야합니다.
ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
입력 파일이 "원시"파일로 분류 된 경우 변경된 프레임 속도 만 적용 할 수있었습니다.
ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv
지정하지 않으면 -f h264
기본값은 25fps이며 변경할 수 없습니다. 스트림에 프레임 속도 정보가 전혀 없기 때문에 이것은 ffmpeg의 기본 프레임 속도이기 때문입니다.
-r
출력 옵션으로 사용하면 프레임을 복제하거나 삭제하여 비디오가 동일한 속도로 재생되므로 원하는 경우가 아닙니다! 그러나 위와 같이 입력 프레임 속도를 변경하면 프레임이 손실되거나 복제되지 않고 비디오 속도가 느려지거나 느려집니다.
프레임 속도를 변경하는 이러한 기능을 "적합성"이라고하며, 몇 분 만에 식물의 성장을 보여주는 것처럼 느린 동작 또는 빨리 감기를 생성하는 데 종종 사용됩니다. ffmpeg는 다시 인코딩하지 않고 프레임 속도를 덮어 쓰거나 변경할 수 없습니다 . 그렇게하면 별도의 언급이없는 한 지속 시간이 변경되고 오디오가 동기화되지 않습니다. 하지만 프레임 률이 .33 인 오디오는 관심이없는 것 같습니다.
프레임 속도를 변경하고 싶기 때문에 준수를 원하지만 ffmpeg는 -r
자동으로 무시합니다.입력 파일에 프레임 속도가 지정된 경우 입력 파일은 .mp4 형식이므로 자체 프레임 속도가 우선합니다.다시 인코딩이 필요하지 않은 경우. 이를 위해 다른 도구 인 mencoder가 필요합니다.-r
입력 파일에 소리가 없다고 가정하면 프레임 속도가 .33 인 모든 비디오에 해당 될 수 있습니다. 필요한 것은 다음과 같습니다.
$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>
mencoder는 기본적으로 AVI 형식의 출력을 생성합니다.
r
출력 스위치로 지정된 경우 ffmpeg는 입력의 프레임 속도에 관계없이 지정된 프레임 속도로 출력을 생성합니다. r
입력 스위치로 지정된 경우 , ffmpeg는 초당 지정된 수의 프레임을 필터 / 인코더에 공급하는 데 필요한만큼 프레임을 복제하거나 삭제합니다.
r
입력 스위치가 언제 인지 설명하는 동작 은 .mp4 형식, Malvineous 'note (이 페이지) 및 버그 설명 403 trac.ffmpeg.org/ticket/403에 대한 이전 실험과 모순됩니다 . r
출력에 사용될 때의 설명 은 다시 인코딩 할 때 발생하지만 OP 시나리오는 그가 .33 프레임 레이트를 가졌다는 사실에 따라 적합한 경우 (다시 인코딩하지 않은 고정 프레임 레이트) 인 것 같습니다.
r
fps 에서 새 스트림을 생성해야합니다 .
-r
. 이 사례는 OP에 대한 응답으로 이전 실험에 영향을 줄 수 없었습니다. 적합한 사례를 생각하면서 ffmpeg에서 copy 매개 변수를 절대로 삭제하지 않았기 -r
때문에 무시되었습니다. 기능 요청을 작성했습니다 : trac.ffmpeg.org/ticket/5170
가장 빠른 방법은 디렉토리에 다음 행으로 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 파일을 초 단위로 변경합니다.