Swiftpack.co - Package - NextLevel/NextLevel

Next Level

Next Level is a media capture camera library for iOS written in Swift.

Build Status Pod Version Swift Version GitHub license

| | Features | |:---------:|:---------------------------------------------------------------| | 🎬 | β€œVine-like” video clip recording and editing | | πŸ–Ό | photo capture (raw, jpeg, and from a video frame) | | πŸ‘† | customizable gestural interaction and user interface | | πŸ’  | ARKit integration (beta) | | πŸ“· | dual camera, wide angle, and telephoto device support | | 🐒 | adjustable frame rate on supported hardware (ie fast/slow motion capture) | | πŸ” | video zoom | | βš– | white balance, focus, and exposure adjustment | | πŸ”¦ | flash and torch support | | πŸ‘― | mirroring support | | β˜€ | low light boost | | πŸ•Ά | smooth auto-focus | | βš™ | configurable encoding and compression settings | | πŸ›  | simple media capture and editing API | | πŸŒ€ | extensible API for image processing and CV | | 🐦 | Swift 4 |

Quick Start


# CocoaPods
swift_version = "4.0"
pod "NextLevel", "~> 0.9.0"

# Carthage
github "nextlevel/NextLevel" ~> 0.9.0

# Swift PM
let package = Package(
    dependencies: [
        .Package(url: "https://github.com/nextlevel/NextLevel", majorVersion: 0)
    ]
)

Alternatively, drop the NextLevel source files or project file into your Xcode project.

Need Swift 3.X? Target your Podfile to release version 0.6.3. Swift 4 support begins with release β€˜0.7.1’.

ARKit

In release 0.8.0, NextLevel provides a mode for ARKit capture in addition to AVFoundation. This enables a variety of new camera features while leveraging the existing recording capabilities of NextLevel.

The ARKit mode is in beta, so please help out if you encounter an issue or by contributing ideas for improvement. It is not compiled by default without the inclusion of the Swift compiler flag USE_ARKIT, since Apple will reject apps that link ARKit and do not use it. To try it out, setup the AppDelegate to load the MixedRealityViewController class and include the xcode build settings flag.

If you use Cocoapods, you can include -DUSE_ARKIT with the following podfile addition or by adding it to your Xcode build settings.

  installer.pods_project.targets.each do |target|
    # setup NextLevel for ARKit use
    if target.name == 'NextLevel'
      target.build_configurations.each do |config|
        config.build_settings['OTHER_SWIFT_FLAGS'] = '-DUSE_ARKIT'
      end
    end
  end

Overview

Before starting, ensure that permission keys have been added to your app's Info.plist.

<key>NSCameraUsageDescription</key>
    <string>Allowing access to the camera lets you take photos and videos.</string>
<key>NSMicrophoneUsageDescription</key>
    <string>Allowing access to the microphone lets you record audio.</string>

Recording Video Clips

Import the library.

import NextLevel

Setup the camera preview.

let screenBounds = UIScreen.main.bounds
self.previewView = UIView(frame: screenBounds)
if let previewView = self.previewView {
    previewView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    previewView.backgroundColor = UIColor.black
    NextLevel.shared.previewLayer.frame = previewView.bounds
    previewView.layer.addSublayer(NextLevel.shared.previewLayer)
    self.view.addSubview(previewView)
}

Configure the capture session.

override func viewDidLoad() {
    NextLevel.shared.delegate = self
    NextLevel.shared.deviceDelegate = self
    NextLevel.shared.videoDelegate = self
    NextLevel.shared.photoDelegate = self
    
    // modify .videoConfiguration, .audioConfiguration, .photoConfiguration properties
    // Compression, resolution, and maximum recording time options are available
    NextLevel.shared.videoConfiguration.maximumCaptureDuration = CMTimeMakeWithSeconds(5, 600)
    NextLevel.shared.audioConfiguration.bitRate = 44000
 }

Start/stop the session when appropriate. These methods create a new "session" instance for 'NextLevel.shared.session' when called.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)     
    NextLevel.shared.start()
    // …
}
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)        
    NextLevel.shared.stop()
    // …
}

Video record/pause.

// record
NextLevel.shared.record()

