Swift - 压缩视频文件

2024-01-09

所以,目前我正在使用它来压缩视频:

func compressVideo(inputURL: NSURL, outputURL: NSURL, handler:(session: AVAssetExportSession)-> Void)
    {
        let urlAsset = AVURLAsset(URL: inputURL, options: nil)

        let exportSession = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetMediumQuality)

        exportSession!.outputURL = outputURL

        exportSession!.outputFileType = AVFileTypeQuickTimeMovie

        exportSession!.shouldOptimizeForNetworkUse = true

        exportSession!.exportAsynchronouslyWithCompletionHandler { () -> Void in

            handler(session: exportSession!)
        }

    }

当我在2秒内录制视频时,大小为4,3 MB当我在 6 秒内录制视频时,文件大小为9,3 MB.

有什么减小尺寸的技巧吗?


此扩展侧重于将其导出到较低质量设置(在本例中为“中”)并使用mp4容器,在moviOS 青睐的容器。这可能会导致质量下降,但您可以在微调输出时尝试更高的输出设置和不同的格式。

extension PreviewVideoViewController: AVCaptureFileOutputRecordingDelegate {
    func fileOutput(_ output: AVCaptureFileOutput,
                    didFinishRecordingTo outputFileURL: URL,
                    from connections: [AVCaptureConnection],
                    error: Error?) {
        guard let data = try? Data(contentsOf: outputFileURL) else {
            return
        }

        print("File size before compression: \(Double(data.count / 1048576)) mb")

        let compressedURL = NSURL.fileURL(withPath: NSTemporaryDirectory() + UUID().uuidString + ".mp4")
        compressVideo(inputURL: outputFileURL as URL,
                      outputURL: compressedURL) { exportSession in
            guard let session = exportSession else {
                return
            }

            switch session.status {
            case .unknown:
                break
            case .waiting:
                break
            case .exporting:
                break
            case .completed:
                guard let compressedData = try? Data(contentsOf: compressedURL) else {
                    return
                }

                print("File size after compression: \(Double(compressedData.count / 1048576)) mb")
            case .failed:
                break
            case .cancelled:
                break
            }
        }
    }


    func compressVideo(inputURL: URL,
                       outputURL: URL,
                       handler:@escaping (_ exportSession: AVAssetExportSession?) -> Void) {
        let urlAsset = AVURLAsset(url: inputURL, options: nil)
        guard let exportSession = AVAssetExportSession(asset: urlAsset,
                                                       presetName: AVAssetExportPresetMediumQuality) else {
            handler(nil)

            return
        }

        exportSession.outputURL = outputURL
        exportSession.outputFileType = .mp4
        exportSession.exportAsynchronously {
            handler(exportSession)
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift - 压缩视频文件 的相关文章

随机推荐

  • 将日期时间与未指定和 UTC 类型进行比较

    我有2个DateTime values date1 date2 比较这 2 个日期时 这 2 个日期相等 if DateTime Compare date1 date2 0 有人可以解释为什么吗 对我来说有点奇怪 当将 date1 未指定类
  • 我应该为 JavaScript 链接使用哪个“href”值,“#”还是“javascript:void(0)”?

    以下是构建仅用于运行 JavaScript 代码的链接的两种方法 就功能 页面加载速度 验证目的等而言 哪个更好 function myJsFunc alert myJsFunc a href Run JavaScript Code a o
  • jquery滚动,当页面滚动时更改导航活动类,相对于部分

    http jsfiddle net motocomdigital gUWdJ http jsfiddle net motocomdigital gUWdJ 我正在寻找 jquery 滚动技术 我想适应我的项目 请在此处查看我的项目示例作为小
  • 跨平台桌面应用程序

    我想开发一个跨平台应用程序 我不确定哪个最适合桌面应用程序 微软银光 土坯空气 爪哇 不想这样做 火狐浏览器插件 有很多选项可供您使用 但您的选择可能取决于桌面应用程序的复杂程度 Medium to high level complixit
  • 其中(向量 1 < 向量 2)

    让我们先举一个在 R 中计算的小例子 x lt c 1 3 1 4 2 max which x lt 2 1 3 现在 我不仅想对一个值 2 执行此操作 而且还想同时对多个值执行此操作 它应该给我类似的东西 max which x
  • 我可以将泛型属性存储到对象的字段中吗

    假设有以下类存根 public class Foo
  • 无法访问 /dev/mem。尝试在 Raspberry Pi 上以 root 身份运行

    我是一个树莓派菜鸟 我已经完成所有设置 我正在尝试使用浏览器通过浏览器运行文件shell exec 这是 python 文件的内容 usr bin python import time import RPi GPIO as GPIO PIN
  • 测试 Spring MVC 控制器的 @MessageMapping WebSocket 方法

    我目前正在试验 Spring 4 0 中添加的对 WebSockets 的支持 如中所述本指南 http spring io guides gs messaging stomp websocket 如指南中所示 用注释的方法 Message
  • 需要想法。 Javascript+XPCOM+C++ 插件

    因此 Firefox 中有一个 WebRTC 并且有一个方便的类可以实现 RTC 通信 称为 RTCPeerConnection 可以从 JavaScript 应用程序实例化和使用它 你可以在上面找到一些不错的例子 1 https appr
  • 在命令行上运行 yii 控制器/操作

    是否可以像使用 CodeIgniter 一样在 linux 命令行上运行 yii 控制器 动作 CI风格 php index php 控制器操作 class NotifyUnsharedItemsCommand extends CConso
  • 如何在 Inno Setup 中检查 64/32 位

    我想进入一个文件夹 这将是Program Files x86 如果是 64 位Program Files如果是 32 位 如何在 Inno 设置中做到这一点 这是我尝试过的代码 但没有运气 procedure CurUninstallSte
  • 修改Python中的符号链接

    如何在 Python 中更改符号链接以从一个文件指向另一个文件 The os symlink https docs python org 3 library os html os symlink函数似乎只能用于创建新的符号链接 如果您需要原
  • Android启动画面一开始是白色的?

    当我启动我的应用程序时 在出现闪屏之前我会看到白屏几秒钟 我想知道我的应用程序的大小是否会影响它 它是 17 7MB 或者是因为我的测试设备很旧 HTC Desire HD 并且数据太多而有点损坏 或者这是正常行为 或者也许问题出在我的代码
  • 更改 networkx 多重图中的边属性

    在多重图中 每次调用 add edge a b weight 1 都会在节点之间添加一条新边a and b 构建图表时 是否可以修改此权重a and b又被发现了 现在我检查 a b 或 b a 是否连接 然后必须delete边缘 以及ad
  • Java 中 % 运算符和 IEEEremainder() 方法之间的区别(如果有的话)?

    在 Java 中 使用 运算符获取整数除法 x y 的余数与 Math IEEEremainder x y 方法之间是否存在功能或性能差异 除了 John B 已经指出的类型差异之外 语义上也存在显着差异 Math IEEEremainde
  • 当应用程序在后台运行时,如何对 Core Data iCloud 同步通知采取行动?

    我有一个 iOS 应用程序 它使用 Core Data 和 iCloud 同步 该应用程序运行完美 并且可以跨多个设备同步 作为我的实现的一部分 我的应用程序注册为 NSPersistentStoreCoordinatorStoresDid
  • 如何在 iOS 上读取、修改和写入 PDF (CGPDFDocument)?

    我正在尝试修改 iOS 上现有 PDF 的 PDF 元数据 标题 作者等 虽然很容易找到用于 PDF 解析和从头开始创建 PDF 的示例代码 但似乎没有一种简单的方法可以将现有 PDF 转储到新文件中 并稍微修改它 更具体地说 如何获取阅读
  • 最长最大重复子串

    子串的长度可以是 1 2 3 我试图解决的问题涉及找到出现次数最多的子字符串 所以它基本上分解为寻找具有最大频率的字符 然而 我发现我可以使用后缀树在 O n 中找到最长的重复子串 但是 后缀树返回子字符串 并优先考虑长度 我想找到出现次数
  • 如何在文件顶部添加新的文本行?

    我正在开发一个简单的程序 使Python脚本可执行 并且我正在添加解释器路径的部分 usr bin python 我尝试这样做 但它没有添加新行 而是替换了当前的行and删除下一行的一部分 我做错了什么 我将源代码上传到Ubuntu Pas
  • Swift - 压缩视频文件

    所以 目前我正在使用它来压缩视频 func compressVideo inputURL NSURL outputURL NSURL handler session AVAssetExportSession gt Void let urlA