N 초마다 비디오의 한 프레임을 이미지로 추출하는 방법은 무엇입니까?


71

비디오 파일을 이미지 시퀀스로 변환하는 방법 (예 : N 초마다 한 프레임) mplayer 또는 ffmpeg가이를 수행 할 수 있습니까? MPlayer를 사용하여 스크린 샷을 수동으로 가져 왔지만 긴 비디오를 위해 이것을 자동화하고 싶습니다.


이미지 품질 선택에 관한이 관련 질문을 참조하십시오 : stackoverflow.com/questions/10225403/…
Pierz

답변:


70

ffmpeg를 사용하면 매우 간단하며 추가 스크립트 없이 N 초마다 한 프레임을 출력 할 수 있습니다 . 이미지 시퀀스로 내보내려면 출력과 비슷하거나 비슷하게 사용 하십시오. 비트는 제로 패딩 정수로 변환됩니다 오랫동안 자리 - 내가 준 예는 다음과 같이 출력을 얻는다myimage_%04d.png%0xdx

  • myimage_0000.png,
  • myimage_0001.png,
  • myimage_0002.png

    기타..

많은 스틸 이미지 형식, png, jpeg, tga 등 무엇이든 사용할 수 있습니다 ( ffmpeg -formats전체 목록 참조 ).

이제 동영상을 이미지 시퀀스로 내보내는 방법을 알고 있지만 모든 단일 프레임을 내보내고 싶지 않다고 가정하십니까?

트릭은 초당 프레임 수인 -r n옵션을 사용하여 출력의 프레임 속도를 원하는대로 간단히 변경하는 것 n입니다. 초당 1 프레임 -r 1, 4 초 -r 0.25마다 1 프레임, 10 초마다 1 프레임 -r 0.1등이됩니다.

그래서 그것의 하나의 프레임 저장하려면 어떻게 보일지이다, 모두 함께 넣어 input.mov마다 4 초 output_0000.png, output_0001.png등 :

ffmpeg -i input.mov -r 0.25 output_%04d.png

점을 유의 -r 0.25옵션이 간다 -i input.mov 가의 프레임 속도 제어 있기 때문에, 일부 출력을 . 당신이 그것을 넣으면 전에 입력이 지정된 프레임 속도를 한 것처럼 입력 파일을 치료하는 것입니다.

10,000 개 이상의 프레임을 만들 것입니다 명령이이 변경 될 경우 당신이 필요하지만 많은 숫자, 예에 %의 XD 변경 %04d%05d. 이미지 시퀀스 인 입력 파일에도 적용됩니다. 자세한 내용은 여기를 참조 하십시오 .

Windows 사용자 : 명령 행 사용%

예: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

CMD 및 BAT 스크립트에서 %%

예: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

따라서 %%스크립트는 두 배이고 %대화식 명령 줄은 하나 입니다. 어느 상황에서든 잘못하면 오류가 발생합니다.


모든 프레임 -r을 내보내려면 무엇을 넣어야 합니까? 비디오의 FPS를 알고 있다면 입력 한 것 같지만 입력하지 않으면 어떻게됩니까?
Tomáš Zato

4
-r 플래그를 전혀 사용하지 마십시오. 그런 다음 FFMPEG는 입력 파일의 프레임 속도를 사용합니다.
stib

2
당신이 원하는 것이 확실하지 않다면 정말로jpegs 이것을 사용 png하고 싶을 것입니다. 필자의 경우 jpegs는 각각 약 50kb이고 pngs는 약 2MB입니다.
mlissner

5
png의 장점은 무손실 압축이므로 이미지 시퀀스를 중간 크기로 사용하고 여분의 크기를 신경 쓰지 않으면 png를 사용할 수 있습니다.
stib

그 추가 가치 -q:v 1에 여기에 매우 유용한 옵션이다 superuser.com/questions/318845/...
니콜라이 Shmyrev

27
mplayer -vo jpeg -sstep 5 file.avi

프레임을 5 초마다 jpeg 파일로 저장합니다.

그러나 파일의 끝에서 멈추지 않고 마지막 프레임의 사본을 계속 생성합니다. 이를 피하려면 다른 플레이어 또는 mplayer를 사용하여 비디오의 지속 시간을 초 단위로 찾으십시오.

mplayer -vo null -ao null -frames 0 -identify file.avi

"ID_LENGTH = 147.00"과 같은 줄을 찾으십시오.

길이에서 2를 빼고 -endpos옵션 에이 값을 사용하십시오 . 예를 들어 147 초 동영상의 경우 :

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi

이것은 mplayer 버그처럼 들립니다. 좋은 해결 방법.
quack quixote

이 명령을 사용하는 운영 체제를 적어도 언급 할 수 있습니까?
Tomáš Zato

5 년 전 이었지만 아마도 우분투 10.4 일 당시의 최신 우분투 데스크탑 일 것입니다.
Liam

