将AVAset压缩并编码为mp4

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将AVAset压缩并编码为mp4相关的知识,希望对你有一定的参考价值。

我正在尝试压缩AVAsset以降低质量,然后将其导出为mp4。输入资产可以是相机胶卷允许的任何类型的视频。

我遇到的问题是,当我尝试将资产导出到AVAssetExportPresetMediumQuality时,当输入最初是mp4文件时,它在第一个保护声明中失败。但是,如果我将其更改为AVAssetExportPresetPassthrough,则可以使用,但不会压缩文件。是否有一种方法来压缩/编码最初可能是.mov或.mp4的资产?

func encodeVideo(asset: AVAsset, completionHandler: @escaping (URL?, String?) -> ())  
    guard let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetPassthrough) else 
        completionHandler(nil, nil)
        return
    
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
    let filePath = documentsDirectory.appendingPathComponent("compressed-video.mp4")
    if FileManager.default.fileExists(atPath: filePath.path) 
        do 
            try FileManager.default.removeItem(at: filePath)
         catch 
            completionHandler(nil, nil)
        
    
    exportSession.outputURL = filePath
    exportSession.outputFileType = .mp4
    exportSession.shouldOptimizeForNetworkUse = true
    let start = CMTimeMakeWithSeconds(0.0, preferredTimescale: 0)
    let range = CMTimeRangeMake(start: start, duration: asset.duration)
    exportSession.timeRange = range

    exportSession.exportAsynchronously 
        switch exportSession.status 
        case .failed:
            print("Conversion Failed")
            completionHandler(nil, exportSession.error?.localizedDescription)
        case .cancelled:
            print("Conversion Cancelled")
            completionHandler(nil, exportSession.error?.localizedDescription)
        case .completed:
            completionHandler(exportSession.outputURL, nil)
            default: break
        
    

答案

经过进一步的测试和研究,这似乎是模拟器(Xcode 11.1和iPhone 11 Pro模拟器,ios 13.1)的问题/可能的错误。不知道这是否适用于其他模拟器,但是使用AVAssetExportPresetMediumQuality的上述代码在我的设备测试中起作用。

以上是关于将AVAset压缩并编码为mp4的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg4入门13:h264编码为mp4

用Premiere如何将带Alpha透明通道的视频文件压缩为同效果mp4文件

解决部分mp4视频在ios上无法播放问题

Gstreamer:使用 AAC 编码将麦克风音频编码为 mp4

FFMPEG 如何将 MJPEG 编码数据复用到 mp4 或 avi 容器 c++

ffmpeg将yuv文件编码为mp4