We use MTKView
to render custom videos and animations. MTKView does not provides direct support to record video.
The objective of this project is to provide easy and efficient way to directly record video + audio (Either with MIC source or Audio file).
- API to render (or draw) CIImage directly on MTKView with 30 fps.
- Record video rendered on MetalView with MIC audio source.
- Record video rendered on MetalView with Custom audio track.
To run the example project, clone the repo, and run pod install
from the Example directory first.
In this example each frame from camera is being filtered and overlayed on a static image and then redered on RecordableMetalView
. OnTapped button video recording will start, onTapped on stop button video recording will stop and will save in photo library.
- Xcode 11.
- Swift 5.
- iOS 11 or higher.
RecordableMetalView is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'RecordableMetalView'
Create a MTKView
from object library and set custom class
of MTKView
to be RecordableMetalView
Next step is to create an outlet of this view to your ViewController
class by draging mouse from MTKView to ViewController
+ holding control
key.
@IBOutlet weak var metalView: RecordableMetalView!
To render CIImage on RecordableMetalView you can directly call public func draw(ciimage: CIImage)
of RecordableMetalView class.
//make sure your project image assets has image with name 'bgimg'
let image = UIImage(named: "bgimg")
let ciimage = CIImage(cgImage: (image?.cgImage)!)
...
metalView.draw(ciimage: ciimage)
You need to implement RecordableMetalDelegate
inorder to get callback on recording events like start and stop. for simplicity just implement RecordableMetalDelegate
in your ViewController and set metalView.recordingDelegate = self
.
import UIKit
import RecordableMetalView
class ViewController: UIViewController, RecordableMetalDelegate{
@IBOutlet weak var metalView: RecordableMetalView!
override func viewDidLoad() {
super.viewDidLoad()
metalView.recordingDelegate = self
}
//MARK: RecordableMetalDelegate callback methods
func didCompleteRecording(url: URL) {
print("Completed at \(url)")
}
func didFailRecording(error: Error) {
print("Error: \(error)")
}
}
...
To record your custom video rendered on RecordableMetalView
with audio from MIC into MP4
file use the following call.
metalView.startVideoRecoding()
To stop recording make a call to:
metalView.stopVideoRecording()
Once you stop recording one of RecordableMetalDelegate
method will invoke. didCompleteRecording(url: URL)
will invoke if recording successfully finished. url
will be of output file in document directory of your application.
To record your custom video rendered on RecordableMetalView
with audio source explicit file use the following call.
metalView.startVideoRecoding(backGroundAudioUrl: AUDIO_FILE_URL)
To stop recording make a call to:
metalView.stopVideoRecording()
Once you stop recording one of RecordableMetalDelegate
method will invoke. didCompleteRecording(url: URL)
will invoke if recording successfully finished. url
will be of output file in document directory of your application.
A special thank for using RecordableMetalView, Your support is appreciated! if you want to make this library better. If you'd like to contribute, please feel free to create a PR.
Afsar Ahamad: [email protected]
RecordableMetalView is available under the MIT license. See the LICENSE file for more info.