1보다 짧은 단계를 어떻게 선택할 수 있습니까? 정수만 허용합니다.
fcpenha

요즘 은 데비안에서 mpv 0.27.0을 사용하여 mpv --vo=image --sstep=5 movie.mkv위에서 언급 한 버그 ( mpv 는 mplayer의 포크입니다) 없이 훌륭하게 작동합니다 .
Adam Katz

11

을 사용 ffmpeg하면 다음을 수행 할 수 있습니다.

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

이 명령은 비디오에서 4 초에 320 × 240 크기의 JPG 썸네일을 생성합니다. 시간과 파일 이름을 변경하는 스크립트에 이것을 입력하면 완료됩니다.

추가 정보 : 동영상의 X 초마다 썸네일 이미지 만들기


이것은 내가 원하는 것을하는 것처럼 보이지만 한 가지 문제가 있습니다. 각 반복에서 시작부터 파일을 처리하여 기하 급수적으로 느려집니다.
Liam

@Liam-오프셋 시간을 그대로두고 (1로 설정) -ss position플래그를 사용 하여 파일을 더 찾아 보는 것이 도움이됩니까? -ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
Nifle

1
@liam : 입력 비디오가 디코딩되기 전에 탐색 -ss이 수행 -i되도록 앞에 씁니다 . 속도가 빨라져야합니다. 출처
quack quixote

2
ffmpeg를 사용 하는 것이 더 좋고 훨씬 빠른 방법입니다. 아래 답변을 참조하십시오.
stib

stib의 솔루션은 최고의 IMO입니다.
그리핀

8

일종의 밀착 인화를 수행 하고 Unix와 유사한 OS를 사용하는 경우 Video Contact Sheet * NIX , short vcs 라고하는이 정교한 스크립트를 사용할 수 있습니다 .

백그라운드에서는 ffmpeg기본적으로 mplayer또는를 사용하므로 많은 비디오 형식을 처리 할 수 ​​있습니다. 동영상에서 스틸 이미지를 캡처하는 프로세스를 자동화하고 머리글과 바닥 글이있는 이미지로 구성합니다. 예를 들어 원하는 캡처 수 또는 시간 차이를 선택할 수 있습니다.

10 분 간격으로 호출은 다음과 같습니다.

vcs -i 10m input.avi

다른 조정에 대한 전체 명령 줄 옵션 목록을 확인하십시오 .

다음은 홈페이지에서 가져온 예제 밀착 인화입니다 .

여기에 이미지 설명을 입력하십시오


7

VLC 1.1.0 이상에서는 장면 비디오 필터를 사용할 수 있습니다.

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

위의 내용은 00:00:10에서 시작하여 00:00:11에서 끝나는 24 개 프레임 중 1 개를 저장합니다 (-장면 비율 = 24).

방금 테스트하여 새로 설치 한 Windows 8에서 VLC 2.0.3에서 작동하는지 확인했습니다 (추가 비디오 플러그인 또는 소프트웨어가 없음).

전체 문서 : http://wiki.videolan.org/How_to_create_thumbnails


2

VirtualDub 가 당신을 위해 이것을 할 수 있습니다

File-> Export->Image sequence

여기에 이미지 설명을 입력하십시오


이것은 모든 프레임을 이미지로 저장합니까?
Liam

예, 모든 프레임.
Shevek

대부분의 프레임을 건너 뛰어야합니다. 모든 프레임을 출력하면 너무 많은 저장 공간이 사용됩니다. 몇 초마다 하나의 프레임 만 있으면됩니다.
Liam

1

당신은 또한 이것을 시도 할 수 있습니다

VLC 명령 줄에서 ...

vlc "C : \ YOUR \ file \ path \ file.avi"-V 이미지 --image-out-prefix = capname --image-out-ratio = 60

file.avi는 캡처 할 비디오이고, capname은 저장된 이미지의 접두사입니다. 비율로 재생하고 싶을 수도 있습니다 (60은 60 개 이미지 중 1 개가 캡처됨을 의미합니다). 예를 들어 더 많은 명령을 추가 할 수 있습니다. --image-out-format jpeg는 캡을 png 대신 jpeg로 저장합니다. --snapshot-path를 사용하면 캡을 저장할 위치를 선택할 수 있습니다.

위의 소스


이 메시지가 나타납니다. 명령 행 옵션을로드 할 수 없습니다. 유효한지 확인하십시오.
Liam

우분투에서 알 수없는 옵션 또는 누락 된 필수 인수`--image-out-prefix = capname '
Liam

1

VirtualDub에서 프레임을 건너 뛸 수 있습니다. Video-> Frame Rate 메뉴에있는 "Decimate By"옵션을 사용하십시오. 예를 들어 "Decimate By 100"을 설정 한 다음 File-> Export-> Image sequence를 사용하면 100 번째 프레임마다 저장됩니다.

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