ffmpeg로 프레임 수 가져 오기


답변:


158

참고 : MP4 / M4V / M4A / MOV에 편집 목록이 있으면 프레임 번호에 영향을 줄 수 있습니다. 아래 목록 수정을 참조 하세요.


ffprobe : 컨테이너 쿼리

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
  • 이것은 빠른 방법입니다.
  • 모든 형식 (예 : Matroska)이 N/A. 아래 나열된 다른 방법을 참조하십시오.

ffprobe : 프레임 수 계산

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
  • 이것은 느린 방법입니다.
  • -skip_frame nokey키 프레임 만 계산 하는 옵션을 추가합니다 .

ffmpeg : 프레임 수 계산

가지고 있지 않은 ffprobe경우 ffmpeg대신 사용할 수 있습니다 .

ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
  • 이것은 다소 빠른 방법입니다.
  • frame=콘솔 출력의 끝 부분을 참조하십시오 .
  • 키 프레임 만 계산 하려면 -discard nokey입력 옵션 (이전 -i)을 추가합니다 .

목록 수정

-ignore_editlist 1입력 옵션이 있는 MP4 / M4V / M4A / MOV 편집 목록은 무시하십시오 . 기본값은 편집 목록을 무시 하지 않는 것 입니다.

ffprobe 옵션의 의미

  • -v error 이렇게하면 "정보"출력 (버전 정보 등)이 숨겨져 구문 분석이 더 쉬워집니다.

  • -count_frames 스트림 당 프레임 수를 계산하고 해당 스트림 섹션에보고합니다.

  • -select_streams v:0 비디오 스트림 만 선택하십시오.

  • -show_entries stream=nb_frames또는 -show_entries stream=nb_read_frames단지에 대한 항목 표시 nb_frames또는 nb_read_frames.

  • -of default=nokey=1:noprint_wrappers=1출력 형식 (일명 "작성기")을로 설정 default하고 각 필드의 키 ( nokey=1)를 인쇄하지 않고 섹션 머리글 및 바닥 글 ( noprint_wrappers=1)을 인쇄하지 않습니다 . 과 같은 더 짧은 대안이 있습니다 -of csv=p=0.

또한보십시오


mediainfo

잘 알려진 mediainfo도구는 프레임 수를 출력 할 수 있습니다.

mediainfo --Output="Video;%FrameCount%" input.avi

MP4Box

MP4 / M4V / M4A 파일의 경우.

MP4Box gpac에서 프레임 수를 표시 할 수 있습니다.

MP4Box -info input.mp4

Media Info문제의 비디오 스트림에 대한 출력 의 행을 참조하십시오 .

Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples

이 예에서 비디오 스트림에는 2525 프레임이 있습니다.


박스 덤퍼

MP4 / M4V / M4A / MOV 파일의 경우.

boxdumperl-smash의 간단한 도구입니다. 많은 양의 정보를 출력합니다. 언더 stsz샘플 크기 상자 섹션을 참조 sample_count프레임의 수. 이 예에서 입력에는 1900 개의 비디오 프레임이 있습니다.

boxdumper input.mp4
  ...
  [stsz: Sample Size Box]
    position = 342641
    size = 7620
    version = 0
    flags = 0x000000
    sample_size = 0 (variable)
    sample_count = 1900
  • 파일에는 둘 이상의 stsz원자가 있을 수 있습니다 .

5
당신이 더 빠른 속도를 원하는 경우 nb_frames 믿을 충분한 경우 또는, 단순화 등 :ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
juanitogan

이렇게하면 답이 두 번 출력됩니다 (예 : 2600 \ n 2600). 특별한 이유가 있습니까?
jbodily

@jbodily 내 예 또는 juanitogan? 둘 중 하나를 사용하여 복제 할 수 없습니다. 여기에서 일할 것이 많지 않습니다.
llogan

+1은 명령 줄 도구에 대한 다른 답변과 달리 실제로 모든 명령 줄 옵션을 설명하기 때문입니다. 감사합니다.
Ray

1
첫 번째 옵션 인 컨테이너 쿼리는 count_frames로 인해 실제로 파일을 처리합니다. @juanitogan의 의견을 참조하십시오.
aggieNick02 jul.

23

Unix에서 이것은 매력처럼 작동합니다.

ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '

3
정말 좋은 것입니다. 오디오 스트림을 복사 할 필요가 없습니다. -an instat를 사용할 수 있습니다.
rekire

1
확인 @PrakharMohanSrivastava 이 답변
안토니오

