1 FPS에서 PNG 프레임을 비디오로 변환 비디오 프레임을 비디오로 변환하려고합니다. 내가 이런 식으로하면

1 FPS에서 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'🙂 1 FPS 비디오처럼 재생하도록 할 수는 있지만 물론 파일 크기는 파일 크기입니다. 내가 생각하는 반복 프레임을 많이 생성하고 있습니다.

문제는 정확히 1 FPS를 가지고 실제로 그 속도로 재생되는 비디오를 어떻게 만들 수 있습니까? 출력 형식 btw는 그다지 중요하지 않습니다.



답변

초당 1 프레임으로 재생되는 비디오를 생성하는 FFMPEG에 대한 한 줄짜리를 원한다면 다음과 같이 입력 및 출력에 대한 프레임 속도를 지정하십시오.

ffmpeg -r 1 -i 데이터 / 입력-% 4d.png -pix_fmt yuv420p -r 10 데이터 / 출력 .mp4

이는 -r 1비디오가 초당 원본 이미지 중 1 개 에서 재생됨을 의미합니다 . 수단은 비디오는 초당 10 개 프레임으로 재생된다.
-r 10

(이것은 -pix_fmt yuv420p광범위한 재생 프로그램과의 호환성을 보장하기 위해 존재합니다. 예를 들어 Windows Media Player에서 비디오를 재생할 수 있어야합니다.)

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

물론 위의 명령은 각 원본 이미지가 곱해지고 있음을 의미하지만 언급 한 “느린 속도”보다 간단한 방법이며 코덱에 따라 실제 1-FPS보다 훨씬 큰 비디오를 생성하지 못할 수 있습니다 비디오.

이를 테스트하기 위해 방금 진정한 1-FPS 비디오를 제작했으며 2.24KiB로 나왔습니다. 그런 다음 동일한 입력 이미지로 24 FPS로 출력 한 비디오를 제작하여 5.76kB로 나왔습니다. 그것은 크기의 두 배 이상이며 크기의 24 배에 가까운 곳은 없습니다. 🙂


답변

-framerate와 둘 다 사용-r

예를 들어 1FPS와 같은 최종 비디오를 만들려면

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

이것은 1 FPS에서 PNG 프레임을 비디오로 변환하는 것과 유사합니다. 유닉스 및 리눅스 스택 Exchange는 말한다, 그러나 나는 필요한 -framerate대신 -r작업에 대한.

http://trac.ffmpeg.org/wiki/Slideshow#Framerates 에서 위키에 언급되어 있습니다.

30VLC가 처리 할 수 있는 출력 프레임 속도를로 설정하고 각 이미지를 30 번 복사하여 출력 비디오가 1 FPS 인 것처럼 보입니다. 참고 항목 : ffmpeg를 사용하여 이미지의 낮은 fps 비디오를 사용하는 VLC의 재생 문제 | 스택 오버플로

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

ffmpeg10 개의 PNG가있는 디렉토리 에서 Ubuntu 16.10, VLC 2.2.4, 3.0.5에서 테스트되었습니다 .

참조 : /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg


답변

다음과 같이 두 번째 예를 약간 늘리면 어떻게 될까요?

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

이후 -r 1가 아니라 .png 파일 앞에 와야합니다.

로부터 는 FFmpeg 문서 :

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


답변

이것은 VLC의 버그입니다 (버전 3.0.6에도 여전히 존재 함). 몇 가지 실험을 한 후 FPS가 10 미만인 비디오 에서는 VLC가 충돌 한다는 것을 알았습니다 . 따라서 FPS가 10 이상인 모든 비디오는 문제가되지 않습니다. 따라서 현재 VLC에서 재생할 수있는 1 FPS로 비디오를 얻는 확실한 방법 은 없습니다 (포기하지 말고 계속 읽으십시오 ).

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

예 : 12 개의 이미지가있는 폴더가 있고 1 FPS (VLC에서 재생 가능)로 비디오를 생성하려면 각 이미지를 여러 번 복제 한 다음 (10 회 말) FFMPEG에 알려야합니다. 10 FPS 비디오를 생성합니다. 이런 식으로 우리는 총 120 프레임의 비디오를 얻을 것입니다. 여기서 각 이미지는 1 초 동안 (10 번 복제 됨) 재생됩니다. 이는 단순히 1 FPS의 가짜입니다.

나는 어떤 경우에는 문제가 될 수있는 ( 공식 문서 에 따라) 매개 변수사용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중요 이 구성 (IN- 또는 출력) 다음에 상술 한 화상에인가 될 것이다. 공식 문서 에 따르면 :

옵션은 다음 지정된 파일에 적용됩니다. 따라서 순서가 중요합니다 …