user4545564
user4545564

Reputation:

playback recorded content in AVCapture

I am trying to playback the recorded session in full view after it is recorder. Kind of like "snapchat".

I can record and play the videoplay back in a UIView, but it is shown with "play", "Done" "Stop" buttons. I don't want that. I want it to look like snapchat.

This is my code, where i found Here, but I modified a tiny little bit. :)

import UIKit
import AVFoundation
import AssetsLibrary
import Photos
import MediaPlayer
import AVKit

class Camera: UIViewController, AVCaptureFileOutputRecordingDelegate {


@IBOutlet var cameraView: UIView!
var previewLayer : AVCaptureVideoPreviewLayer?
var captureDevice:AVCaptureDevice!
var CamChoser = false

var moviePlayer: MPMoviePlayerController?
@IBOutlet weak var playback: UIView!

@IBOutlet weak var exitCameraModeButton: UIButton!
@IBAction func exitCameraModeButton(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)
}


var captureSession = AVCaptureSession()

lazy var cameraDevice: AVCaptureDevice? = {
    let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice]
    return devices.filter{$0.position == .Front}.first
}()

lazy var micDevice: AVCaptureDevice? = {
    return AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
}()

var movieOutput = AVCaptureMovieFileOutput()

private var tempFilePath: NSURL = {

    let tempPath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("tempMovie").URLByAppendingPathExtension("mp4").absoluteString
    if NSFileManager.defaultManager().fileExistsAtPath(tempPath) {
        do {
            try NSFileManager.defaultManager().removeItemAtPath(tempPath)
        } catch { }
    }
    return NSURL(string: tempPath)!
}()

private var library = ALAssetsLibrary()
//private var library = PHPhotoLibrary()

@IBOutlet weak var switchCameraButton: UIButton!
@IBAction func switchCameraButton(sender: AnyObject) {
    //startSession()
}



override func viewDidLoad() {
    super.viewDidLoad()

    //start session configuration

    captureSession.beginConfiguration()
    captureSession.sessionPreset = AVCaptureSessionPresetHigh

    let devices = AVCaptureDevice.devices()
    startSession()
}

func startSession() {

    // add device inputs (front camera and mic)
    print(CamChoser)

        captureSession.addInput(deviceInputFromDevice(cameraDevice))
        captureSession.addInput(deviceInputFromDevice(micDevice))

        // add output movieFileOutput
        movieOutput.movieFragmentInterval = kCMTimeInvalid
        captureSession.addOutput(movieOutput)

        // start session
        captureSession.commitConfiguration()
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        self.cameraView.layer.addSublayer(previewLayer!)
        self.cameraView.bringSubviewToFront(self.exitCameraModeButton)
        self.cameraView.bringSubviewToFront(self.switchCameraButton)
        previewLayer?.frame = self.cameraView.layer.frame
        captureSession.startRunning()
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("touch")
    // start capture

    movieOutput.startRecordingToOutputFileURL(tempFilePath, recordingDelegate: self)

}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("release")
    //stop capture
    movieOutput.stopRecording()

    let videoUrl = movieOutput.outputFileURL
    moviePlayer = MPMoviePlayerController(contentURL: videoUrl)
    moviePlayer!.movieSourceType = MPMovieSourceType.Unknown
    moviePlayer!.view.frame = playback.bounds
    moviePlayer!.scalingMode = MPMovieScalingMode.AspectFill
    moviePlayer!.controlStyle = MPMovieControlStyle.Embedded
    moviePlayer!.shouldAutoplay = true

    playback.addSubview((moviePlayer?.view)!)
    //moviePlayer!.prepareToPlay()
    moviePlayer?.setFullscreen(true, animated: true)
    moviePlayer!.play()
    cameraView.bringSubviewToFront(playback)




}

private func deviceInputFromDevice(device: AVCaptureDevice?) -> AVCaptureDeviceInput? {
    guard let validDevice = device else { return nil }
    do {
        return try AVCaptureDeviceInput(device: validDevice)
    } catch let outError {
        print("Device setup error occured \(outError)")
        return nil
    }
}

func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) {
}

func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
    if (error != nil) {
        print("Unable to save video to the iPhone  \(error.localizedDescription)")
    } else {
        // save video to photo album
        library.writeVideoAtPathToSavedPhotosAlbum(outputFileURL, completionBlock: { (assetURL: NSURL?, error: NSError?) -> Void in
            if (error != nil) {
                print("Unable to save video to the iPhone \(error!.localizedDescription)")
            }
        })

    }

}

}

Upvotes: 1

Views: 133

Answers (1)

Jony T
Jony T

Reputation: 474

Just so you know, MPMoviePlayerController has been deprecated for iOS 9. The issue is your control style is set to embedded which by default, displays the control buttons. Use MPMovieControleStyle.None to remove the controls.

See MPMovieControlStyle documentation for more details.

Upvotes: 1

Related Questions