4
사실, 이것은 빠르고 신뢰할 수있는 것 같습니다.ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1
Timothy Zorn

1
내 모닝 커피 :-)와 미소에 대한 @Michael 감사
로이드 무어

1
@TimothyZorn 당신은 내 하루를 만들었습니다!
Mladen Danic

13

대신 시간을 기준으로 계산하십시오.

그게 제가하는 일이고 저와 다른 많은 사람들에게 잘 작동합니다.) 먼저 아래 스 니펫에서 비디오 길이를 찾으십시오.

Seems stream 0 codec frame rate differs from container frame rate: 5994.00 
(5994/1) -> 29.97 (30000/1001)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/stu/Movies/District9.mov':
  Duration: 00:02:32.20, start: 0.000000, bitrate: 9808 kb/s
    Stream #0.0(eng): Video: h264, yuv420p, 1920x1056, 29.97tbr, 2997tbn, 5994tbc
    Stream #0.1(eng): Audio: aac, 44100 Hz, 2 channels, s16
    Stream #0.2(eng): Data: tmcd / 0x64636D74

Duration: hh:mm:ss.nn소스 비디오 클립 크기를 결정 하기 위해 일관되고 안전하게 찾을 수 있어야합니다 . 그런 다음 각 업데이트 줄 (CR, LF 없음)에 대해 현재 시간 표시에 대한 텍스트를 구문 분석 할 수 있습니다.

frame=   84 fps= 18 q=10.0 size=       5kB time=1.68 bitrate=  26.1kbits/s    
frame=   90 fps= 17 q=10.0 size=       6kB time=1.92 bitrate=  23.8kbits/s    
frame=   94 fps= 16 q=10.0 size=     232kB time=2.08 bitrate= 913.0kbits/s    

이러한 상태 줄에서 항상 완벽한 출력을 기대하지는 않도록주의하십시오. 여기에는 다음과 같은 오류 메시지가 포함될 수 있습니다.

frame=   24 fps= 24 q=-1.0 size=       0kB time=1.42 bitrate=   0.3kbits/s    
frame=   41 fps= 26 q=-1.0 size=       0kB time=2.41 bitrate=   0.2kbits/s    
[h264 @ 0x1013000]Cannot parallelize deblocking type 1, decoding such frames in
sequential order
frame=   49 fps= 24 q=26.0 size=       4kB time=0.28 bitrate= 118.1kbits/s    
frame=   56 fps= 22 q=23.0 size=       4kB time=0.56 bitrate=  62.9kbits/s    

시간이 있으면 간단한 수학 time / durration * 100 = % done입니다..


1
어리석은 일로 실례하지만 기간이 hh : mm : ss.nn 형식이고 시간이 항상 xx.yy 형식 인 경우 시간 / 기간을 어떻게 할 수 있습니까?
Omar Ali

2
@Omar, .NET 개발자로서 내가하는 일은 TimeSpan그것에서 만든 다음 currentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100). 시간 범위는 강력한 구문 분석 기능을 제공, 그것을 확인
흔들 Weitzhandler

훌륭한 솔루션, 내 시간은 hh : mm : ss : ms이므로이 3 년 동안 FFMPEG가 출력 시간 형식을 개선했다고 생각합니다.
ElektroStudios 2013

1
콘솔 출력은 29.97로 표시 될 수 있지만 30000/1001의 약자입니다. 23.98은 24000/1001이고 59.94는 60000/1001입니다.
llogan

참고로 이것은 가변 프레임 속도 비디오에는 작동하지 않습니다 (분명히).
Timothy Zorn 2017 년

8

모든 형식이 프레임 수 또는 총 지속 시간을 저장하는 것은 아닙니다. 저장하더라도 파일이 불완전 할 수 있으므로 ffmpeg는 기본적으로 둘 중 하나를 정확하게 감지하지 못합니다.

대신 파일의 끝을 찾아 시간을 읽은 다음 이동하는 동안 현재 시간을 세십시오.

또는 AVFormatContext->nb_index_entries적어도 손상되지 않은 AVI / MOV 또는 진행률 표시 줄을 사용하기에는 너무 느릴 수있는 라이브러리 FFMS2에서 제대로 작동해야하는 감지 된 기간을 시도 하거나 감지 할 수 있습니다 .


8

다음과 같이 시도하십시오.

ffmpeg -i "path to file" -f null /dev/null

프레임 번호를 stderr에 기록하므로 여기에서 마지막 프레임을 검색 할 수 있습니다.


8

