0

AVFoundation を使用してビデオを録画し、サーバーに送信しています。録画したビデオをサーバーに送信すると、内部サーバー エラーが返されます。しかし、録画したもの以外のダミー ビデオをアップロードすると、正常にアップロードされます。以下のコードを追加します。

let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
        let logsPath = documentsPath.appendingPathComponent(GlobalVar.interVCode)


    if !FileManager.default.fileExists(atPath: (logsPath?.absoluteString)!){
    do {
        try FileManager.default.createDirectory(at: logsPath!, withIntermediateDirectories: true, attributes: nil)
                   } catch let error as NSError {
        NSLog("Unable to create directory \(error.debugDescription)")
    }
    }
     let outputURL: URL = (self.applicationDocumentsDirectory().appendingPathComponent(GlobalVar.interVCode)?.appendingPathComponent("\(questionId)").appendingPathExtension("mp4"))!


 self.camera.startRecording(withOutputUrl: outputURL, didRecord: 

{(camera, outputURL, error) in

    })

カスタム カメラ コントローラー LLSimpleCamera を使用して記録を開始します。以下は、記録を開始するコードです。

     - (void)startRecordingWithOutputUrl:(NSURL *)url didRecord:(void (^)(LLSimpleCamera *camera, NSURL *outputFileUrl, NSError *error))completionBlock
{
    // check if video is enabled
     if(!self.videoEnabled) {
        NSError *error = [NSError errorWithDomain:LLSimpleCameraErrorDomain
                                                 code:LLSimpleCameraErrorCodeVideoNotEnabled
                                         userInfo:nil];
        [self passError:error];
        return;
    }

    if(self.flash == LLCameraFlashOn) {
        [self enableTorch:YES];
    }

    // set video orientation
    for(AVCaptureConnection *connection in [self.movieFileOutput connections]) {
        for (AVCaptureInputPort *port in [connection inputPorts]) {
            // get only the video media types
            if ([[port mediaType] isEqual:AVMediaTypeVideo]) {
                if ([connection isVideoOrientationSupported]) {
                    [connection setVideoOrientation:[self orientationForConnection]];
                }
            }
        }
    }

    self.didRecordCompletionBlock = completionBlock;

    [self.movieFileOutput startRecordingToOutputFileURL:url recordingDelegate:self];
}

大変助かりました。

4

1 に答える 1

1

サーバーへの記録とアップロードに UIImagePickerController を使用しています

    if   UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){

    imagePicker.delegate = self
    imagePicker.sourceType = .camera
    imagePicker.mediaTypes = [kUTTypeMovie as NSString as String]
    imagePicker.allowsEditing = false
    imagePicker.videoMaximumDuration = TimeInterval(10.0)

    self.present(imagePicker, animated: true, completion: nil)
    }

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    picker .dismiss(animated: true, completion: nil)



    let mediaType = info[UIImagePickerControllerMediaType] as! NSString

    if mediaType == kUTTypeMovie {
        guard let path = (info[UIImagePickerControllerMediaURL] as! NSURL).path else { return }
        if UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(path) {
 if let fileURL = info[UIImagePickerControllerMediaURL] as? NSURL {
                if let videoData = NSData(contentsOf: fileURL as URL) {
                    print(videoData.length)

                    let fileManager = FileManager.default
                    let paths = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("xyz.mov")
                    fileManager.createFile(atPath: paths as String, contents: videoData as Data, attributes: nil)
                }
            }


        }
    }else{
  }

 }

メソッドを使用して、ドキュメント ディレクトリからビデオのデータを取得し、サーバーにアップロードします

func uploadVideo(_ userDetails : [String : AnyObject]) {

    let imagePAth = URL(fileURLWithPath:(self.getDirectoryPath() as NSString).appendingPathComponent("xyz.mov") )

    //let videoData = UIImage(contentsOfFile: imagePAth)!

    do {let data = try Data(contentsOf: imagePAth)

        print(data)
 } catch {
        print(error)
    }



}
于 2017-01-12T11:56:18.823 に答える