Is there any function to extract all the frames of a video that is downloaded and picked from Documents Directory in iOS Swift?

207 Views Asked by At

I am trying to extract all the frames from a video. Code is working fine for the video in Bundle Path, but it fails when i give a link of the video or I try to pick the video from File Manager. Following are the issues that i have encountered:

  1. AVAsset throws an error "Error Domn=AVFoundationErrorDomain Code=-11838 "Cannot initialize an instance of AVAssetReader with an asset at non-local URL".
  2. When video is picked from Documents Directory, the fetched asset tracks are always 0.

Following is the code that i am using right now.

let asset = AVAsset(url: URL(string: path!)!)
        
self.playerController.player = AVPlayer(playerItem: AVPlayerItem(asset: asset))
        
        
    if let path = path {
        let asset:AVAsset = AVAsset(url: URL(string: path)!)

        self.playerController.player = AVPlayer(playerItem: AVPlayerItem(asset: asset))
         self.player.play()
         asset.loadTracks(withMediaType: .video) { fetchedTracks, err in
                
                do{
                    let reader = try AVAssetReader(asset: asset)

                    // read video frames as BGRA
                    let trackReaderOutput = AVAssetReaderTrackOutput(track: (fetchedTracks?.first)!, outputSettings:[String(kCVPixelBufferPixelFormatTypeKey): NSNumber(value: kCVPixelFormatType_32BGRA)])
                    reader.add(trackReaderOutput)
                    reader.startReading()

                    while let sampleBuffer = trackReaderOutput.copyNextSampleBuffer() {
                        print("sample at time \(CMSampleBufferGetPresentationTimeStamp(sampleBuffer))")
                        if CMSampleBufferGetImageBuffer(sampleBuffer) != nil {
                            // process each CVPixelBufferRef here

                            guard let imageBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
                            let ciimage = CIImage(cvPixelBuffer: imageBuffer)
                            self.frames.append(UIImage(ciImage: ciimage))

                            // see CVPixelBufferGetWidth, CVPixelBufferLockBaseAddress, CVPixelBufferGetBaseAddress, etc
                        }
                    }

                    self.collectionViewFrames.reloadData()

                } catch let err {
                    print(err)
                }


            }
            
        }
0

There are 0 best solutions below