리눅스 커맨드 라인에서 비디오의 프레임 수를 어떻게 얻습니까?


30

비디오 파일이 있는데 그 안에있는 비디오 프레임 수를 가져오고 싶습니다. ffmpeg비디오 길이와 FPS를 얻는 데 사용할 수 있습니다 . 그러나 총 프레임 수에 대해 분명한 것을 볼 수 없습니다.

이론적으로는 프레임 수를 얻기 위해 길이 (초)와 FPS를 곱할 수 있어야하지만이 경우 길이 (34.43 초)와 프레임 속도 (29.97 fps)는 정수가 아닌 정수를 제공합니다. 내가 잘못하고 있다고 생각합니다.

완전히 자동화되고 그래픽이 아닌 방식으로 명령 행에서이 작업을 수행 할 수 있어야합니다. 나는 또한 이것이 정확하고 견적이 아니라는 것을 필요로합니다 (비디오 파일에서도 가능하다면)

tcprobe일부 파일을 사용해 보았습니다 . 일부 AVI 파일의 경우 작동하지만 일부 VOB 파일의 경우 tcprobe 출력에 프레임 수가 없습니다. 나는이 출력을 얻는다 :

[tcprobe] MPEG program stream (PS)
[tcprobe] summary for myfile.vob, (*) = not default, 0 = not detected
import frame size: -g 720x480 [720x576] (*)
     aspect ratio: 4:3 (*)
       frame rate: -f 29.970 [25.000] frc=4 (*)
                   PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
      audio track: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
                   PTS=2199.2763, bitrate=192 kbps
                   -D 3 --av_fine_ms 20 (frames & ms) [0] [0]

당신의 방정식은 당신에게 좋은 야구장 견적을 줄 것입니다; 부동 소수점 결과를 반올림하십시오. 정확한 수의 프레임이 필요한 경우 파일을 직접 검사해야합니다. 비디오 코덱의 특성으로 인해 한 방향에서 한 방향 또는 두 방향으로 추정치가 떨어질 수 있습니다.
quack quixote

이 올인원 파일 VOB입니까 아니면 DVD 스타일의 여러 파일 VOB입니까?
quack quixote

답변:


17

이것은 끔찍하고 어리 석고 느리지 만 작동하는 것 같습니다.

ffmpeg -i foo.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1

잘린 파일과 원시 스트림에서도 올바르게 작동합니다 (.vob 파일에 대해서는 아무것도 얻지 못합니다)


꽤 좋습니다. 내 경험상 그렇게 오래 걸리지 않습니다. 40 분 파일은 실행하는 데 약 <3 초가 걸립니다. "^ M"은 2 자 ^ 및 M이 아니므로 Control-V를 누른 다음 입력해야합니다. 나는 당신의 명령 대신에 다음을 사용했다. tr "^ M" '\ n'| grep '^ frame ='| perl -pe 's / ^ frame = \ s * ([0-9] +) \ s. * $ / \ 1 /'| tail -n 1 "frames ="
Rory

1
우분투 12.04에서는 FFmpeg 버전 자식-2013년 4월 15일-a4f03f0, 당신은 모두를 생략 할 수 있습니다 | tr ^M '\n'|tail -n 1. 또한 공간 frames=이 없어도 실패하지 않습니다. (어쩌면 무언가가 지난 4 년 동안 변경된.)
카밀 Goudeseune에게

나를 위해 이것은 서로 다른 값마다 매번 반환
CAMOBAP

1
Mediainfo 솔루션은 VOB와 함께 작동합니다. 대신 권장합니다. root @ lanparty : / mnt / films # mediainfo --fullscan Bugs_Bunny.vob | grep -i frame \ count 프레임 수 : 175715 프레임 수 : 183218
kevinf

32

ffprobe 미디어 파일에 대한 정보를 얻는 데 사용할 수 있습니다.

ffprobe -select_streams v -show_streams input.avi

스트림에 대한 세부 사항을 얻을 수 있습니다.

nb_frames=159697

를 찾으 nb_framesgrep:

ffprobe -select_streams v -show_streams input.avi 2>/dev/null | grep nb_frames | sed -e 's/nb_frames=//'

그것은 avi, mp4 등에서 작동합니다. 일부 컨테이너의 경우 mpeg와 같은 유효한 값을 표시하지 않습니다.

이 경우 작동합니다 ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l


좋은 생각. 비디오 스트림 만 선택하고 출력을 필터링하도록 명령을 약간 수정했습니다. 프레임 수만 제공합니다.
slhck 2016 년

1
MPEG-2와 함께 작동하는 두 번째 솔루션을 축하합니다!
malat

1
MKV 컨테이너에서는 작동하지 않습니다.
Cenk Alti


첫 번째 접근 방식은 VBR 인코딩 파일에서 실패한 것 같습니다. 두 번째 방법은 더 안정적입니다.
eek

16

