2016-07-07 2 views
2

비디오에서 ffmpeg를 사용하여 프레임 번호로 표시된 특정 프레임의 목록을 추출하려고합니다. 그래서 정확히 'test_video.mp4'에서 하나의 프레임을 추출하고 150이라는 프레임 번호를 추출하려고합니다. I 프레임의 목록을 정확한하려는 경우 나는 [100, 110, 127, 270, 300]로, 등을 다음 명령ffmpeg를 사용하여 특정 프레임의 목록 추출

ffmpeg -i test_video.mp4 -vf "select=gte(n\, 150)" -vframes 1 ~/test_image.jpg

그러나 무엇을 사용할 수 있습니까? 이 페이지 (https://ffmpeg.org/ffmpeg-filters.html#select_002c-aselect)를보고 있었고 프레임 번호, 타임 스탬프 등의 패리티를 기반으로 여러 프레임을 추출하는 방법이 있지만 볼일을 수행 할 수없는 구문을 찾을 수 없습니다.

%03d이 주어진 프레임 번호로 바뀌는 명명 규칙 인 out_image%03d.jpg으로 주어진 프레임 목록을 추출하는 것이 이상적입니다. 타임 스탬프도 사용할 수 있습니다.

이 방법이 있습니까?

+1

다음과 같은 구문을 사용하여 많은 조합을 시도했다 : 'ffmpeg -i Hamlet.mp4 -vf'select = eq (1000 \, n) + eq (150 \, n) '-f image2 out_image % 03d. jpg' - 그러나 이것은 내가 예상했던 것을하지 않았다. 그게 프레임 150부터 시작해서 다음 프레임 151을주었습니다. (그리고 그 다음) ...이 경우 선택은 멈추고 스트림에서 시작됩니다 .... 나는 그걸 좀 더 연주 할 것입니다. . 도움을 주신 덕분에 –

답변

6

사용

ffmpeg -i in.mp4 -vf select='eq(n\,100)+eq(n\,184)+eq(n\,213)' -vsync 0 frames%d.jpg 

는 FFmpeg은 주로 시간 제한 비디오, 즉 미디어의 프로세서이다 프레임 레이트 또는 샘플 속도와 같은 순환 속도로. 출력은 소스와 동일한 비율이어야한다고 가정합니다. 부적합한 프레임이 제공되면, 그렇게하지 않는 한 중복됩니다. -vsync 0이 추가됩니다.이 경우 복제를 억제하도록 알려줍니다.

+0

감사합니다. 필요한만큼 정확하게 작동합니다. –

1

매우 순진 대답은 ...

#! /bin/sh -e 
# framegrab v0.1 

frames="$1" 
filename="$2" 
printf '%s' "$frames" | 
sed 's:\[\|\]::g; s:[, ]\+:\n:g' | 
xargs printf '%03d\n' | 
xargs -IFRAME ffmpeg -i "$filename" -vf "select=eq(n\,FRAME)" -vframes 1 out_imageFRAME.jpg 

이 인수 목록과 전화 :

framegrab '[100, 110, 127, 270, 300]' test_video.mp4 
+0

! 혼자서 알아 내기가 어려워서 프레임 번호 당 하나의 ffmpeg 프로세스를 실행합니까, 아니면 하나의 ffmpeg 호출을 통해 원하는 프레임을 모두 얻고 있습니까? –

+0

나는 이것을 작동시키지 못했고 5 개의 프레임 번호 목록이 주어 지더라도 하나의 이미지 파일 만 출력한다. –

+0

그래서'sed 's : \ [:: g; s : \] :: g; s /, */\ n/g '|'와'sed': \ [:: g; s : \] :: g; s /, *// g '|',하지만 이제는 ffmpeg를 여러 번 실행하는 것을 볼 수 있습니다. 이것은 기술적으로 작동하지만 임베디드 시스템에 이상적이지는 않습니다. 저는 ffmpeg가이를 처리 할 수있는 방법이 있기를 바랬습니다. –

관련 문제