Câu trả lời:
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
N/A
. Xem các phương pháp khác được liệt kê bên dưới.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
tùy chọn để chỉ đếm khung hình chính.Nếu bạn không có, ffprobe
bạn có thể sử dụng ffmpeg
thay thế:
ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
frame=
gần cuối đầu ra bảng điều khiển.-discard nokey
tùy chọn đầu vào (trước -i
) để chỉ đếm khung hình chính.Bỏ qua danh sách chỉnh sửa MP4 / M4V / M4A / MOV với -ignore_editlist 1
tùy chọn đầu vào. Mặc định là không bỏ qua danh sách chỉnh sửa.
-v error
Điều này ẩn đầu ra "thông tin" (thông tin phiên bản, v.v.) giúp phân tích cú pháp dễ dàng hơn.
-count_frames
Đếm số khung hình trên mỗi luồng và báo cáo trong phần luồng tương ứng.
-select_streams v:0
Chỉ chọn luồng video.
-show_entries stream=nb_frames
hoặc -show_entries stream=nb_read_frames
Chỉ hiển thị mục nhập cho nb_frames
hoặc nb_read_frames
.
-of default=nokey=1:noprint_wrappers=1
Đặt định dạng đầu ra (hay còn gọi là "người viết") thành default
, không in khóa của mỗi trường ( nokey=1
) và không in đầu trang và chân trang ( noprint_wrappers=1
) của phần. Có những lựa chọn thay thế ngắn hơn như -of csv=p=0
.
Công mediainfo
cụ nổi tiếng có thể xuất ra số lượng khung hình:
mediainfo --Output="Video;%FrameCount%" input.avi
Đối với tệp MP4 / M4V / M4A.
MP4Box
từ gpac có thể hiển thị số khung hình:
MP4Box -info input.mp4
Tham khảo Media Info
dòng trong đầu ra cho luồng video được đề cập:
Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples
Trong ví dụ này, luồng video có 2525 khung hình.
Đối với tệp MP4 / M4V / M4A / MOV.
boxdumper
là một công cụ đơn giản từ l-smash. Nó sẽ xuất ra một lượng lớn thông tin. Dưới stsz
ô kích thước mẫu phần tham khảo để sample_count
biết số lượng khung. Trong ví dụ này, đầu vào có 1900 khung hình video:
boxdumper input.mp4
...
[stsz: Sample Size Box]
position = 342641
size = 7620
version = 0
flags = 0x000000
sample_size = 0 (variable)
sample_count = 1900
stsz
nguyên tử.ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
Trong Unix, điều này hoạt động giống như sự quyến rũ:
ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '
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
Đó là những gì tôi làm và nó hiệu quả với tôi và nhiều người khác.) Trước tiên, hãy tìm thời lượng của video trong đoạn mã dưới đây:
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
Bạn sẽ có thể tìm thấy một cách nhất quán và an toàn Duration: hh:mm:ss.nn
để xác định kích thước video clip nguồn. Sau đó, đối với mỗi dòng cập nhật (CR, không có LF), bạn có thể phân tích cú pháp văn bản cho mốc thời gian hiện tại là:
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
Chỉ cần lưu ý rằng không phải lúc nào cũng mong đợi kết quả hoàn hảo từ những dòng trạng thái này. Chúng có thể bao gồm các thông báo lỗi như sau:
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
Một khi bạn có thời gian, nó rất đơn giản toán học: time / durration * 100 = % done
.
TimeSpan
từ nó, sau đó sử dụng currentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100)
. Các TimeSpan cũng cung cấp một chức năng Parse mạnh mẽ, check it out
Không phải tất cả các định dạng đều lưu trữ số lượng khung hình hoặc tổng thời lượng của chúng - và ngay cả khi chúng có, tệp có thể không đầy đủ - vì vậy ffmpeg không phát hiện chính xác một trong số chúng theo mặc định.
Thay vào đó, hãy thử tìm đến cuối tệp và đọc thời gian, sau đó đếm thời gian hiện tại trong khi bạn đi.
Ngoài ra, bạn có thể thử AVFormatContext->nb_index_entries
hoặc thời lượng được phát hiện, sẽ hoạt động trên AVI / MOV tốt, ít nhất là không bị hư hại, hoặc thư viện FFMS2, có thể quá chậm để làm phiền thanh tiến trình.
Bạn có thể sử dụng ffprobe
để lấy số khung bằng các lệnh sau
ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
yêu cầu in dữ liệu ở json
định dạng
select_streams v
sẽ yêu ffprobe
cầu chỉ cung cấp cho chúng tôi video
dữ liệu luồng và nếu bạn xóa dữ liệu đó, nó cũng sẽ cung cấp cho bạn audio
thông tin
và đầu ra sẽ như thế nào
{
"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. bạn có thể sử dụng
ffprobe -v error -show_format -show_streams video_name
sẽ cung cấp cho bạn dữ liệu truyền trực tuyến, nếu bạn muốn thông tin đã chọn như tốc độ khung hình, hãy sử dụng lệnh sau
ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 video_name
đưa ra một con số dựa trên thông tin video của bạn, vấn đề là khi bạn sử dụng phương pháp này, bạn có thể nhận được kết N/A
quả đầu ra.
để biết thêm thông tin, hãy xem trang này Mẹo FFProbe
thử cái này:
ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '
*.ts
. Đầu ra là một dòng trống.
Vì nhận xét của tôi nhận được một số phiếu tán thành, tôi nghĩ rằng tôi sẽ để nó như một câu trả lời:
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
Điều này sẽ nhanh chóng, vì không có mã hóa nào được thực hiện. ffmpeg
sẽ chỉ demux tệp và đọc (giải mã) luồng video đầu tiên càng nhanh càng tốt. Lệnh đầu tiên grep
sẽ lấy văn bản hiển thị khung. Lệnh thứ hai grep
sẽ chỉ lấy số từ đó. Các tail
lệnh sẽ chỉ hiển thị các dòng cuối cùng (số khung hình cuối cùng).
để xây dựng trên câu trả lời của stu. đây là cách tôi tìm thấy tốc độ khung hình cho video từ điện thoại di động của mình. tôi đã chạy lệnh sau trong một lúc. tôi để số khung lên đến khoảng ~ 10.000 trước khi tôi mất kiên nhẫn và nhấn ^ C:
$ 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.
$
sau đó, tôi lấy hai phần thông tin từ dòng đó bắt đầu bằng "frame =", số khung, 7989 và thời gian, 00: 04: 26.30. Trước tiên, bạn cần chuyển đổi thời gian thành giây và sau đó chia số khung hình cho từng giây để có được "khung hình trên giây". "khung hình trên giây" là tốc độ khung hình của bạn.
$ bc -l
0*60*60 + 4*60 + 26.3
266.3
7989/(4*60+26.3)
30.00000000000000000000
$
tốc độ khung hình cho video của tôi là 30 khung hình / giây.
Điều chính xác duy nhất mà tôi có thể làm là như sau:
ffprobe -i my_video.mp4 -show_frames 2>&1|grep -c '^\[FRAME'
Để đảm bảo điều này hoạt động với video:
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
Xin lỗi vì câu trả lời chưa xác định, nhưng có lẽ sẽ cần điều này (vì tôi không tìm thấy giải pháp cho các bản phát hành ffmpeg gần đây.
Với ffmpeg 3.3.4, tôi thấy có thể tìm thấy những điều sau:
ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames"
Cuối cùng, nó sẽ xuất số khung hình. Nó phù hợp với tôi trên các video có âm thanh. Tuy nhiên, nó cho hai dòng "nb_frames", nhưng dòng đầu tiên là số khung hình thực tế trên các video tôi đã thử nghiệm.
Tôi sử dụng php_ffmpeg thì tôi có thể lấy mọi lúc và mọi khung hình của một bộ phim. Như dưới
$input_file='/home/strone/workspace/play/CI/abc.rmvb';
$ffmpegObj = new ffmpeg_movie($input_file);
echo $ffmpegObj->getDuration();
echo $ffmpegObj->getFrameCount();
Và sau đó chi tiết là trên trang.
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
linux
ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null
hồng ngọc
result = `ffmpeg -i #{path} -f null - 2>&1`
r = result.match("frame=([0-9]+)")
p r[1]