나는 이것을 다른 질문 에 올렸다 . 패키지 tcprobe에서 도구를 사용하면 transcode정보에 프레임 수가 포함됩니다. -i스위치를 사용하여 파일에서 정보 덤프를 가져옵니다.

$ tcprobe -i foo.avi
[tcprobe] RIFF data, AVI video
[avilib] V: 29.970 fps, codec=XVID, frames=38630, width=512, height=384
[avilib] A: 48000 Hz, format=0x55, bits=16, channels=2, bitrate=128 kbps,
[avilib]    53707 chunks, 21768720 bytes, VBR
[tcprobe] summary for foo.avi, (*) = not default, 0 = not detected
import frame size: -g 512x384 [720x576] (*)
       frame rate: -f 29.970 [25.000] frc=4 (*)
      audio track: -a 0 [0] -e 48000,16,2 [48000,16,2] -n 0x55 [0x2000] (*)
                   bitrate=128 kbps
           length: 38630 frames, frame_time=33 msec, duration=0:21:28.954

프레임 수는 두 줄로 표시됩니다 (두 번째 출력 줄과 마지막 출력 줄).


그것은 좋은 대답처럼 보이고 일부 파일에서는 작동하지만 내가 가지고있는 일부 VOB 파일의 경우 출력에 해당 데이터가 없습니다. 나는 내가 얻은 결과로 질문을 업데이트했다
Rory

나는 tcprobe 가이 정보에 대한 파일 헤더를 검사 할 것으로 기대하지만 확실하지는 않습니다. 헤더에 포함되어 있지 않으면 tcprobe가 계산을 시도하지 않을 수 있습니다. 좋은 질문; 내가 당신에게 좋은 대답을 바랍니다.
quack quixote

프레임 수 출력이없는 VBR 인코딩 파일에서는 작동하지 않는 것 같습니다. 해상도, 종횡비 및 프레임 속도를 얻습니다.
eek

7

mediainfo --fullscan inputfile | grep "Frame count"대부분의 파일에서 잘 작동 한다는 것을 알았습니다 .

데비안 기반 시스템은 apt-get install mediainfo

출력 중 하나가 아닌 2 개의 라인을 얻는 경우 첫 번째 라인은 비디오 트랙이고 두 번째 라인은 오디오 트랙입니다. 가변 비트 전송률 오디오를 가진 파일에서 발생하는 것으로 보입니다.

편집 날짜 기준으로 .mkv, .m4v, .mp4, flv, vob 및 .avi 샘플에서 테스트되었습니다.

출처 : Linux의 명령 줄에서 비디오 파일 정보를 검색하는 방법은 무엇입니까? 우분투 맛에서 테스트.

여기서 OS에 사용할 수있는 mediainfo를 찾을 수 있습니다 .


4

ffprobe -select_streams v -show_frames -count_frames INPUT_FILE | grep pkt_duration_time =

지속 시간을 더하십시오. sed / awk가 더 좋을 수도 있고 그렇지 않을 수도 있습니다.

테스트를 통해 지금까지는 가장 신뢰할 수있는 것으로 나타났습니다. 정확한 프레임 수와 정확한 지속 시간을 얻습니다. mediainfo와 같은 다른 모든 도구는 다양한 프레임 속도로도 가가 보인다.


3

나는 프레임 수가 실제로 fps * 듀레이션의 두 배라는 것을 알았습니다 (왜, 나는 행복 할 것입니다).

내 대본에는 다음이 있습니다.

# Get duration and fps
duration=$($FFMPEG -i $input 2>&1 | sed -n "s/.* Duration: \([^,]*\), start: .*/\1/p")
fps=$($FFMPEG -i $input 2>&1 | sed -n "s/.*, \(.*\) tb.*/\1/p")

hours=$(echo $duration | cut -d":" -f1)
minutes=$(echo $duration | cut -d":" -f2)
seconds=$(echo $duration | cut -d":" -f3)
# For some reason, we have to multiply by two (no idea why...)
# Get the integer part with cut
frames=$(echo "($hours*3600+$minutes*60+$seconds)*$fps*2" | bc | cut -d"." -f1)

그리고 네, 어떤 이유로 든 정수 부분을 가져와야합니다. 의미가 없지만이 스크립트는 항상 내 비디오를 지금까지 올바르게 변환했습니다.


FPS는 초당 프레임 수 (또는 1 인칭 슈팅 게임 : D)를 나타내며 30 FPS가 있으면 비디오에 몇 초가 있는지 간단히 곱하면됩니다.
John T

예 John, 알아낼 수는 있지만 올바른 프레임 수를 얻기 위해 2를 곱 해야하는 이유는 설명하지 않습니다 ... 필자의 경우 프레임 수를 계산 한 후 ffmpeg를 시작했습니다. 배경을 설정하고 로그를 분석하여 진행률 표시 줄을 만듭니다. 로그에는 변환에 몇 개의 프레임이 통과했는지 표시됩니다. 전체 비디오가 변환되면 프레임 #은 int (seconds * fps * 2)이므로 내 코드이지만 ;-)
ℝaphink

