user698: I'm able to use Avidemux with enough ease and it's mostly enough for my video need. I can also choose codecs to recompress the video.
Unfortunately, it doesn't let me cut video outside the scope of keyframes, even when I recompress. I'm not really willing to pay for an expensive software, and I'm not sure I need DaVinci Resolve to do just this.
I know VirtualDub is not developed anymore. Are there other tools that would do frame by frame selection?
I guess I'm able to use FFmpeg too, I guess I could do with a script, but it's not really easy either.

user18155: You may use free open source AviSynth+ — it's a scripting language with the very good documentation.
Example:
clip   = AviSource("MyVideo.avi")    # Reading clip from disk
clip   = clip.ShowFrameNumber        # Showing frame numbers of individual frames

part1  = clip.Trim(   0,  1000)      # Selecting frames with numbers 0 to 1000
part2  = clip.Trim(8000, 12000)      # --- similar ---

result = part1 + part2               # Joining two parts
return result                        # This will be the resulting clip


Note:
The second command
clip   = clip.ShowFrameNumber

is used only in working process to see frame numbers, in the final result you have to remove it.

698: <p>I'm able to use Avidemux with enough ease and it's mostly enough for my video need. I can also choose codecs to recompress the video.</p>

<p>Unfortunately, it doesn't let me cut video outside the scope of keyframes, even when I recompress. I'm not really willing to pay for an expensive software, and I'm not sure I need DaVinci Resolve to do just this.</p>

<p>I know VirtualDub is not developed anymore. Are there other tools that would do frame by frame selection?</p>

<p>I guess I'm able to use FFmpeg too, I guess I could do with a script, but it's not really easy either.</p>
 18155: <p>You may use free open source <a href="https://github.com/pinterf/AviSynthPlus/releases/tag/r2420-MT" rel="nofollow noreferrer">AviSynth+</a> — it's a scripting language with the very good <a href="http://avisynth.nl/index.php/Main_Page" rel="nofollow noreferrer">documentation</a>.</p>

<p>Example:</p>

<pre><code>clip   = AviSource("MyVideo.avi")    # Reading clip from disk
clip   = clip.ShowFrameNumber        # Showing frame numbers of individual frames

part1  = clip.Trim(   0,  1000)      # Selecting frames with numbers 0 to 1000
part2  = clip.Trim(8000, 12000)      # --- similar ---

result = part1 + part2               # Joining two parts
return result                        # This will be the resulting clip
</code></pre>

<hr>

<p><em>Note:</em></p>

<p>The second command</p>

<pre><code>clip   = clip.ShowFrameNumber
</code></pre>

<p>is used only in working process to see frame numbers, in the final result you have to remove it.</p>
