Code Monkey home page Code Monkey logo

framegrabber's Introduction

App Store banner

Frame Grabber is an app for iOS & iPadOS to extract full-resolution video frames as images — framegrabberapp.com

Note
As of June 2023, Frame Grabber has been acquired and is published by its new owner. This repo remains open-source as it has since day one. It contains the code up to the latest version I published myself, 1.4.1.

Reviews

4.8 stars worldwide. Loved by users for its ease-of-use and intuitiveness.

App Store reviews

About

Read more about why I made the app and some technical challenges along the way.

Note
This was my very first app without prior experience. The code is not the newest. Please keep that in mind when checking out the code 😉

How to Build

  • Open Xcode
  • Change development team and bundle identifier
  • Build

Project Setup

As I wanted to learn the fundamentals with this project, I followed Apple's basic documentation. Which meant MVC with storyboards at the time.

Overview of main components:

License

See LICENSE.

Please don't publish a clone to the App Store. It's very confusing for users. Instead, play around with the code, learn from it, and create something new! Make your ideas happen 🤗

framegrabber's People

Contributors

arthurhammer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

framegrabber's Issues

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

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!

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

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

Preserve HDR

Hi, thanks for the app, it’s very handy.

When extracting a frame from an HDR video the resulting image loses the HDR and it is dimmed, overexposed/underexposed, etc. Is there anything you could do to preserve the HDR? I think this could add value to your app since the screenshots on iOS can’t capture the HDR either and there is no way to do so on iOS.

Edit. I understand this is not that easy and I don’t want to bother anyway

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 :)

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.

What happened to the app?

I apologize for posting here, I couldn't find any other way to contact you.

Frame Grabber is one of my favorite iOS apps. But now it's been made into another horrible subscription app.

изображение
⬇️
изображение

изображение
⬇️
изображение

изображение
⬇️
изображение

What happened to the great app? Did you have to sell it?

I am very sad and upset at what the app has become... 😢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.