1FPS로 PNG 프레임을 비디오로 변환

1FPS로 PNG 프레임을 비디오로 변환

1FPS의 PNG 형식 비디오 프레임이 있고 ffmpeg를 사용하여 비디오로 변환하려고 합니다.

내가 다음과 같이 하면:

ffmpeg -i data/input-%4d.png data/output.mp4

기본적으로 입력을 빨리 감는(1FPS로 캡처된) 25FPS 비디오를 얻었습니다.

내가 시도하면 :

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

VLC가 재생하고 싶지 않은 것을 얻었습니다 :)

이제 첫 번째 비디오(FF 비디오)를 촬영하고 필터를 적용하여 속도를 늦추면(예: -filter:v 'setpts=24.0*PTS') 1FPS 비디오처럼 재생되도록 할 수 있지만 물론 파일 크기가 희생됩니다. 나는 그것이 많은 중복 프레임을 생성한다고 생각합니다.

그렇다면 문제는 어떻게 1FPS로 동영상을 만들고 실제로 그 속도로 재생할 수 있느냐는 것입니다. 그런데 출력 형식은 나에게 그다지 중요하지 않습니다.

답변1

FFMPEG의 단일 라인이 초당 1프레임으로 재생되는 비디오를 생성하려면 다음과 같이 입력 및 출력 프레임 속도를 지정해야 합니다.

ffmpeg -r 1 -i 데이터/input-%4d.png -pix_fmt yuv420p -r 10 데이터/output.mp4

이는 -r 1비디오가 1시에 재생된다는 것을 의미합니다.원본 이미지초당.
이는 -r 10비디오가 초당 10프레임으로 재생된다는 의미입니다.

( -pix_fmt yuv420p다양한 재생 프로그램과의 호환성을 보장하기 위해서만 사용됩니다. 예를 들어 Windows Media Player를 통해 비디오를 재생하려면 여기에서 필요합니다.)

다양한 출력 프레임 속도를 테스트했는데 10이 VLC에서 재생할 수 있는 비디오를 생성하는 데 사용할 수 있는 가장 낮은 숫자인 것 같습니다.

물론 위 명령은 각각의 원본 이미지를 곱한다는 뜻이지만 이는 말씀하신 "느리게 하기"보다 더 간단한 접근 방식이고 코덱에 따라서는 훨씬 더 큰 실제 1-FPS보다 나은 것을 생성하지 못할 수도 있습니다. 동영상.

이를 테스트하기 위해 크기가 2.24kiB인 실제 1FPS 비디오를 만들었습니다. 그런 다음 동일한 입력 이미지로 비디오를 만들었지만 출력은 24FPS로 5.76kiB가 되었습니다. 24번보다 훨씬 적은 2번이 조금 넘습니다. :)

답변2

-framerate-r

예를 들어, 1FPS처럼 보이는 최종 비디오를 얻으려면:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

이는 다음과 유사합니다.Unix 및 Linux 스택 교환에서 PNG 프레임을 비디오로 변환 |하지만 작동시키는 -framerate대신 필요합니다.-r

Wikipedia에서는 다음과 같이 언급합니다.http://trac.ffmpeg.org/wiki/Slideshow#Framerates

출력 프레임 속도를 30VLC가 처리할 수 있는 수준으로 설정하고 각 이미지를 30번 복사하여 출력 비디오가 1FPS처럼 보이도록 합니다. 또한보십시오:ffmpeg를 사용하여 이미지의 낮은 fps 비디오의 VLC 재생 문제 처리 |

그러면 VLC가 비디오를 정상적으로 재생할 수 있습니다.

ffmpeg10개의 PNG가 포함된 디렉터리에서 Ubuntu 16.10, VLC 2.2.4, 3.0.5에서 테스트되었습니다 .

또한보십시오:https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

답변3

두 번째 예를 다음과 같이 조금 확장하면:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

-r 1.png 파일 뒤가 아니라 앞에 있어야 합니다 .

~에서FFmpeg 문서:

일반적으로 옵션은 지정된 다음 파일에 적용됩니다. 따라서 순서가 중요하며 명령줄에서 동일한 옵션을 여러 번 사용할 수 있습니다. 그런 다음 각 발생은 다음 입력 또는 출력 파일에 적용됩니다.

답변4

이는 VLC의 버그입니다(버전 3.0.6에도 여전히 존재함). 몇번의 실험 끝에 나는 깨달았다.FPS가 10 미만인 비디오에서 VLC가 충돌함. 따라서 10FPS 이상의 모든 동영상은 문제가 되지 않습니다. 따라서 현재 VLC에서 재생 가능한 1FPS 비디오를 얻을 수 있는 확실한 방법은 없습니다(포기하지 말고 계속 읽어보세요).

한 가지 해결 방법은 위 답변에서 볼 수 있듯이 이미지를 복제하여 1FPS의 효과를 가짜로 만드는 것입니다(실제 FPS가 10 이상인 경우 VLC에서는 괜찮습니다).

예:12개의 이미지가 있는 폴더가 있고 1FPS 비디오(VLC에서 재생할 수 있음)를 생성하려면 각 이미지를 여러 번(예: 10번) 복사한 다음 FFMPEG에 10FPS 비디오를 생성하도록 지시해야 합니다. . 이렇게 하면 총 120프레임의 비디오가 제공되며 각 이미지는 1초 동안 재생됩니다(10번 반복되기 때문에). 이는 단순히 1FPS의 환상입니다.

나는 선호한다fps대신 매개변수를 사용하세요 .-r(다른 답변에 표시됨) 경우에 따라 문제가 발생할 수 있습니다.공식 문서).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

입력이 -framerate출력보다 낮기 때문에 fpsFFMPEG는 원하는 출력 프레임 속도(위 명령에 따라 10)를 달성하기 위해 프레임을 복사합니다.

주의하는 것이 중요합니다저것-framerate및 순서가 -vf fps중요합니다., 이 구성은 다음에 언급되는 비디오(입력 또는 출력)에 적용되기 때문입니다. 즉,에 따르면공식 문서:

옵션은 다음으로 지정된 파일에 적용됩니다. 그래서 순서가 중요한데...

관련 정보