📱iOS app to extract full-resolution video frames as images.

Overview

App Store banner.

Frame Grabber is a focused, easy-to-use iOS app to extract full-resolution video frames as images. Perfect to capture and share your favorite video moments.

Download on the App Store

Check out framegrabberapp.com for more info.

Use Cases

Frame Grabber's users make all kinds of great stuff:

  • Find that perfect moment of you snowboarding, surfing or racing
  • Nature videography 🐦
  • Create YouTube thumbnails
  • Cats, it's always cats
  • Grab the cutest look in your selfie videos 💃🏼
  • Simply share your coolest moments with friends
  • Create photo books from holiday clips
  • Accidentally recorded a video when you meant to take a picture? Make a photo out of it.
  • Have trouble taking a pic at just the right moment? Just record a video and grab the perfect frame afterwards.

Features

  • Super easy to use
  • Export frames in full resolution and highest quality
  • Exact frame-by-frame comparison and full zoom to find the perfect moment
  • Works with Live Photos, too
  • Import videos from Files
  • Import videos from other apps like your favorite movie editor
  • Record selfie videos
  • Attach Exif metadata when exporting
  • Choose the export format (JPEG, HEIF) and compression quality

About

I made it Frame Grabber for two reasons: I've wanted an app like this for the longest time and it seemed perfect in scope to learn iOS development and Swift.

My focus was on making the app feel polished and super easy-to-use. It should be a tool that gets out of your way and feels right at home on your device.

There are not too many fully-featured and polished open source iOS apps out there to study. I wanted to make Frame Grabber available to anyone in hopes other beginners can learn from it. Keep in mind this was my first app so the code is nowhere near to perfect.

Development

Open the project in Xcode and build. The app has no dependencies.

Contact

Feel free to open an issue or contact me at [email protected]. Feedback welcome!

License

See LICENSE.

Just don't make it weird and re-publish a clone to the App Store.

