Смещение ffprobe при выводе данных кадра

Мне удалось извлечь данные OCR из фреймов с помощью ffprobe с помощью следующей команды:

ffprobe -loglevel quiet -hide_banner -select_streams v:0 -show_entries frame_tags=lavfi.ocr.text -f lavfi "movie=movie.mov,ocr" -of flat

Он аккуратно выводит информацию в одну строку примерно так:

frames.frame.0.tags.lavfi_ocr_text="EE 6:\n_ 00:59:35.00\n"
frames.frame.1.tags.lavfi_ocr_text="ET =:\na Clo Koy\n"
frames.frame.2.tags.lavfi_ocr_text="EE =:\na loony\n"
frames.frame.3.tags.lavfi_ocr_text="=:\na 00:59:35.03\n"
frames.frame.4.tags.lavfi_ocr_text="U6:\na 00:59:35.04\n"
frames.frame.5.tags.lavfi_ocr_text="6:\nal 00:59:35.05\n"
frames.frame.6.tags.lavfi_ocr_text="EE Zz:\nim 00:59:35.06\n"
frames.frame.7.tags.lavfi_ocr_text="=:\nim ll¢kosc hc Lon OYA\n"
frames.frame.8.tags.lavfi_ocr_text="=:\nim 00:59:35.08\n"
frames.frame.9.tags.lavfi_ocr_text="Zz:\nim 00:59:35.09\n"
frames.frame.10.tags.lavfi_ocr_text="=:\nim 00:59:35.10\n"

Тем не менее, поскольку сканирование каждого кадра является ресурсоемкой операцией, и в зависимости от объема текста на экране иногда может потребоваться несколько секунд на кадр, поэтому я создал еще один зонд для обнаружения первой (почти) полностью черной рамки:

ffprobe -loglevel quiet -hide_banner -select_stream v:0 -show_entries frame_tags=lavfi.blackframe.pblack -f lavfi "movie=movie.mov,blackframe" -of flat | head -n1

Эта команда выводит следующее:

frames.frame.240.tags.lavfi_blackframe_pblack="99"

Мне удалось снять все, кроме нужного мне числа "240". Теперь я хочу использовать это число для смещения начального фрейма для первой команды, чтобы ее вывод начинался на этом фрейме следующим образом:

frames.frame.240.tags.lavfi_ocr_text="EE 6:\n_ 00:59:35.00\n"
frames.frame.241.tags.lavfi_ocr_text="ET =:\na Clo Koy\n"
frames.frame.242.tags.lavfi_ocr_text="EE =:\na loony\n"
frames.frame.243.tags.lavfi_ocr_text="=:\na 00:59:35.03\n"
frames.frame.244.tags.lavfi_ocr_text="U6:\na 00:59:35.04\n"
frames.frame.245.tags.lavfi_ocr_text="6:\nal 00:59:35.05\n"
frames.frame.246.tags.lavfi_ocr_text="EE Zz:\nim 00:59:35.06\n"
frames.frame.247.tags.lavfi_ocr_text="=:\nim ll¢kosc hc Lon OYA\n"
frames.frame.248.tags.lavfi_ocr_text="=:\nim 00:59:35.08\n"
frames.frame.249.tags.lavfi_ocr_text="Zz:\nim 00:59:35.09\n"
frames.frame.250.tags.lavfi_ocr_text="=:\nim 00:59:35.10\n"

Я уже пробовал создавать JPG с помощью ffmpeg, который затем можно использовать с ffprobe, но это означает создание временных файлов и прочего. Я хочу предотвратить это, если это возможно. Я также посмотрел на параметр -read_intervals, но это, похоже, не работает вообще.

Я использую MacOS Mojave 10.14.3 с помощью ffprobe:

ffprobe version 4.1.1 Copyright (c) 2007-2019 the FFmpeg developers
  built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/openjdk-11.0.2.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/openjdk-11.0.2.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-videotoolbox --disable-libjack --disable-indev=jack --enable-libaom --enable-libsoxr
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
Simple multimedia streams analyzer
usage: ffprobe [OPTIONS] [INPUT_FILE]

Можно ли сделать то, что я хочу, используя только ffprobe?

1 ответ

Оказывается, решение было довольно простым.

Я добавил trim Параметр фильтра Лавфи с start_pts вариант, а также изменил некоторые параметры вывода.

Полная команда:

ffprobe -loglevel error -hide_banner -select_streams v:0 -show_frames -show_entries frame=lavfi.ocr.text -f lavfi -i "movie=movie.mov,trim=start_pts=20,ocr" -of flat

Теперь выводит следующее:

frames.frame.0.tags.lavfi_ocr_text="=:\nim 00:59:35.20\n"
frames.frame.1.tags.lavfi_ocr_text="=:\nim 00:59:35.21\n"
frames.frame.2.tags.lavfi_ocr_text="=:\nim lelehkosc clon)\n"
frames.frame.3.tags.lavfi_ocr_text="=:\nim 00:59:35.23\n"
frames.frame.4.tags.lavfi_ocr_text="Zz:\nim 00:59:35.24\n"
frames.frame.5.tags.lavfi_ocr_text="i\nim 00:59:36.00\n"
frames.frame.6.tags.lavfi_ocr_text="=:\nim 00:59:36.01\n"
frames.frame.7.tags.lavfi_ocr_text="=:\nim 00:59:36.02\n"
frames.frame.8.tags.lavfi_ocr_text="=:\nim 00:59:36.03\n"
frames.frame.9.tags.lavfi_ocr_text="=:\nim 00:59:36.04\n"
frames.frame.10.tags.lavfi_ocr_text="=:\nim 00:59:36.05\n"

Он по-прежнему начинается с "frame.0", но это не позиции кадров исходного видео, как вы можете видеть из обнаруженного временного кода, который теперь начинается с 00:59:35.20 вместо 00:59:35.00.

Надеюсь, что это помогает другим.

Другие вопросы по тегам