Yanıtlar:
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
N/A
. Aşağıda listelenen diğer yöntemlere bakın.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
Yalnızca ana kareleri sayma seçeneğini ekleyin .Eğer yoksa bunun yerine ffprobe
kullanabilirsiniz ffmpeg
:
ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
frame=
Konsol çıktısının sonuna yakın bir yere bakın .-discard nokey
giriş seçeneğini (önce -i
) ekleyin .-ignore_editlist 1
Giriş seçeneği ile MP4 / M4V / M4A / MOV düzenleme listesini yoksayın . Standart etmektir değil düzenleme listesini görmezden.
-v error
Bu, ayrıştırmayı kolaylaştıran "bilgi" çıktısını (sürüm bilgisi, vb.) Gizler.
-count_frames
Akış başına kare sayısını sayın ve ilgili akış bölümünde bildirin.
-select_streams v:0
Yalnızca video akışını seçin.
-show_entries stream=nb_frames
veya -show_entries stream=nb_read_frames
sadece girişini göster nb_frames
veya nb_read_frames
.
-of default=nokey=1:noprint_wrappers=1
Çıktı formatını (diğer adıyla "yazar") olarak ayarlayın default
, her alanın anahtarını ( nokey=1
) yazdırmayın ve bölüm üstbilgisini ve altbilgisini ( noprint_wrappers=1
) yazdırmayın . Gibi daha kısa alternatifler var -of csv=p=0
.
İyi bilinen mediainfo
araç, kare sayısını verebilir:
mediainfo --Output="Video;%FrameCount%" input.avi
MP4 / M4V / M4A dosyaları için.
MP4Box
gpac'den kare sayısını gösterebilir:
MP4Box -info input.mp4
Söz Media Info
konusu video akışı için çıktıdaki satıra bakın :
Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples
Bu örnekte, video akışı 2525 kareye sahiptir.
MP4 / M4V / M4A / MOV dosyaları için.
boxdumper
l-smash'tan basit bir araçtır. Büyük miktarda bilgi verecektir. stsz
Örnek boyut kutusu bölümü altında sample_count
çerçeve sayısı için bakın . Bu örnekte, giriş 1900 video karesine sahiptir:
boxdumper input.mp4
...
[stsz: Sample Size Box]
position = 342641
size = 7620
version = 0
flags = 0x000000
sample_size = 0 (variable)
sample_count = 1900
stsz
atom içerebileceğini unutmayın .ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
Unix'te bu, çekicilik gibi çalışı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
Yaptığım şey bu ve benim ve diğerleri için harika çalışıyor.) İlk olarak, aşağıdaki kod parçacığında videonun uzunluğunu bulun:
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
Kaynak video klibin boyutunu belirlemek için tutarlı ve güvenli bir şekilde bulabilmeniz gerekir. Daha sonra, her güncelleme satırı için (CR, LF yok), şu adresteki mevcut zaman işaretinin metnini ayrıştırabilirsiniz:
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
Bu durum satırlarından her zaman mükemmel çıktı beklememek için dikkatli olun. Aşağıdakiler gibi hata mesajları içerebilirler:
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
Vaktiniz sonra, basit matematik geçerli: time / durration * 100 = % done
.
Tüm biçimler kare sayısını veya toplam süresini saklamaz - ve öyle olsalar bile dosya eksik olabilir - bu nedenle ffmpeg varsayılan olarak ikisini de doğru şekilde algılamaz.
Bunun yerine, dosyanın sonuna gitmeyi deneyin ve saati okuyun, ardından giderken geçerli saati sayın.
Alternatif olarak, AVFormatContext->nb_index_entries
en azından hasarsız AVI / MOV üzerinde çalışması gereken algılanan süreyi veya bir ilerleme çubuğu için muhtemelen çok yavaş olan kütüphane FFMS2'yi deneyebilirsiniz.
ffprobe
Aşağıdaki komutlarla çerçeve numarasını almak için kullanabilirsiniz
ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
veriyi yazdırmayı söyleyen json
formatta
select_streams v
ffprobe
bize sadece video
akış verilerini vermenizi söyleyecek ve onu kaldırırsanız, sizeaudio
bilgi de
ve çıktı şöyle olacak
{
"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. kullanabilirsiniz
ffprobe -v error -show_format -show_streams video_name
size veri akışını sağlayacak, kare hızı gibi seçilmiş bilgileri istiyorsanız, aşağıdaki komutu kullanın
ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 video_name
Bu, video bilgilerinize bir sayı temelini verir, sorun şu ki, bu yöntemi kullandığınızda bir N/A
çıktı olarak .
daha fazla bilgi için bu sayfayı kontrol edin FFProbe İpuçları
bunu dene:
ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '
*.ts
. Çıktı boş bir satırdır.
Yorumum birkaç olumlu oy aldığından, bunu bir cevap olarak bırakacağımı düşündüm:
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
Kodlama yapılmadığından bu hızlı olmalıdır. ffmpeg
sadece dosyayı demux yapacak ve ilk video akışını olabildiğince çabuk okuyacaktır (kodunu çözecektir). İlk grep
komut, çerçeveyi gösteren metni alacaktır. İkinci grep
komut bundan sadece sayıyı alacaktır. tail
Komut sadece son çizgiyi (son kare sayısı) gösterecektir.
stu'nun cevabını geliştirmek için. Cep telefonumdaki bir videonun kare hızını şu şekilde buldum. Bir süre aşağıdaki komutu çalıştırdım. sabırsızlanıp ^ C'ye basmadan önce kare sayısının ~ 10.000'e çıkmasına izin verdim:
$ 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.
$
sonra, "kare =", kare sayısı, 7989 ve saat 00: 04: 26.30 ile başlayan bu satırdan iki bilgi aldım. "Saniyedeki kare sayısı" değerini elde etmek için önce zamanı saniyeye dönüştürmeniz ve ardından kare sayısını saniyeye bölmeniz gerekir. "saniyedeki kare sayısı" kare hızınızdır.
$ bc -l
0*60*60 + 4*60 + 26.3
266.3
7989/(4*60+26.3)
30.00000000000000000000
$
videomun kare hızı 30 fps.
Bunu yapabildiğim tek doğru şey şudur:
ffprobe -i my_video.mp4 -show_frames 2>&1|grep -c '^\[FRAME'
Bunun videoyla çalıştığından emin olmak için:
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
Necro cevabı için özür dilerim, ama belki buna ihtiyacım olacak (çünkü son ffmpeg sürümleri için bir çözüm bulamadım.
Ffmpeg 3.3.4 ile aşağıdakilerin bulunabileceğini buldum:
ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames"
Sonunda, kare sayısını çıkaracaktır. Benim için sesli videolarda çalıştı. Yine de iki kez "nb_frames" satırı veriyor, ancak ilk satır, test ettiğim videolardaki gerçek kare sayısıydı.
Php_ffmpeg kullanıyorum, o zaman bir filmin tüm zamanlarını ve tüm karelerini alabilirim. Belows gibi
$input_file='/home/strone/workspace/play/CI/abc.rmvb';
$ffmpegObj = new ffmpeg_movie($input_file);
echo $ffmpegObj->getDuration();
echo $ffmpegObj->getFrameCount();
Ve sonra detay sayfada.
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
yakut
result = `ffmpeg -i #{path} -f null - 2>&1`
r = result.match("frame=([0-9]+)")
p r[1]