Comments
  • Frame counter instead of centiseconds

    Frame counter instead of centiseconds

    Hi,

    Would it be possible to choose to have the time at the top when choosing a frame be shown as mm.ss.ff as in Final Cut Pro X instead of mm.ss.cc (ff for frame, cc for centiseconds)? This would ideally be an option that could be toggled.

    enhancement 
    opened by velihukka 9
  • Frame Grabber copies on the App Store

    Frame Grabber copies on the App Store

    I just thought I should let you know someone is definitely re-hosting this app. I just wanted to bring it to your attention in case you hadn’t noticed BF4A2ECC-9093-4931-AC30-C347DB6D4822 294F1DE2-7D63-46F5-8A19-947AD6ECBB13 622DA258-5A22-4D4D-945E-AF398ED2614F

    opened by dlevi309 8
  • Exported photos not visible to OneDrive app

    Exported photos not visible to OneDrive app

    Any idea why OneDrive app seemingly cannot see and upload the saved photos? I tried exporting both using heic and jpg and neither gets auto uploaded. Not sure if this is FrameGrabber or OneDrive issue yet. Thanks!

    needs more info 
    opened by devlie 4
  • App crashed on iPad Pro 2020 when exporting

    App crashed on iPad Pro 2020 when exporting

    Whenever trying to export a frame on iPad Pro 2020 (iPad8,11, iOS 13.5), the app (1.2.1) crashed. I’m on jailbroken device, so here’s the log:

    Process: Frame Grabber
    Bundle id: de.arthurhammer.framegrabber
    Device: iPad Pro (12.9-inch) (4th generation), iOS 13.5
    Bundle version: 1.2.1
    
    Exception type: NSGenericException
    Reason: UIPopoverPresentationController (<UIPopoverPresentationController: 0x153234720>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.
    Culprit: Unknown
    
    Call stack:
    0   CoreFoundation                      0x00000001bde0e314 0x1bdcdc000 + 0x132300        // __exceptionPreprocess
    1   libobjc.A.dylib                     0x00000001bdb22c1c 0x1bdb1d000 + 0x5c1c          // objc_exception_throw
    2   UIKitCore                           0x00000001c17ff79c 0x1c14e8000 + 0x31779c        // __66-[UIPopoverPresentationController presentationTransitionWillBegin]_block_invoke
    3   UIKitCore                           0x00000001c1809b38 0x1c14e8000 + 0x321b38        // __71-[UIPresentationController _initViewHierarchyForPresentationSuperview:]_block_invoke
    4   UIKitCore                           0x00000001c1807650 0x1c14e8000 + 0x31f650        // __56-[UIPresentationController runTransitionForCurrentState]_block_invoke.478
    5   UIKitCore                           0x00000001c1f60e0c 0x1c14e8000 + 0xa78e0c        // _runAfterCACommitDeferredBlocks
    6   UIKitCore                           0x00000001c1f50338 0x1c14e8000 + 0xa68338        // _cleanUpAfterCAFlushAndRunDeferredBlocks
    7   UIKitCore                           0x00000001c1f81b1c 0x1c14e8000 + 0xa99b1c        // _afterCACommitHandler
    8   CoreFoundation                      0x00000001bdd88ee8 0x1bdcdc000 + 0xacee8         // __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
    9   CoreFoundation                      0x00000001bdd83b78 0x1bdcdc000 + 0xa7b78         // __CFRunLoopDoObservers
    10  CoreFoundation                      0x00000001bdd84018 0x1bdcdc000 + 0xa8018         // __CFRunLoopRun
    11  CoreFoundation                      0x00000001bdd838f4 0x1bdcdc000 + 0xa78f4         // CFRunLoopRunSpecific
    12  GraphicsServices                    0x00000001c819a604 0x1c8197000 + 0x3604          // GSEventRunModal
    13  UIKitCore                           0x00000001c1f57358 0x1c14e8000 + 0xa6f358        // UIApplicationMain
    14  Frame Grabber                       0x00000001045b8284 Frame Grabber + 33412
    15  libdyld.dylib                       0x00000001bdbff2dc 0x1bdbfe000 + 0x12dc          // start
    

    Do let me know if you needs any further information, thank you for this amazing app :)

    bug 
    opened by yur1xpp 4
  • Allow to share video from gallery into Frame Grabber

    Allow to share video from gallery into Frame Grabber

    Sometimes I see a nice video in the photos app. I would like to send the video to Frame Grabber. Currently, there is no way.

    By the way, I'm a supporter of this project. By the way2, it's not easy to add something to the share menu in Swift but since you wanted to learn Swift it might be a good exercise ;) E64CB856-62F4-4612-8148-1119B8D8C84C

    opened by Aminadav 0
  • Nice Work!

    Nice Work!

    Hi Arthur

    First of all I want to say that I really enjoyed looking through your project. It is very well organized and cleanly written. It was quite helpful to refresh my memory on how AVAssetImageGenerator works.

    That said, I had issues using the FrameExport class, specifically the generateAndExportFrames method. While efficient, it produced out of sequence files, so that reassembling the sequential output produced a stuttering animation.

    I am still looking into this, but perhaps you've already encountered this issue, and know how to resolve it? I am exporting a .mov file so that I can create an animated UIImage. I create the animation by loading the exported frames sequentially into UIImage.animatedImages. What I'm finding is that the exported images move forward, then a little back, and then forward again over and over again...

    On line 50 of FrameExportOperation.swift: let frameIndex = self.frameStartIndex + countProcessed

    this index is used to determine the output filename for the processed frame. Because files are processed in chunks (of 5) any of these files can be ready/completed out of sequence. Presumably the easiest to process of the 5 will be ready first and will get the next available sequence/frame/index number. This would account for the out-of-sequence images.

    I grabbed ffmpeg and used the following command:

    ffmpeg -i "IMG_3689.mov" "frames/out-%03d.jpg"

    and the results gave me a series of files in the correct order and they animate fine in my UIImageView. That told me it is possible to extract the frames in the correct order.

    I changed the chunk size to 1, presuming that this would eliminate any concurrency, and that the indexes would be in correct sequence. But this didn't solve the problem. (if it had, I would have determined the fix and sent you the code)

    So I don't know if this is a bug in AVAssetImageGenerator.generateCGImagesAsynchronously (I don't find anything online, so I don't think this is the case), or if there might be some concurrency going on that I didn't notice.

    I will continue to look into this an keep you updated, but I don't want to waste my time if this is an issue you've already addressed.

    The next thing I will try is either:

    • to move all processing onto a dedicated serial queue and bypass the OperationQueues. (a lot of work for another "test") Or
    • package the index/sequence number with the CMTime into a struct and post a notification with the resulting image and sequence number attached -- if I can find a place in the code where this is possible. I am using a singleton FileExportDataModel, and could add an observer to receive these and write out the file.

    Let me know if you have any thoughts, ideas, frustrations, encouragement....

    M

    opened by Mozahler 1
Swift Package used for video where I demonstrate how to extract a package to a local framework and modify it.

SegmentedPicker NOTE: This sample code is taken from the article by Frank Jia in his article titled Build a Custom iOS Segmented Control With SwiftUI

Stewart Lynch 1 Oct 11, 2021
A fully functional short video app project.Record a six secends video while playing prank sounds.

prankPro A fully functional short video app project How to Install 1. use coconapod to init your xcode environment. 2. change the app-keys in `applica

huijimuhe 258 Jun 19, 2022
JDVideoKit - You can easily transfer your video into Three common video type.

JDVideoKit Introduction You can easily transfer your video into Three common video type. You can use set up camera easily. Installation pod 'JDVideoK

郭介騵 24 Sep 9, 2021
A Swift library to upload video files to api.video platform.

api.video IOS video uploader api.video is the video infrastructure for product builders. Lightning fast video APIs for integrating, scaling, and manag

api.video 7 Dec 9, 2022
Video mp4 record save display - How to Take , Save and Display a .mp4 Video

Technicalisto How to Take , Save and Display a .mp4 Video Add your design with v

Aya Baghdadi 2 Aug 7, 2022
api.video is the video infrastructure for product builders

api.video is the video infrastructure for product builders. Lightning fast video APIs for integrating, scaling, and managing on-demand & low latency live streaming features in your app.

api.video 4 Jun 27, 2022
An alternative to SwiftUI's VideoPlayer that includes an overlay button that will transition the player to be presented full screen.

The VideoPlayer provided by SwiftUI out of the box is great but it's missing one very important feature: full screen presentation mode. AZVideoPlayer behaves pretty much exactly like VideoPlayer, but adds the button that's provided by AVPlayerViewController to go full screen.

Adam Zarn 6 Dec 25, 2022
iOS Video Conferencing SDK & Sample App

?? 100ms SDK & Sample App ?? Here you will find everything you need to build experiences with video using 100ms iOS SDK. Dive into our SDKs, quick sta

100ms 28 Dec 14, 2022
Valorem-demo - Demonstration code and video of Valorem, a bespoke portfolio recommendation platform to be created as an iOS mobile app.

valorem-demo Demonstration code of Valorem, a bespoke portfolio recommendation platform to be created as an iOS mobile app. The included code demonstr

Marcus Deans 1 Mar 4, 2022
Simple macOS app that applies Apple's Person Segmentation algorithm to a video.

Simple macOS app that applies Apple's Person Segmentation algorithm to a video.

Fabio 5 Dec 9, 2022
YoutubeKit is a video player that fully supports Youtube IFrame API and YoutubeDataAPI for easily create a Youtube app

YoutubeKit YoutubeKit is a video player that fully supports Youtube IFrame API and YoutubeDataAPI to easily create Youtube applications. Important Ref

Ryo Ishikawa 555 Dec 28, 2022
Dedicated storyboarding iPad app for video content creators.

CS3217 - Storyteller Final Project for CS3217: Software Engineering for Modern Application Platforms By: Marcus, Pan Yongjing, and Tian Fang Overview

Marcus Ng 0 Nov 29, 2021
Catalyst example of a grid-based video app that opens videos in secondary windows

Simple Catalyst example (Mac idiom) of a grid-based app populated with videos. On macOS, double-clicking a video opens it in a new playback window. Keyboard navigation is fully supported via the UIKit Focus Engine.

Steven Troughton-Smith 19 Dec 8, 2022
BMPlayer - A video player for iOS, based on AVPlayer, support the horizontal, vertical screen

A video player for iOS, based on AVPlayer, support the horizontal, vertical screen. support adjust volume, brightness and seek by slide, support subtitles.

Eliyar Eziz 1.8k Jan 4, 2023
▶️ video player in Swift, simple way to play and stream media on iOS/tvOS

Player Player is a simple iOS video player library written in Swift. Looking for an obj-c video player? Check out PBJVideoPlayer (obj-c). Looking for

patrick piemonte 2k Jan 2, 2023
Swifty360Player - iOS 360-degree video player streaming from an AVPlayer.

Swifty360Player iOS 360-degree video player streaming from an AVPlayer. Demo Requirements Swifty360Player Version Minimum iOS Target Swift Version 0.2

Abdullah Selek 148 Dec 18, 2022
VGPlayer - 📺 A simple iOS video player by Vein.

Swift developed based on AVPlayer iOS player,support horizontal gestures Fast forward, pause, vertical gestures Support brightness and volume adjustment, support full screen, adaptive screen rotation direction.

Wen Rong 399 Dec 23, 2022
Open Source iOS 360 Degree Panorama Video Player.

?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? The Metal with Swift 5.0 version is comming ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 360 VR Player A Open Source, Ad-free, Na

Hanton Yang 2k Dec 24, 2022
FWVideoPlayer is video Player for iOS in Swift.

FWVideoPlayer Desc FWVideoPlayer is video Player for iOS in Swift. It can play video and audio. You can use it easy. Example To run the example projec

null 1 Oct 15, 2021