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


21

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는 그다지 중요하지 않습니다.


ffmpeg컨테이너 형식 파일 확장자로 비디오 코덱을 알아낼만큼 똑똑 하지는 않습니다 .mp4. -vcodec libx264 -vpre hq코덱과 인코딩 매개 변수를 알려주려면 명령 줄에 추가하십시오 .
워렌 영

그것은 실제로 그것을 알아 냈고, 언급했듯이 잘 작동하고 추가했을 때만 이상한 결과를 냈습니다 -r 1.
Assaf Lavie

stackoverflow.com 또는 superuser.com 의 ffmpeg 답변에서 더 나은 행운을 얻을 수 있다고 생각합니다 .
Damien

답변:


19

초당 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 배에 가까운 곳은 없습니다. :)


-pix_fmt에서 +1 일부 사람들은 WMP를 사용한다고 주장하기 쉽다 :-)
Smalltown2k

입력이 1 인 동안 출력 형식이 10fps 인 이유는 무엇입니까? 정확히 동일한 90 % 중복 프레임을 생성하지 않습니까?
허버트

@Herbert는 중복 프레임을 생성하여 최대 10의 프레임 속도를 얻을 수 있습니다. VLC가 불평 하지 않고 시각적으로 비디오를 변경하지 않습니다. 인코더는 훨씬 더 큰 파일을 결국하지 않도록 스마트 충분이 프레임이 모두 동일한 것을 볼 것입니다
chiliNUT

@chiliNUT 키 프레임은 모든 형식은 아니지만 대부분의 제정신 형식이 수행합니다. 감사!
Herbert

5

-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


차이 무엇 -r-framerate?
Royi

@Royi 나는 그것이 나를 위해 일한 유일한 것임을 제외하고는 정말로 모른다 man. 입력 옵션의 경우 파일에 저장된 타임 스탬프를 무시하고 대신 일정한 프레임 속도 fps를 가정하여 타임 스탬프를 생성합니다 image2 또는 v4l2와 같은 일부 입력 형식에 사용 된 -framerate 옵션과 동일하지 않습니다 (이전 버전의 의심스러운 경우 입력 옵션 -r 대신 -framerate를 사용하십시오. "
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

3

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

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

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

로부터 는 FFmpeg 문서 :

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


불행히도 이것은 작동하지 않습니다. 그러나 순서가 중요하다고 언급 하면 많은 시간이 절약되었습니다. 감사.
모하메드 누 렐딘

0

이것은 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- 또는 출력) 다음에 상술 한 화상에인가 될 것이다. 공식 문서 에 따르면 :

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

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