当前位置: 首页 > 面试题库 >

Swift-如何使用UIImagePickerController以MP4格式录制视频?

松雅健
2023-03-14
问题内容

我正在创建一个应用程序,其中需要录制视频并将其上传到服务器。现在我的项目也有一个android版本。为了支持android版本,我必须以mp4格式录制视频。我按照本教程将UIImagePicker媒体类型设置为电影格式imagePicker.mediaTypes = [kUTTypeMovie as String]

UIImagePickerController是最适合我的要求,我唯一需要更改的是将其保存为mp4格式。我试过了kUTTypeMPEG4mediaTypes但是在运行时抛出错误,没有错误描述。

这是我的视频捕获功能

func startCameraFromViewController() {

        if UIImagePickerController.isSourceTypeAvailable(.Camera) == false {
            return
        }
        viewBlack.hidden = false
        presentViewController(cameraController, animated: false, completion: nil)

        cameraController.sourceType = .Camera

        cameraController.mediaTypes = [kUTTypeMovie as String]
        //cameraController.mediaTypes = [kUTTypeMPEG4 as String]
        cameraController.cameraCaptureMode = .Video
        cameraController.videoQuality = .TypeMedium
        if(getPurchaseId() as! Int == 0)
        {
            if(txtBenchMark.text?.isEmpty == false)
            {
                cameraController.videoMaximumDuration = NSTimeInterval(300.0)
            }else{
                cameraController.videoMaximumDuration = NSTimeInterval(60.0)
            }
        }else{
            cameraController.videoMaximumDuration = NSTimeInterval(600.0)
        }
        cameraController.allowsEditing = false
    }

我正在使用Swift 2.2和Xcode 8 Use Legacy swift Language version = Yes

任何替代解决方案也表示赞赏。提前致谢。

编辑:我发现没有任何方法可以直接以mp​​4格式直接录制视频。只能从Apple的quicktime mov格式转换为所需的格式。


问题答案:

您可以使用以下代码将录制的视频转换为MP4:

func encodeVideo(videoURL: NSURL)  {
let avAsset = AVURLAsset(URL: videoURL, options: nil)

var startDate = NSDate()

//Create Export session
exportSession = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetPassthrough)

// exportSession = AVAssetExportSession(asset: composition, presetName: mp4Quality)
//Creating temp path to save the converted video


let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let myDocumentPath = NSURL(fileURLWithPath: documentsDirectory).URLByAppendingPathComponent("temp.mp4").absoluteString
let url = NSURL(fileURLWithPath: myDocumentPath)

let documentsDirectory2 = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL

let filePath = documentsDirectory2.URLByAppendingPathComponent("rendered-Video.mp4")
deleteFile(filePath)

//Check if the file already exists then remove the previous file
if NSFileManager.defaultManager().fileExistsAtPath(myDocumentPath) {
    do {
        try NSFileManager.defaultManager().removeItemAtPath(myDocumentPath)
    }
    catch let error {
        print(error)
    }
}

 url

exportSession!.outputURL = filePath
exportSession!.outputFileType = AVFileTypeMPEG4
exportSession!.shouldOptimizeForNetworkUse = true
var start = CMTimeMakeWithSeconds(0.0, 0)
var range = CMTimeRangeMake(start, avAsset.duration)
exportSession.timeRange = range

exportSession!.exportAsynchronouslyWithCompletionHandler({() -> Void in
    switch self.exportSession!.status {
    case .Failed:
        print("%@",self.exportSession?.error)
    case .Cancelled:
        print("Export canceled")
    case .Completed:
        //Video conversion finished
        var endDate = NSDate()

        var time = endDate.timeIntervalSinceDate(startDate)
        print(time)
        print("Successful!")
        print(self.exportSession.outputURL)

    default:
        break
    }

})


}

func deleteFile(filePath:NSURL) {
guard NSFileManager.defaultManager().fileExistsAtPath(filePath.path!) else {
    return
}

do {
    try NSFileManager.defaultManager().removeItemAtPath(filePath.path!)
}catch{
    fatalError("Unable to delete file: \(error) : \(__FUNCTION__).")
}
}


 类似资料:
  • 问题内容: 我正在努力理解它是如何工作的,但是对我来说却很难。=)我有1个视图,有一个按钮和一个小的ImageView区域可供预览。该按钮触发imagepickercontroller,UIView将显示拾取的图像。没有错误,但是图像未显示在UIImageView区域中。 问题答案: 您正在抓取具名,并且不存在此类图像。你注定要抓住用钥匙从词典:

  • 在我的Android应用程序中,我想通过改变mp4视频的分辨率、比特率来压缩mp4视频。我不想使用FFmpeg(因为我不想使用NDK),所以我决定使用MediaCodec API。 以下是我的逻辑步骤: null 我的问题是:我不知道如何设置解码器的输出和编码器的输入之间的连接。我可以将视频解码到一个表面,或者从一个表面编码一个新的视频。但我不明白怎么把它们联系起来。 我阅读了以下链接:Andro

  • 问题内容: 好的,基本上我有一个项目,要求对用户隐藏视频,同时仍然能够查看它们(使用php)。这是我到目前为止所得到的: video.php文件具有以下内容: 并且应该显示此内容的html文件使用的是预期的html5。现在这是东西..当我直接嵌入这个(不是)时,它起作用了。但是它在我的iPhone上不起作用,并且在标签中也不起作用…如果我使用直接文件而不是php包装器,那么一切也可以在我的iPho

  • 问题内容: 我正在尝试以编程方式创建UIImage视图,我有一个新视图,并且尝试这样做 这行不通,因为我不知道 您 在第二行中应该看到的是什么。 问题: 如何通过编码而不是在情节提要中使UIImageView出现在屏幕上 问题答案: 首先,您从图片文件中创建一个,然后从中创建一个: 最后,您需要给出一个框架并将其添加到视图中以使其可见:

  • 我知道这个问题已经被问了很多次,有很多问题、答案和讨论。但我不知道该做什么,不该做什么。 我已经参考了下面的链接,以获得解决方案,但运气不好。 https://stack overflow . com/questions/23438767/how-to-record-video-on-kit kat-4-4 < br > https://stack overflow . com/questions

  • 我是为了视频压缩而引用这个链接。https://github.com/lalongoo/videocompressor当我压缩。mkv文件时,它的工作和提供更小的大小,但当我压缩。mp4文件时,它提供的大小比视频的原始大小更大。我不明白我必须做什么改变来实现这一点。..这段代码使用MediaCodec进行视频压缩。..是否可以快速压缩?