// pause
NextLevel.shared.pause()

Editing Recorded Clips

Editing and finalizing the recorded session.


if let session = NextLevel.shared.session {

    //..

    // undo
    session.removeLastClip()

    // various editing operations can be done using the NextLevelSession methods

    // export
    session.mergeClips(usingPreset: AVAssetExportPresetHighestQuality, completionHandler: { (url: URL?, error: Error?) in
        if let _ = url {
            //
        } else if let _ = error {
            //
        }
     })

    //..

}

Videos can also be processed using the NextLevelSessionExporter, a media transcoding library in Swift.

Custom Buffer Rendering

β€˜NextLevel’ was designed for sample buffer analysis and custom modification in real-time along side a rich set of camera features.

Just to note, modifications performed on a buffer and provided back to NextLevel may potentially effect frame rate.

Enable custom rendering.

NextLevel.shared.isVideoCustomContextRenderingEnabled = true

Optional hook that allows reading sampleBuffer for analysis.

extension CameraViewController: NextLevelVideoDelegate {
    
    // ...

    // video frame processing
    public func nextLevel(_ nextLevel: NextLevel, willProcessRawVideoSampleBuffer sampleBuffer: CMSampleBuffer) {
        // Use the sampleBuffer parameter in your system for continual analysis
    }

Another optional hook for reading buffers for modification, imageBuffer. This is also the recommended place to provide the buffer back to NextLevel for recording.

extension CameraViewController: NextLevelVideoDelegate {

    // ...

    // enabled by isCustomContextVideoRenderingEnabled
    public func nextLevel(_ nextLevel: NextLevel, renderToCustomContextWithImageBuffer imageBuffer: CVPixelBuffer, onQueue queue: DispatchQueue) {
		    // provide the frame back to NextLevel for recording
        if let frame = self._availableFrameBuffer {
            nextLevel.videoCustomContextImageBuffer = frame
        }
    }

NextLevel will check this property when writing buffers to a destination file. This works for both video and photos with capturePhotoFromVideo.

nextLevel.videoCustomContextImageBuffer = modifiedFrame

Documentation

You can find the docs here. Documentation is generated with jazzy and hosted on GitHub-Pages.

About

Next Level was a little weekend project that turned into something more useful. The software provides foundational components for advanced media recording, camera interface customization, and gestural interaction customization for iOS. The same capabilities can also be found in apps such as Snapchat, Instagram, and Vine.

The goal is to continue to provide a good foundation for quick integration (taking you to the next level) – allowing everyone to focus on the app functionality that matters most. My hope is the app functionality that matters most whether is be realtime image processing, computer vision methods, augmented reality, or even new cinematographic recording techniques benefit from how this library is structured.

Related Projects

Community

NextLevel is a community – contributions and discussions are welcome!

Project

  • Feature idea? Open an issue.
  • Found a bug? Open an issue.
  • Need help? Use Stack Overflow with the tag ’nextlevel’.
  • Questions? Use Stack Overflow with the tag 'nextlevel'.
  • Want to contribute? Submit a pull request.

Stickers

If you found this project to be helpful, check out the Next Level stickers.

You can use this sign up link for a $10 credit.

If other projects have interest in providing a similar hex sticker, it conforms to the sticker standard used by several node projects.

Resources

License

NextLevel is available under the MIT license, see the LICENSE file for more information.

Github

link
Stars: 1010
Help us keep the lights on

Dependencies

Used By

Total: 1

Releases

0.9.0 - Nov 14, 2017

The ARKit mode is in beta, so it is not compiled by default without the inclusion of the Swift compiler flag USE_ARKIT. Apple will reject apps that link ARKit and do not use it. To try it out, setup the AppDelegate to load the MixedRealityViewController class and include the xcode build settings flag.

If you use Cocoapods, you can include -DUSE_ARKIT with the following podfile addition or by adding it to your Xcode build settings.

  installer.pods_project.targets.each do |target|
    # setup NextLevel for ARKit use
    if target.name == 'NextLevel'
      target.build_configurations.each do |config|
        config.build_settings['OTHER_SWIFT_FLAGS'] = '-DUSE_ARKIT'
      end
    end
  end