我认为我正在寻找一种方法来检查视频设置键是否有效,因此如果无效,我可以将其排除。但我更好奇为什么有些密钥有时有效,但不一致。让我解释一下。
使用我的 macOS 应用程序,我尝试编写具有压缩质量设置的视频,如下所示
let videoWriter = AVAssetWriterInput(
mediaType: .video,
outputSettings:
[
AVVideoWidthKey: 1000,
AVVideoHeightKey: 1000,
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoCompressionPropertiesKey: [
AVVideoQualityKey: 0.4
]
]
)
它适用于我的 M1Max(13.4、13.5)、Intel Mac(12.0.1),但对于我的一个(现在?)用户(13.5/Intel、Macbook16,1),此行会引发异常并使应用程序崩溃.
这是输出
*** -[AVAssetWriterInput initWithMediaType:outputSettings:sourceFormatHint:]
Compression property Quality is not supported for video codec type avc1
这个小应用程序为我的用户重现了崩溃(但仍然不适合我) https://github.com/mortenjust/CompressionCrashTest/blob/main/CompressionCrashTest/ContentView.swift
我尝试通过包装器使用 Swift 来捕获 objc 异常(来自 AV Foundation),但看起来这是一个坏主意,并且 Apple 不推荐。
我还尝试将编解码器更改为
.hevc
,但这也崩溃了,说 Quality
不是受支持的键。
我尝试要求我的用户重新启动,但没有效果。
我尝试在 Mac 上导出压缩质量为 0.1 的视频来验证它是否是有效的密钥,输出的视频经过压缩,文件尺寸小且视觉扭曲。
我尝试从 13.4 升级到 13.5 以匹配他的规格,但对我来说仍然没有崩溃。
我真的希望有一种方法可以验证视频设置字典而不崩溃。
我发现 AVCaptureMovieFileOutput /supportedOutputSettingsKeys(for:) 隐约类似于我需要的,但它是为从相机录制而设计的。
这真的很奇怪,因为它似乎没有被记录下来。您可能会遇到这个问题,但根据我的经验,使用
AVEncoderBitRateKey
的目标比特率可能会得到更可靠的结果。
这里的好处是它可以让您更直接地控制文件大小。 3Mbps 的 8 秒视频始终为 3 MB。另外,它应该得到普遍支持(我从未使用过视频的质量密钥)。
缺点是相同的比特率对于不同的分辨率会产生不同的视觉质量水平。
例如根据 Google 的说法,8Mbps 的 1080p@30 视频 = 质量没有损失。 (根据我的经验,这甚至有点矫枉过正)。 然而,8Mbps 的 4K 视频在关键帧之间可能会出现大量撕裂和视觉伪影。
尝试一下,看看是否有效。确保作为 QA 验证您的文件大小和感知质量。至少你会消除一层神秘感,这可能很有价值。