VLC 또는 FFmpeg를 사용하여 비디오에서 "10 프레임마다 하나씩"추출


12

과학적인 목적으로 비디오의 "정확하게 10 프레임 당 1 프레임"을 추출하려고합니다 (즉, 추출 1, 9를 남겨두고 반복). 비디오는 105 프레임, 3.5 초, 29.97fps (h.264, .mov, Nikon D3100에서 제작)입니다.

나는 한 여기에 업로드 .

VLC

아래 명령은 10 프레임을 생성하지만 6 이미지 만 생성합니다. 다른 장면 비율을 시도했지만 어느 프레임도 정확한 수의 프레임을 생성하지 않습니다 (정확하지도 않음).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

누군가 문제가 무엇인지 알려주십시오.

FFmpeg

FFmpeg는 내 목적에 맞는 명령을 가지고 있지 않은 것 같습니다. 아래 명령은 초당 3 프레임을 추출하지만 FPS가 정확히 30 (2.97이 아님)이므로 올바른 결과를 얻지 못합니다.

또한 FFmpeg 조차도이 명령을 사용하여 올바른 수의 프레임을 제공하지 않습니다. 비디오의 3.5 초 동안 최대 10 프레임을 기대하지만 얻을 수있는 것은 12 프레임입니다!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

원하는 것을 어떻게 달성 할 수 있습니까?


1
BTW -sameq는 아마도 당신이 생각하는 것을하지 않으며 현재 버전 (실제 ffmpeg, 즉 그것이 Ubuntu 가짜 ffmpeg인지 확실하지 않습니다)에서 제거되었습니다. 대신 qscale을 사용하십시오.
stib

답변:


21

10 프레임마다 1 프레임 선택

select비디오 필터를 사용하여 다음 ffmpeg을 수행 할 수 있습니다 .

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • JPG 출력의 경우로 품질을 변경할 수 있습니다 -q:v. 유효 범위는 2 (최고 품질) ~ 31 (최저 품질)입니다. PNG로 대신 출력하려면이 옵션이 필요하지 않습니다.

  • 이가 출력 img_001.jpg, img_002.jpg, img_003.jpg, 등


매우 흥미로운 것처럼 보이지만 특정 버전이나 추가 컴파일 된 것이 필요한 것 같습니다. 나는 "수 unrecognized option '-filter:v'는 FFmpeg 버전 SVN - r0.5.1-4"와 "0.5.1-1ubuntu1.3을"(--enable-avfilter --enable-avfilter-lavf --enable-VDPAU --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect- -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk

또한 명령을 실행할 수없고 ffmpeg 창 N-35709-g7d531e8에서 다음 오류를 수신 할 수 있습니다. [select @ 017EBB00] [Eval @ 0022DC08] 누락 ')'또는 'mod (n \, 10)'에서 너무 많은 인수 select @ 017EBB00] 'not (mod (n \, 10))'식을 구문 분석하는 동안 오류가 발생했습니다. 인수 'not (mod (n \, 10))'을 사용하여 'select'필터를 초기화하는 동안 오류가 발생했습니다. 필터를 여는 중 오류가 발생했습니다!
wmac 5

@mivk 우분투 저장소의 FFmpeg 버전에는 필터링 기능이 없습니다. FFmpeg 컴파일 해야합니다 .
llogan

1
@ wmac Windows가 작은 따옴표를 좋아하지 않는 것 같습니다. 큰 따옴표로 변경하십시오 : ".
llogan

1
@LordNeckbeard, 감사합니다. 정확하게 실행되고 전체 문제가 해결되었습니다. 정말 당신의 도움에 감사드립니다.
wmac

4

귀하의 질문에서 가장 중요한 부분은 비디오가 30이 아닌 초당 29.97 프레임을 사용한다는 사실입니다. Pesky NTSC.

어쨌든 모든 프레임을 추출한 다음 필요하지 않은 프레임 을 제거하는 것이 가장 쉬운 방법이라고 생각 합니다.

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

그런 다음 필요없는 것을 제거하십시오. 매 10 번째 프레임은로 끝나기 때문에 다른 모든 프레임 1.jpg만 가져갈 수 있습니다.

find . -maxdepth 1 -not -iname "*1.jpg"

… 일단 당신이 이것들을 제거하고 싶은 것이 확실하다면 :

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

당신이 사용할 수있는 경우 mencoder, 당신은 시도 할 수 framestep설명한대로 옵션을 문서에 같이 framestep=10귀하의 경우. 나는 개인적으로 그것을 설치 / 시도 할 수 없었다.


1
당신의 도움과 편집에 대단히 감사합니다. 나는 mencoder를 시도했고 그조차도 문제가 있습니다! 코덱이나 컨테이너와 관련이 있다고 생각합니다. ffmpeg는 아래 명령으로 정확히 105 프레임을 추출합니다. ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg % 03d.jpg 그러나 mencoder는 90 프레임 만 추출합니다 !!! 아래 명령으로 : mplayer -vo png 1.mov framestep = 10을 사용하면 잘못된 수의 프레임이 생성됩니다. 나는 세 가지 (ffmpeg, vlc 및 mencoder) 모두가 간단한 작업을 올바르게 수행 할 수없는 방법에 충격을 받았습니다. VLC 웹 사이트에 버그 보고서를 제출했습니다. 다시 감사합니다.
wmac

0

먼저 비디오를 일련의 원시 rgb24 또는 rgb32 이미지로 변환해야한다면 원래 형태로 이미지가 아닐 수도있는 비정상적인 프레임 유형이 포함되어 있기 때문에 올바른 수의 프레임을 얻을 수 있습니다. ?

원본 레이저 디스크에서 전체 비디오는 개별 프레임 번호가 1 ~ 10,000 이상인 일련의 이미지로 구성되었으므로 향후 변환 또는 조작을위한 기준을 설정하는 올바른 방법입니다.

업계는이 이상한 압축 아이디어로 바꾸어 단순히 돈을 삭감하고 과학적인 형태의 처리 숫자를 손상시켰다.

오디오를 완전히 잃지 않도록 먼저 오디오를 웨이브 파일로 추출해야합니다. FFMPEG는 추출 된 각 이미지에 식별 정보를 넣는 것 같습니다. 방금 추출한 이미지에서 이미지를 함께 묶으려고 시도하고 동일한 확장자를 가진 다른 소스의 다른 이미지를 혼합하면 ffmpeg는 모든 중간에 조각화하려는 이미지를 무시합니다. .

레이저 디스크 형식의 경우 프레임 속도는 순차 이미지를 표시하는 속도에 따라 간단하게 결정되며 이미지 자체에 의해 제어되지 않습니다.

FFMPEG는 모든 종류의 이미지를 올바르게 처리하고 표시하기 위해 예술 대신 과학으로부터 교훈을 얻을 수 있습니다. 또는 전체 AV 산업 자체 일 수도 있습니다. 업계에서는 실제로 하드웨어 기능을 개선하고 많은 메모리 / 스토리지가 필요한 원시 데이터를 사용해야합니다. 정확성과 정확성을 위해 원시 데이터를 능가하는 것은 없습니다.

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