누구든지 ffmpeg를 사용하여 비디오 파일에서 총 프레임 수를 가져 오는 방법을 알고 있습니까? ffmpeg의 렌더 출력은 현재 프레임을 표시하며 진행률을 백분율로 계산하려면 프레임 수가 필요합니다.
답변
참고 : 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 파일의 경우.
boxdumper
l-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
원자가 있을 수 있습니다 .
답변
Unix에서 이것은 매력처럼 작동합니다.
ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '
답변
대신 시간을 기준으로 계산하십시오.
그게 제가하는 일이고 저와 다른 많은 사람들에게 잘 작동합니다.) 먼저 아래 스 니펫에서 비디오 길이를 찾으십시오.
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
입니다..
답변
모든 형식이 프레임 수 또는 총 지속 시간을 저장하는 것은 아닙니다. 저장하더라도 파일이 불완전 할 수 있으므로 ffmpeg는 기본적으로 둘 중 하나를 정확하게 감지하지 못합니다.
대신 파일의 끝을 찾아 시간을 읽은 다음 이동하는 동안 현재 시간을 세십시오.
또는 AVFormatContext->nb_index_entries
적어도 손상되지 않은 AVI / MOV 또는 진행률 표시 줄을 사용하기에는 너무 느릴 수있는 라이브러리 FFMS2에서 제대로 작동해야하는 감지 된 기간을 시도 하거나 감지 할 수 있습니다 .
답변
다음과 같이 시도하십시오.
ffmpeg -i "path to file" -f null /dev/null
프레임 번호를 stderr에 기록하므로 여기에서 마지막 프레임을 검색 할 수 있습니다.
답변
ffprobe
다음 명령을 사용 하여 프레임 번호를 가져올 수 있습니다.
- 첫 번째 방법
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 팁
답변
이 시도:
ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '
