šŸ“±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
Extract opening hours tags from a camera image

OpeningHoursPhoto Extract opening hours tags from a camera image This project is no longer active. The latest development is taking part as part of Go

null 10 May 3, 2021
Extract Metal functions from .metallib files.

Metal Library Archive MetalLibraryArchive is a product of reverse-engineering Apple's metallib file format. You can use MetalLibraryArchive to get the

Yu Ao 57 Dec 3, 2022
Full aspect ratio grid layout for iOS

Greedo Layout for iOS A library that computes what size the UICollectionView cells should be to display images in a variable height fixed aspect ratio

500px 831 Dec 17, 2022
A simple Image full screen pop up

CLImageViewPopup Description A simple UIImageView for easy fullscreen image pop up. No matter where your UIImageView may be. Image pops up from where

Vineeth Vijayan 36 Apr 29, 2021
Swift image slideshow with circular scrolling, timer and full screen viewer

?? ImageSlideshow Customizable Swift image slideshow with circular scrolling, timer and full screen viewer ?? Example To run the example project, clon

Petr Zvonƭček 1.7k Dec 21, 2022
A simple Image full screen pop up

CLImageViewPopup Description A simple UIImageView for easy fullscreen image pop up. No matter where your UIImageView may be. Image pops up from where

Vineeth Vijayan 36 Apr 29, 2021
Jogendra 113 Nov 28, 2022
Nilay Dagdemir 0 Jan 23, 2022
An app that uses Multipeer Connectivity to play a video across 6 different iOS screens with an additional phone acting as a Main/Control phone.

MultiScreenApp An app that uses Multipeer Connectivity to play a video across 6 different iOS screens with an additional phone acting as a Main/Contro

Vedant 113 Nov 21, 2022
ARVideoInSpace - A Minimal iOS AR app to play a NASA video in space

AR Video In Space A minimal iOS AR app for playing a NASA video in outer space.

Yasuhito Nagatomo 0 Jun 28, 2022
SwiftUI iOS app which applies CoreML Video Matting (background removal) model to the front camera stream

CoreML Camera Video Matting This is a simple iOS app which applies Video Matting (background removal) model to the front camera stream. Video Matting

Dmitry Voitekh 17 Dec 29, 2022
A simple macOS app to read code from images, written purely in Swift using Vision Framework.

CodeReader A simple macOS app to read code from images, written purely in Swift using Vision Framework. Usage Drag an image Click the convert button R

Md Ibrahim Hassan 44 Nov 20, 2022
App that generates random images and attempts to classify them with MobileNetV2

Image-Classifier-App App that generates random images and attempts to classify t

Eli Hartnett 0 Jul 9, 2022
IconsMaker - Create your app icon with SwiftUI and generate PNG images in all needed sizes

IconsMaker - Create your app icon with SwiftUI and generate PNG images in all needed sizes

Jonathan Gander 14 Oct 20, 2022
Agrume - šŸ‹ An iOS image viewer written in Swift with support for multiple images.

Agrume An iOS image viewer written in Swift with support for multiple images. Requirements Swift 5.0 iOS 9.0+ Xcode 10.2+ Installation Use Swift Packa

Jan Gorman 601 Dec 26, 2022
APNGKit is a high performance framework for loading and displaying APNG images in iOS and macOS.

APNGKit is a high performance framework for loading and displaying APNG images in iOS and macOS. It's built on top of a modified version of libpng wit

Wei Wang 2.1k Dec 30, 2022
A lightweight generic cache for iOS written in Swift with extra love for images.

Haneke is a lightweight generic cache for iOS and tvOS written in Swift 4. It's designed to be super-simple to use. Here's how you would initalize a J

Haneke 5.2k Dec 11, 2022
iOS library for quickly displaying images while scrolling

Fast Image Cache is an efficient, persistent, andā€”above allā€”fast way to store and retrieve images in your iOS application. Part of any good iOS applic

Path Mobile Inc Pte. Ltd. 8.2k Jan 9, 2023
iOS Swift class to create circular or rounded avatar images

SwiftyAvatar iOS Swift 3.0 UIimage class Create awesome circular avatar images! IBInspectable attributes accessible from the identity inspector. Round

Dimitrios Kalaitzidis 183 Dec 17, 2022