궁금합니다. tcprobe내 대답 의 출력은 프레임 수를 정확히 초 * fps (반올림)로 지정합니다. 나는 당신이 ffmpeg의 기발한 모습을 볼 것으로 기대합니다. 다른 도구로 파일을 분석하여 동일한 수의 프레임을 표시하는지 확인 했습니까?
quack quixote

흠 ... 흥미 롭습니다. 나는 동영상을 시도하고 내가 가지고 seconds*fps=1001.59tcprobe=1002. 따라서 분명히 tcprobe2를 곱할 필요가 없습니다. 그렇다면 왜 ffmpeg가 로그를 변환 할 때 로그에서 두 배 큰 숫자를 제공합니까?
ℝaphink

2
인터레이스 영상입니까? 그렇다면 프레임 당 두 개의 필드가 있으며 필드 수를 제공 할 수 있습니다.
stib

3

우분투에서 테스트되었습니다.

melt icecap.mp4 -consumer xml
  • melt-melt은 MLT 프레임 워크를위한 테스트 도구로 사용되었지만 강력한 멀티 트랙 명령 줄 지향 비디오 편집기이기도합니다. 오디오 및 비디오 파일을위한 최소한의 미디어 플레이어로도 사용할 수 있습니다.

  • -consumerid [: arg] [name = value] *
    소비자 설정 (싱크)

  • xml -소비자 (싱크)를 XML 형식 출력으로 설정

  • <property name="length">nnnn</property>-프레임 수를 표시합니다. 여기서 프레임 nnnn수와 동일한 정수로 대체됩니다.

녹지 않으면 Ubuntu 및 기타 데비안 기반 시스템에 설치할 수 있습니다. sudo apt-get install melt


1
이것은 매우 짧습니다. 기능, 작동 이유 등을 확장하고 싶습니까?
David

이것은를 통해 프레임 수를 제공하지 않는 h264 mp4 파일에서 잘 작동합니다 mediainfo -fullscan filename.
Geek

3

mediainfogrep, 대기, 아무것도없이 직접 :

mediainfo --Inform='Video;%FrameCount%' $the_file

다른 정보는 mediainfo --info-parameters


0

ffprobe에서 얻은 값을 더하고 곱하여이를 수행 할 수 있습니다.

참고 : ffprobe는 ffmpeg의 Linux 버전 인 libav (avconv)의 일부입니다.

#your command -
 ffprobe man.avi

이 작업을 수행하면 초당 프레임 수와 클립 지속 시간이 표시됩니다.

클립의 지속 시간을 초로 변환하고 해당 값에 초당 프레임 수를 곱하십시오.

가장 가까운 숫자를 반올림하십시오.


Ubuntu 14.04에서는 LTS ffprobe를 사용할 수 없지만 avprobe에서 호출 되는 항목이 있습니다 libav-tools(또한 제공 avconv). 그러나 내 측면에서는 적어도 시도한 형식이 아닌 여러 프레임을 인쇄하지 않습니다. 그냥 인쇄하고 avprobe -i인쇄하는 것도 슬프게도 형식에 관한 작은 부분 일뿐입니다. -v debug그것으로 도 설치된 하드웨어 및 소프트웨어의 멋진 속성 만 알려 주지만 검사 할 파일 / 스트림에 대한 흥미로운 정보는 하나도 없습니다. 아마도 사용 가능한 무수한 옵션 중 일부에 숨겨져있을 것입니다. 누가 알아?
티노

@Tino ffprobe는 ffmpeg 패키지의 일부로 제공됩니다. avconv는 ffmpeg의 포크이며 혼란을 야기했습니다. 참조 : stackoverflow.com/questions/9477115/...
장로 긱

@ElderGeek 우분투 14.04 LTS의 경우 ffmpeg공식 저장소 에는 없습니다 . 제대로 준 링크를 상태 : FFmpeg에 우분투 15.04 "생생한에서 vervet"에 돌아왔다. . 그러나 이제 16.04 LTS가 종료됨에 따라 상황이 변경되었습니다.
티노

@Tino 사실입니다. 그러나 나는 저장소에 존재하지 않기 때문에 사용할 수 없습니다. Trusty (14.04)에서 사용할 수 있습니다. ffmpeg.org/download.html
Geek

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]

-2

가장 좋은 방법 : (ffmpeg로 확인 된 올바른 매개 변수를 계산하여 직접)

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"

결과->

r_frame_rate=24000/1001
duration=8177.794625

계산->

Frames=24000/1001*8177.794625=196071 (exactly... ;P)

증명->

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
shareeditdeleteflag

I GET r_frame_rate = 1분의 25 시간 = N / A
장로 긱
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.