AVFoundation:视频编解码器类型 avc1 不支持压缩属性质量

问题描述 投票:0回答:1

认为我正在寻找一种方法来检查视频设置键是否有效,因此如果无效,我可以将其排除。但我更好奇为什么有些密钥有时有效,但不一致。让我解释一下。

使用我的 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:) 隐约类似于我需要的,但它是为从相机录制而设计的。

swift macos avfoundation
1个回答
0
投票

这真的很奇怪,因为它似乎没有被记录下来。您可能会遇到这个问题,但根据我的经验,使用

AVEncoderBitRateKey
的目标比特率可能会得到更可靠的结果。

这里的好处是它可以让您更直接地控制文件大小。 3Mbps 的 8 秒视频始终为 3 MB。另外,它应该得到普遍支持(我从未使用过视频的质量密钥)。

缺点是相同的比特率对于不同的分辨率会产生不同的视觉质量水平。

例如根据 Google 的说法,8Mbps 的 1080p@30 视频 = 质量没有损失。 (根据我的经验,这甚至有点矫枉过正)。 然而,8Mbps 的 4K 视频在关键帧之间可能会出现大量撕裂和视觉伪影。

尝试一下,看看是否有效。确保作为 QA 验证您的文件大小和感知质量。至少你会消除一层神秘感,这可能很有价值。

© www.soinside.com 2019 - 2024. All rights reserved.