Tôi có thể lấy URI tuyệt đối của video trên cuộn camera và biến đổi nó từ ứng dụng của mình không?


8

Tôi muốn thực hiện thao tác trên video trong cuộn camera của iphone và tôi yêu cầu URI tuyệt đối vì tôi sẽ sử dụng ffmpeg tự nhiên trong ứng dụng của mình.

Có thể hoạt động trên video tại chỗ? hoặc tôi sẽ cần phải sao chép video vào một tmp dir, hoạt động trên nó và sau đó ghi lại vào cuộn camera?

Câu trả lời:


7

Tôi đã đọc một số tài liệu và hướng dẫn và trả lời dưới đây dựa trên nghiên cứu đó.

Có thể hoạt động trên video tại chỗ?

Có (Bằng cách sao chép nó vào thư mục tạm thời) và Không (đến vị trí ban đầu nơi video thực sự được lưu trữ)

Hãy xem hình ảnh sau đây và trích dẫn từ các tài liệu chính thức

nhập mô tả hình ảnh ở đây

Sử dụng PhotoKit, bạn có thể tìm nạp và lưu trữ nội dung để hiển thị và phát lại, chỉnh sửa nội dung hình ảnh và video hoặc quản lý các bộ sưu tập tài sản như album, Khoảnh khắc và Album được chia sẻ.

Chúng tôi không có quyền truy cập trực tiếp vào vị trí lưu trữ hình ảnh / video thay vào đó chúng tôi nhận được dữ liệu thô hoặc biểu diễn bằng các đối tượng PHAsset và Tài sản là bất biến nên chúng tôi không thể thực hiện các thao tác trực tiếp trên đó. Chúng tôi sẽ cần PHAssetChangeRequest để tạo, xóa, thay đổi siêu dữ liệu hoặc chỉnh sửa nội dung của nội dung Ảnh.

Tôi có cần sao chép video vào một thư mục tạm thời, vận hành trên nó và sau đó ghi lại vào cuộn camera không?

Đúng, đó là cách để đi.


Tất nhiên người dùng có thể chỉnh sửa hình ảnh / video tại chỗ, người dùng sẽ chỉ được nhắc nhở với một cảnh báo cho họ biết để xác nhận thay đổi. Xem lớp PHAsset.
K4747Z

4
@ K4747Z Đồng ý. Nhưng với điều đó, tôi có nghĩa là trực tiếp đến vị trí ban đầu nơi Video thực sự được lưu trữ.
Sahil Manchanda

Nhưng nếu chúng ta cố gắng thay thế video đã chỉnh sửa, khi thời gian xóa video chưa được chỉnh sửa, nó sẽ yêu cầu quyền xóa photos, phải không? ...... có thể trông kỳ lạ, bạn có nghĩ vậy không ??
Naya Dave

2
@NayanDave chúng tôi không cần xóa video gốc. nếu bạn xem lớp PHAssetChangeRequest họ đã đề cập "chỉnh sửa nội dung của nội dung Ảnh" và đây là trường hợp của chúng tôi: chỉnh sửa video. vì vậy người dùng sẽ được nhắc chỉ một lần.
Sahil Manchanda

1
Bam cảm ơn bạn !!
thợ săn

3

Nếu bạn đã tìm nạp các tài sản và có đối tượng PHFetchResult hãy thử:

var video = PHAsset() // the video to be edited 

Giáo dục

 if video.canPerform(.content) {  // check if the selected PHAsset can be edited

  video.requestContentEditingInput(with: nil, completionHandler: { editingInput, _ in

  let videoAsset = editingInput?.audiovisualAsset // get tracks and metadata of the video and start editing
  let videoURL = (videoAsset as? AVURLAsset)?.url // This might be nil so better use videoAsset

        /*
         Start editing your video here


        */

  guard let input = editingInput else { return }
  let output = PHContentEditingOutput(contentEditingInput: input)
  let outputURL = output.renderedContentURL // URL at which you write/export the edited video, it must be a .mov file
  let editedVideo = NSData()  // suppose your video fileName is editedVideo.mov, I used NSData since I don't know what final edited object will be.
  editedVideo.write(to: outputURL, atomically: false)

  PHPhotoLibrary.shared().performChanges({
  let changeRequest = PHAssetChangeRequest(for: video)
  changeRequest.contentEditingOutput = output
               })
            })

        }

Hoặc nếu bạn đang sử dụng imagePicker mặc định, chúng tôi có thể lấy url video tmp bằng cách sử dụng:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as! NSURL
    print(videoURL)  // file is already in tmp folder


     let video = info[UIImagePickerController.InfoKey.phAsset] as! PHAsset
        // implement the above code using this PHAsset 

   // your will still need to request photo library changes, and save the edited video and/or delete the older one

    }

0

Tôi thực hiện một cái gì đó như thế này trong dự án của tôi, tôi hy vọng nó sẽ giúp bạn.

Tôi hiển thị tất cả các mục trong chế độ xem bộ sưu tập và thực hiện hành động khi chọn, bạn cũng có thể nhận được url của video đã chọn

func getVideoFromCameraRoll() {
    let options = PHFetchOptions()
    options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: false) ]
    options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.video.rawValue)
    videos = PHAsset.fetchAssets(with: options)
    videoLibraryCV.reloadData()
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return videos.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
    let asset = videos!.object(at: indexPath.row)
    let width: CGFloat = 150
    let height: CGFloat = 150
    let size = CGSize(width:width, height:height)
    cell.layer.borderWidth = 0.5
    cell.layer.borderColor = UIColor.lightGray.cgColor
    PHImageManager.default().requestImage(for: asset, targetSize: size, contentMode: PHImageContentMode.aspectFit, options: nil)
    {   (image, userInfo) -> Void in

        let imageView = cell.viewWithTag(1) as! UIImageView
        imageView.image = image

        let labelView = cell.viewWithTag(2) as! UILabel
        labelView.text = String(format: "%02d:%02d",Int((asset.duration / 60)),Int(asset.duration) % 60)
    }
    return cell
}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
 let asset = photos!.object(at: indexPath.row)
 guard(asset.mediaType == PHAssetMediaType.Video)
 else {
  print("Not a valid video media type")
  return
 }

 PHCachingImageManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {
  (asset: AVAsset ? , audioMix : AVAudioMix ? , info : [NSObject: AnyObject] ? ) in
  let asset = asset as!AVURLAsset
  print(asset.URL) // Here is video URL
 })

}

Tôi hy vọng nó sẽ làm việc cho bạn ... :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.