![输出帧数据时偏移ffprobe](https://linux22.com/image/1589502/%E8%BE%93%E5%87%BA%E5%B8%A7%E6%95%B0%E6%8D%AE%E6%97%B6%E5%81%8F%E7%A7%BBffprobe.png)
我已成功使用 ffprobe 从帧中提取 OCR 数据,命令如下:
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"
我已经尝试使用 ffmpeg 创建 JPG,然后将其与 ffprobe 一起使用,但这意味着要创建临时文件等。如果可能的话,我想避免这种情况。我也查看了 -read_intervals 选项,但这似乎根本不起作用。
我正在运行带有 ffprobe 的 macOS Mojave 10.14.3:
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
将该选项的参数添加到 lavfi 过滤器中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。
希望这对其他人有帮助。