Кто-нибудь знает, как получить общее количество кадров из видеофайла с помощью ffmpeg? Результат рендеринга ffmpeg показывает текущий кадр, и мне нужно количество кадров, чтобы вычислить прогресс в процентах.
Кто-нибудь знает, как получить общее количество кадров из видеофайла с помощью ffmpeg? Результат рендеринга ffmpeg показывает текущий кадр, и мне нужно количество кадров, чтобы вычислить прогресс в процентах.
Ответы:
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
N/A
. См. Другие методы, перечисленные ниже.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
возможность подсчета только ключевых кадров.Если у вас его нет, ffprobe
вы можете использовать ffmpeg
вместо этого:
ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
frame=
концу вывода консоли.-discard nokey
ввода (ранее -i
) для подсчета только ключевых кадров.Игнорируйте список редактирования MP4 / M4V / M4A / MOV с -ignore_editlist 1
опцией ввода. По умолчанию список редактирования не игнорируется.
-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 --Output="Video;%FrameCount%" input.avi
Для файлов 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
атома.ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
В Unix это работает как шарм:
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
Это то, что я делаю, и это отлично работает для меня и многих других). Во-первых, найдите длину видео в приведенном ниже фрагменте:
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
.
TimeSpan
из него, а затем использую currentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100)
. TimeSpan также предоставляет мощную функцию синтаксического анализа, проверьте это,
Не все форматы сохраняют свое количество кадров или общую продолжительность - и даже если они это делают, файл может быть неполным, поэтому ffmpeg не определяет точно ни один из них по умолчанию.
Вместо этого попробуйте перейти к концу файла и прочитать время, а затем посчитать текущее время, пока вы идете.
В качестве альтернативы вы можете попробовать AVFormatContext->nb_index_entries
или обнаруженную продолжительность, которая должна работать нормально, по крайней мере, неповрежденный AVI / MOV, или библиотеку FFMS2, которая, вероятно, слишком медленная, чтобы возиться с индикатором выполнения.
Вы можете использовать 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 ' '
*.ts
. Результатом будет пустая строка.
Поскольку мой комментарий получил несколько голосов, я решил оставить его в качестве ответа:
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
просто демультиплексирует файл и как можно быстрее прочитает (декодирует) первый видеопоток. Первая grep
команда захватит текст, показывающий фрейм. Вторая grep
команда возьмет только номер из этого. Команда tail
просто покажет последнюю строку (окончательное количество кадров).
чтобы основываться на ответе Стю. вот как я узнал частоту кадров видео со своего мобильного телефона. Некоторое время я выполнял следующую команду. Я позволил счетчику кадров приблизиться к ~ 10 000, прежде чем я набрался терпения и нажал ^ 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.
$
затем я взял две части информации из той строки, которая начинается с «frame =», количества кадров 7989 и времени 00: 04: 26.30. Сначала вам нужно преобразовать время в секунды, а затем разделить количество кадров на секунды, чтобы получить «количество кадров в секунду». «кадров в секунду» - это ваша частота кадров.
$ bc -l
0*60*60 + 4*60 + 26.3
266.3
7989/(4*60+26.3)
30.00000000000000000000
$
частота кадров моего видео составляет 30 кадров в секунду.
Единственное, что мне удалось сделать, это следующее:
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
Извините за ответ necro, но, возможно, он понадобится (так как я не нашел решения для последних выпусков ffmpeg.
С ffmpeg 3.3.4 я обнаружил, что можно найти следующее:
ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames"
В конце будет выведено количество кадров. У меня это сработало с видео со звуком. Тем не менее, он дает дважды строку "nb_frames", но первая строка - это фактическое количество кадров в видео, которые я тестировал.
Я использую php_ffmpeg, тогда я могу получать все времена и все кадры фильма. Как показано ниже
$input_file='/home/strone/workspace/play/CI/abc.rmvb';
$ffmpegObj = new ffmpeg_movie($input_file);
echo $ffmpegObj->getDuration();
echo $ffmpegObj->getFrameCount();
А потом подробности на странице.
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
Рубин
result = `ffmpeg -i #{path} -f null - 2>&1`
r = result.match("frame=([0-9]+)")
p r[1]