M: I’m using ffprobe to test the frame rate of some movies in a script on Linux. 99% of the time it’s working, but occasionally it will report the frame rate of a movie as being 60000/1001 when, upon opening it in VLC, the frame rate is a little less than 30. First, can you tell me what is going on That’s having it report nearly double the actual frame rate?
G: The issue you're encountering is due to ffprobe sometimes reporting the field rate instead of the frame rate, particularly with interlaced video. Here's a breakdown:
If ffprobe reports 60000/1001 (~59.94
fps) for a movie that plays at ~29.97 fps in VLC, the video is likely
interlaced, and ffprobe is showing the field
rate (fields per second), not the frame rate
(frames per second).
29.97 fps interlaced video has 59.94
fields/sec.In interlaced content, tools like ffprobe (especially when reading
container-level data or codec-specific metadata) may default to
reporting the field rate, leading to
60000/1001.
VLC interprets the stream for playback rate, factoring in interlacing, deinterlacing settings, and actual timing. It reports frame rate in terms of complete images shown per second, so you'll see ~29.97 even if ffprobe says 59.94.
To get the actual frame rate (not field rate), use ffprobe with the
-select_streams v:0 and filter the stream frame-by-frame
like this:
ffprobe -v 0 -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1 input.mp4Or more reliably for actual playback rate:
ffprobe -v error -select_streams v:0 -count_frames -show_entries stream=nb_read_frames,r_frame_rate -of default=nokey=1:noprint_wrappers=1 input.mp4Then you can divide total frames by duration for a real-world frame rate if needed.
Let me know if you want a script snippet that works reliably even with interlaced input.
M: I’ll just feed you the code fragment that’s giving grief; it’s a test to see if the file needs recoding due to being unnecessarily high in its FPS. I don’t want to mess with the script more than necessary to fix this test; like I said, 99% of the time the test works just fine.
FRAME_RATE=$(ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate “$file”) If (( $(echo “$FRAME_RATE > 30” | bc -l) )); then …et cetera
G: Thanks—your current logic works
for most files, but trips on interlaced video, where
r_frame_rate might return 60000/1001. That’s
technically valid (it is the rate of fields), but misleading
for your purpose.
Just wrap the rate in bc -l’s scale=2 logic
so that it evaluates the fraction and compares
the float, regardless of format:
FRAME_RATE=$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate \
-of default=noprint_wrappers=1:nokey=1 "$file")
FPS=$(echo "scale=2; $FRAME_RATE" | bc -l)
if (( $(echo "$FPS > 30" | bc -l) )); then
# your code here
fir_frame_rate can be a fraction like
60000/1001, 24000/1001, or
25/1.scale=2 forces bc to compute the float version so
you get actual 29.97, 23.98, etc.60000/1001 > 30 fails due to format, not math).This is the smallest change that keeps your logic and avoids reworking the whole test.
M: Addressing the wrong problem; the logic is catching the few high FPS (or really rarely, odd FPS like 31) files that go through the script, but I need it to identify the files where the display fps is 30 but it’s interlaced. … let’s start with my making sure I’m understanding this correctly. Give me an ffprobe command - or something else, if ffprobe can’t pull it off - that will let me identify if a file is an interlaced mp4. I want to look at my test case and find out if that’s the actual problem before going all the way into the rabbit hole.
G: Got it—thanks for the clarification. You're not trying to avoid misinterpreting high frame rates; you're trying to detect when ffprobe reports a high rate (like 59.94) but the file is actually interlaced and displayed at 29.97. Let's confirm whether interlacing is actually the cause.
Use this to check if the file is flagged as interlaced:
ffprobe -v error -select_streams v:0 -show_entries stream=field_order -of default=noprint_wrappers=1:nokey=1 "$file"If it returns values like:
progressive — Not interlacedtt / bb / tb /
bt — Interlaced field order types
tt: Top Field Firstbb: Bottom Field Firsttb/bt: Mixed or uncertainAlso useful (less consistent but worth checking):
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,codec_type,field_order,scan_type -of default=noprint_wrappers=1 "$file"This may show something like:
codec_type=video
codec_name=h264
field_order=tt
scan_type=interlaced
scan_type can be:
interlacedprogressiveunknownffprobe reads metadata. If that metadata is missing or
wrong (common with poorly encoded files), you may need to
actually analyze the video content. The best tool for
that is ffmpeg with the idet
filter:
ffmpeg -filter:v idet -frames:v 500 -an -f rawvideo -y /dev/null -i "$file"Look in the output for:
[Parsed_idet_0 @ ...] Single frame detection: TFF: 200 BFF: 0 Progressive: 300 Undetermined: 0
That tells you how many interlaced vs progressive frames were detected over the first 500 frames.
Let me know if you want help automating the idet check
in a script—it’s the most reliable but more verbose.
M: Both commands imply the MP4 is progressive, not interlaced. The user command yielded: TFF: 18 BFF: 7 Progressive: 455 Undetermined: 11
G: Perfect—that rules out
interlacing as the cause of ffprobe reporting
60000/1001.
Your file is progressive, but ffprobe reports a frame rate of ~59.94 fps, while VLC shows it playing at ~29.97 fps. That means:
This is common in files:
You want to measure actual frame timestamps over time. Use:
ffprobe -v error -select_streams v:0 -count_packets \
-show_entries stream=nb_read_packets,duration -of default=noprint_wrappers=1:nokey=1 "$file"Or, more accurately (using average frame rate derived from frames and duration):
ffprobe -v error -select_streams v:0 -count_frames \
-show_entries stream=nb_read_frames,duration -of default=nokey=1:noprint_wrappers=1 "$file"That will give you two lines:
<frame count>
<duration in seconds>
Then compute:
echo "scale=3; <frame count>/<duration>" | bcThat gives you the true FPS. If it's near 30, the file was encoded at 59.94 fps but has repeated or padded frames—so recoding might reduce size without losing real temporal resolution.
Let me know if you want to patch your script to detect that case specifically.
M: It has been reducing the size, but not by more than maybe 10% per file. At that point, my primary concern is whether the recoding will affect the quality of the result.
G: Understood. If recoding is only saving ~10%, here’s how to weigh whether it’s worth it in terms of quality vs. space:
If you're doing something like this:
ffmpeg -i input.mp4 -vf fps=30 -c:v libx264 -crf 18 output.mp4…then no, the quality is likely fine.
crf 18 is visually lossless for most people. But:
To verify:
ffmpeg -i input.mp4 -vf mpdecimate,setpts=N/FRAME_RATE/TB -an -f null -That will tell you how many duplicate frames exist. If the output
logs show a lot of dropped frames (via mpdecimate), your
recoding to 30fps is just removing redundancy.
crf.If you're using crf 18–23 and dropping duplicated frames
from a 59.94->30 conversion, there’s no meaningful quality
loss. If you're only saving 10% and re-encoding
introduces artifacts you care about, skip it.
Let me know what your ffmpeg command looks like, and I’ll review for optimal results.
M: The results says Frame=43999 fps=517 q=-0.0 Lsize=N/A etc.
G: Thanks—based on that result from
the ffmpeg -vf mpdecimate test (Frame=43999),
here's how to interpret it:
mpdecimate (which removes
visually duplicate frames), and it still processed all
43999, it means:
This is real 59.94 fps video.
Since the frames are not duplicated, recoding to 30 fps will drop real visual information. That means:
Do not recode these to 30 fps.
Your original script logic is too aggressive for real 59.94 content. You
need a check for actual duplicate frames before downsampling FPS.
I can help you add that to your script if you'd like, using
ffmpeg or ffprobe to estimate
motion/difference density.
M: Let me clarify. Losing a little bit of information is OK as far as I’m concerned. My primary concern is re-encoding without adding anything to the situation – I was worried that the end result would lose quality without making any actual changes to the state of the video. This might be a fair trade-off, I think. I’ll have to consider it.
G: Thanks for the clarification—that makes sense.
You’re not degrading quality arbitrarily—you're making a deliberate simplification.
If your script is recoding:
crf value (e.g. 18–23),If the goal was only to change the FPS when needed, and you’re doing that, you’re not wasting cycles or damaging content needlessly.
Let me know if you ever want to flag only redundant-frames cases in the future to optimize more aggressively.
M: Side question. Where are the screen capture settings on an iPhone 12? I’m using pokegenie, leading to a lot of pictures, and I’d like to either shut off the snapshot window you get after taking a screen capture, or at least move it
G: On your iPhone 12, you can’t move the screenshot preview ("thumbnail") that appears in the bottom-left corner after a capture—but you can disable it from saving to Photos, which might help reduce clutter if you’re taking lots of PokéGenie screenshots.
Unfortunately, Apple does not allow disabling or repositioning the preview thumbnail itself. However, here are your options:
If you don’t touch the thumbnail, it disappears automatically after ~5 seconds. You can speed things up by swiping it off the screen:
You can:
This avoids the preview popup entirely and keeps your Photos app from getting flooded.
You can use Shortcuts + Automation to move screenshots to a folder or delete them after syncing them to PokéGenie. It won’t stop the preview, but it will keep things tidy.
There’s no way in current iOS (as of iOS 17) to hide, move, or prevent the screenshot preview itself from appearing.
M: Are there any poke Genie settings that will automatically delete a photo once it’s scanned
G: As of now, Poké Genie does not have a built-in option to automatically delete screenshots after scanning them. You must manually delete them from the Photos app unless you use a system-level workaround.
Check:
Poké Genie Settings > Screenshot Scanning — look for
any toggle related to deleting or managing scanned screenshots.
Set up an iOS Shortcut that runs when a screenshot is taken, waits ~10 seconds (to allow Poké Genie to scan), then deletes it.
How to do it:
This will delete screenshots shortly after they’re taken, which works well if you use live overlay or fast scan.
Let me know if you'd like a step-by-step Shortcut script to copy into your phone.
M: No, thank you. I’ll remember the shortcut thing exists though. Is there a poke genie command, which will trim down the important pictures to the circled versions generated through its ivision function
G: No, Poké Genie doesn’t currently offer a command or setting to automatically trim your screenshots down to only the generated, circled IV summary images. Here's how it works and what options you do have:
When you scan a Pokémon via screenshot:
This saves the circled version as an image—but only one at a time.
Let me know if you want help setting up a workflow or shortcut to auto-delete screenshots only after a summary is saved or shared.
M: In Pokemon go, am I allowed to trade megaevolved creatures
G: No, you cannot trade a Pokémon while it is in its Mega Evolved form in Pokémon GO. To trade such a Pokémon, you must first allow it to revert to its standard form.
Additionally, if you trade a Pokémon that has previously Mega Evolved, its Mega Level will reset. This means any progress made toward reducing the Mega Energy cost for future Mega Evolutions will be lost, and the recipient will need to start over to build up the Mega Level for that Pokémon. citeturn0search0turn0search1
In summary, while it's possible to trade a Pokémon that has Mega Evolved in the past (after it has returned to its normal form), doing so will reset its Mega Evolution progress.
M: I don’t have tomato bouillon and have had trouble finding it. Know any close enough substitute? Just using it to make taco meat.
G: Yes—here are good substitutes for tomato bouillon when making taco meat:
Best substitute. Combine:
This mimics both the umami and the tomato flavor of tomato bouillon (e.g. Knorr).
If you're not using a dry mix:
If you want a dry taco-style seasoning:
This won't give bouillon’s full umami depth, but it's close enough in tacos.
Let me know if you want a dry seasoning mix that mimics tomato bouillon long-term.
M: What would happen if I substituted matzo meal for oat flour in a taco meat recipe
G: Substituting matzo meal for oat flour in taco meat will change texture and taste slightly, but it’ll still work depending on why the flour is there.
Yes, you can substitute matzo meal for oat flour in taco meat. Expect a drier, breadier texture and milder taste, but it won’t ruin the dish.
M: What about some organic wheat flour?
G: Organic wheat flour works better than matzo meal for replacing oat flour in taco meat—if you're just trying to bind or thicken.
Don’t overdo it—wheat flour can get pasty or cakey if too much is added. Stick to:
No sweetness like oats—so if the oat flour was adding a soft, nutty flavor, wheat flour won’t replicate that.
Wheat flour is a cleaner, more neutral substitute than matzo meal. Use it sparingly and you’ll be fine.
M: Same proportions?
G: Yes—use the same proportions as you would with oat flour:
✅ 1:1 substitution — wheat flour for oat flour
But if you’re eyeballing it in taco meat:
No other adjustments needed.
M: Give me the quick command to copy from point x to the end of a MOV file. A set of frames got corrupted, but everything except that one point is working.
G: Here’s the quick
ffmpeg command to copy from a certain timestamp (e.g.,
point X) to the end of a .mov file without
re-encoding:
ffmpeg -ss [start_time] -i input.mov -c copy output.movffmpeg -ss 00:03:00 -i input.mov -c copy output.mov-ss before -i does
keyframe-accurate fast seeking, which is what you want
when copying.-c copy means no re-encoding, just
stream copy.If -c copy causes errors (due to non-keyframe cut),
try:
ffmpeg -ss 00:03:00 -i input.mov -c:v libx264 -c:a copy output.mov…but this re-encodes the video stream while keeping audio untouched. Use only if needed.