ffprobe 다음 명령을 사용 하여 프레임 번호를 가져올 수 있습니다.

  1. 첫 번째 방법

ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v

데이터를 json형식 으로 인쇄하도록 지시 합니다.

select_streams v스트림 데이터를 ffprobe제공 하라고 말하고 video제거하면 audio정보도 제공됩니다.

출력은 다음과 같습니다.

{
    "streams": [
        {
            "index": 0,
            "codec_name": "mpeg4",
            "codec_long_name": "MPEG-4 part 2",
            "profile": "Simple Profile",
            "codec_type": "video",
            "codec_time_base": "1/25",
            "codec_tag_string": "mp4v",
            "codec_tag": "0x7634706d",
            "width": 640,
            "height": 480,
            "coded_width": 640,
            "coded_height": 480,
            "has_b_frames": 1,
            "sample_aspect_ratio": "1:1",
            "display_aspect_ratio": "4:3",
            "pix_fmt": "yuv420p",
            "level": 1,
            "chroma_location": "left",
            "refs": 1,
            "quarter_sample": "0",
            "divx_packed": "0",
            "r_frame_rate": "10/1",
            "avg_frame_rate": "10/1",
            "time_base": "1/3000",
            "start_pts": 0,
            "start_time": "0:00:00.000000",
            "duration_ts": 256500,
            "duration": "0:01:25.500000",
            "bit_rate": "261.816000 Kbit/s",
            "nb_frames": "855",
            "nb_read_frames": "855",
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0
            },
            "tags": {
                "creation_time": "2005-10-17 22:54:33",
                "language": "eng",
                "handler_name": "Apple Video Media Handler",
                "encoder": "3ivx D4 4.5.1"
            }
        }
    ]
}

2. 당신은 사용할 수 있습니다

ffprobe -v error -show_format -show_streams video_name

프레임 속도와 같은 정보를 선택하려면 다음 명령을 사용하십시오.

ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 video_name

비디오 정보에 대한 숫자 기반을 제공하는 문제는이 방법을 사용할 때 N/A출력으로 얻을 수 있다는 것입니다.

자세한 내용은이 페이지를 확인하십시오. FFProbe 팁


4

이 시도:

ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '

작동하지 않습니다 *.ts. 출력은 빈 줄입니다.
Victor Polevoy

3

내 댓글이 몇 개의 찬성 투표를 받았기 때문에 답변으로 남겨 두겠다고 생각했습니다.

ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1

인코딩이 수행되지 않으므로 속도가 빨라야합니다. ffmpeg파일을 demux하고 가능한 한 빨리 첫 번째 비디오 스트림을 읽습니다 (디코딩). 첫 번째 grep명령은 프레임을 표시하는 텍스트를 가져옵니다. 두 번째 grep명령은 그 숫자 만 가져옵니다. tail명령은 마지막 줄 (마지막 프레임 수)를 표시합니다.


2

stu의 대답을 기반으로합니다. 휴대폰에서 비디오의 프레임 속도를 찾은 방법은 다음과 같습니다. 나는 잠시 동안 다음 명령을 실행했습니다. 나는 참을성이 없어 ^ C를 누르기 전에 프레임 수를 약 10,000까지 올릴 수 있습니다.

$ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1
...
Press [q] to stop, [?] for help
[null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up.
frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0    
video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042%
Received signal 2: terminating.
$

그런 다음 "frame =", 프레임 수 7989 및 시간 00 : 04 : 26.30으로 시작하는 해당 줄에서 두 가지 정보를 가져 왔습니다. 먼저 시간을 초로 변환 한 다음 프레임 수를 초로 나누어 "초당 프레임 수"를 얻어야합니다. "초당 프레임"은 프레임 속도입니다.

$ bc -l
0*60*60 + 4*60 + 26.3
266.3

7989/(4*60+26.3)
30.00000000000000000000
$

내 비디오의 프레임 속도는 30fps입니다.


2

내가 할 수 있었던 유일한 정확한 것은 다음과 같습니다.

ffprobe -i my_video.mp4 -show_frames 2>&1|grep -c '^\[FRAME'

이것이 비디오에서 작동하는지 확인하려면 :

ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video

답변을 찬성했지만 동영상에 오디오가 포함되지 않은 경우에만 작동합니다. 포함 된 경우 다음이 작동합니다.ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Gobe ​​2005

2

necro 답변에 대해 죄송하지만 아마도 이것이 필요할 것입니다 (최근 ffmpeg 릴리스에 대한 해결책을 찾지 못했기 때문에.

ffmpeg 3.3.4를 사용하면 다음을 찾을 수 있습니다.

ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames"

마지막에 프레임 수를 출력합니다. 그것은 오디오가있는 비디오에서 나를 위해 일했습니다. 하지만 두 번 "nb_frames"줄을 제공하지만 첫 번째 줄은 내가 테스트 한 비디오의 실제 프레임 수입니다.


@ acidrums4 감사합니다. 이 방법이 오늘 구축 한 github의 최신 버전에서 작동하는지 확인했습니다.
Paul J

1

php_ffmpeg를 사용하면 영화의 모든 시간과 프레임을 얻을 수 있습니다. belows로

$input_file='/home/strone/workspace/play/CI/abc.rmvb';
$ffmpegObj = new ffmpeg_movie($input_file);
echo $ffmpegObj->getDuration();
    echo $ffmpegObj->getFrameCount();

그리고 세부 사항이 페이지에 있습니다.

http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php


1
Cmd ->

ffprobe.exe -v error -select_streams v:0 -show_entries stream=r_frame_rate,duration -of default=nw=1 "d:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4"

Result ->

r_frame_rate=24000/1001
duration=8177.794625

Calculation ->

Frames=24000/1001*8177.794625=196071

Proof -> 

ffmpeg -i "d:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4" -f null /dev/null
ffmpeg version N-92938-g0aaaca25e0-ffmpeg-windows-pacman Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8.2.0 (GCC)
  configuration: --pkg-config=pkg-config --pkg-config-flags=--static --extra-version=ffmpeg-windows-pacman --enable-version3 --disable-debug --disable-w32threads --arch=x86_64 --target-os=mingw32 --cross-prefix=/opt/sandbox/cross_compilers/mingw-w64-x86_64/bin/x86_64-w64-mingw32- --enable-libcaca --enable-gray --enable-libtesseract --enable-fontconfig --enable-gmp --enable-gnutls --enable-libass --enable-libbluray --enable-libbs2b --enable-libflite --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libzimg --enable-libzvbi --enable-libmysofa --enable-libaom --enable-libopenjpeg --enable-libopenh264 --enable-liblensfun --enable-nvenc --enable-nvdec --extra-libs=-lm --extra-libs=-lpthread --extra-cflags=-DLIBTWOLAME_STATIC --extra-cflags=-DMODPLUG_STATIC --extra-cflags=-DCACA_STATIC --enable-amf --enable-libmfx --enable-gpl --enable-avisynth --enable-frei0r --enable-filter=frei0r --enable-librubberband --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxvid --enable-libxavs --enable-avresample --extra-cflags='-march=core2' --extra-cflags=-O2 --enable-static --disable-shared --prefix=/opt/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32 --enable-nonfree --enable-decklink --enable-libfdk-aac
  libavutil      56. 25.100 / 56. 25.100
  libavcodec     58. 43.100 / 58. 43.100
  libavformat    58. 25.100 / 58. 25.100
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 47.100 /  7. 47.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'd:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.25.100
  Duration: 02:16:17.91, start: 0.000000, bitrate: 2497 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x800 [SAR 1:1 DAR 12:5], 2397 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      handler_name    : GPAC ISO Audio Handler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> wrapped_avframe (native))
  Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to '/dev/null':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.25.100
    Stream #0:0(und): Video: wrapped_avframe, yuv420p, 1920x800 [SAR 1:1 DAR 12:5], q=2-31, 200 kb/s, 23.98 fps, 23.98 tbn, 23.98 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc58.43.100 wrapped_avframe
    Stream #0:1(und): Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s (default)
    Metadata:
      handler_name    : GPAC ISO Audio Handler
      encoder         : Lavc58.43.100 pcm_s16le
frame=196071 fps=331 q=-0.0 Lsize=N/A time=02:16:17.90 bitrate=N/A speed=13.8x
video:102631kB audio:1408772kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

프레임 속도는 일반적으로 두 개의 매개 변수로 계산됩니다. r_frame_rate = 24000 / 1001 (= 23,97602397602397 ...) ffmpeg로 반올림 : 23.98 기간 = 시간 * 3600 + 분 * 60 + 초. 나머지 = 8177,91 기간 매개 변수 = 8177.794625 그러나 프레임 = 24000 / 1001 * 8177.794625 = 196071은 정확한 프레임 수를 제공합니다. (농담이 아닙니다).
Gerard Wensink 19 년

0

리눅스

ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null

루비

result = `ffmpeg -i #{path} -f null - 2>&1`
r = result.match("frame=([0-9]+)")
p r[1]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.