ffmpeg를 사용하여 비디오에서 키 프레임의 인덱스 추출


17

비디오에서 키 프레임을 추출하기 위해 ffmpeg를 사용하고 있습니다. 이것은 명령입니다 :

ffmpeg -i test2.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg

비디오에서 추출 된 각 키 프레임의 인덱스를 어떻게 얻을 수 있습니까? 예를 들어 첫 번째 I- 프레임의 경우 인덱스는 0이고 두 번째 I- 프레임의 경우 24입니다.



ffprobe를 사용하여 색인을 얻기 위해 출력을 사후 처리합니까?
dstob

@dstob 당신이 무슨 뜻인지 더 자세히 설명해 주시겠습니까? 나는 ffmpeg를 처음 사용합니다.
Faten Khalifa 2014 년

@LordNeckbeard 비디오 프레임의 프레임 번호입니다 (예 : 비디오의 첫 번째 프레임은 인덱스 0에 있습니다 비디오 프레임의 각 키 프레임의 인덱스를 알고 싶습니다.
Faten Khalifa

이미지 자체에 썸네일에 프레임 번호를 인쇄 하시겠습니까?
llogan

답변:


21

@dstob에서 언급했듯이 ffprobeI- 프레임과 관련 정보를 얻는 데 사용할 수 있습니다 . 다운로드 페이지에ffprobe 일부 정적 빌드가 포함되어 있으며 소스에서도 빌드 할 수 있습니다.

이것은 Linux / Unix를 사용한다고 가정합니다.

프레임 및 프레임 유형 추출

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1

grep명령은 줄을 필터링 I하고 -n옵션을 사용하여 색인을 계산합니다 . 이 cut명령은 출력의 첫 번째 열 (인덱스) 만 선택합니다. 이 인덱스는 0이 아닌 1을 기준으로합니다.

색인을 기반으로 출력 파일 이름 바꾸기

실제로이 색인을 목록으로 파이프 할 수 있습니다.

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1 > frame_indices.txt

그런 다음 모든 썸네일 목록도 만드십시오.

ls -1 thumbnails*.jpeg > thumbnails.txt

그런 다음이 두 가지를 함께 붙여 넣습니다.

paste thumbnails.txt frame_indices.txt > combined.txt

이제 목록에 썸네일 이름과 색인이 포함됩니다. 이를 기반으로 이름을 변경하십시오.

while read -r thumbnail index; do
  newIndex=$(echo $index - 1 | bc) # subtract 1 from the index
  mv -- "$thumbnail" "thumbnail-$newIndex.jpeg"  # rename file
done < combined.txt

이름을 바꿀 것입니다 위의 thumbnail-01.jpegthumbnail-0.jpeg. 출력 인덱스에는 제로 패딩이 없습니다. 5 자리 숫자로 0을 채우려면 다음을 사용하십시오 printf.

newIndex=$(printf '%05d' $(echo $index - 1 | bc))

Windows에서는 정확히 똑같이 ffprobe하지만 출력을 다르게 구문 분석합니다. 그래도 이름 바꾸기를 수행하는 방법을 모르겠습니다.


이 오류가 표시됩니다. 'grep'은 내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다.
Faten Khalifa

2
Windows를 사용하고 있기 때문입니다. 내가 말했듯이,이 대답은 Linux 또는 Unix를 가정합니다. 당신은 당신의 질문에 더 구체적이지 않았습니다. Cygwin 또는 Windows 용 유사한 GNU / Linux 계층을 사용하여 Windows에서도 동일하게 달성 할 수 있습니다 .
slhck

감사합니다. 한 가지 수정 : 첫 번째 명령의 인덱스는 모든 행에 대해 한 [FRAME]줄과 한 [/FRAME]줄 이 있기 때문에 3의 요인에 의해 벗어났다고 생각합니다 pict_type.
잭 오코너

2
@ JackO'Connor -of csv옵션을 사용하면 프레임 당 한 줄만 있습니다 ffprobe. 당신이 묘사하는 것은 기본 출력 형식입니다.
slhck

0

원래 언급 한대로 FFMPEG를 사용하려는 경우 다음을 사용하여 jpg를 만들뿐만 아니라 전체 또는 부분 목록을 나열 할 수 있습니다.

ffmpeg.exe \
  -i "C:\Users\UserName\Desktop\jpegs and list\VideoName.mp4" \
  -t 15 \
  -vf select="eq(pict_type\,PICT_TYPE_I)" \
  -vsync 2 \
  -s 160x90 \
  -f image2 thumbnails-%02d.jpeg \
  -loglevel debug 2>&1| for /f "tokens=4,8,9 delims=. " %d in ('findstr "pict_type:I"') do echo %d %e.%f>>"keyframe_list.txt"

-t 15시간 제한없이 제거 하거나 적합한 것으로 변경하십시오. -s 160x90 -f image2 thumbnail-%02d.jpeg축소판 그림 제거에 맞게 제거 하거나 변경 하십시오 .


Windows 7 CMD에서는 \에서 실패합니다. \에서 ^로 변경하면 : I "에서 실패합니다. Windows에서 작동하는 버전이 있습니까?
ChrisJJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.