我有一个调整视频大小的示例项目,它对大多数视频都很有效。但是,AVAssetWriter无法从特定视频中写入音频,错误如下:
Error Domain=AVFoundationErrorDomain
Code=-11800 "The operation could not be completed"
UserInfo={
NSLocalizedFailureReason=An unknown error occurred (-12780),
NSLocalizedDescription=The operation could not be completed,
NSUnderlyingError=0x282e956e0 {
Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"
}
}更有问题的是,如果我在macOS上运行相同的代码,它可以正常工作,但它在iOS中会中断。我认为这不是硬件问题,因为它在iOS模拟器中也会出现故障。
以下是我用于压缩资产轨道的设置:
func audioDecompressionSettings() -> [String: Any] {
return [
AVFormatIDKey: kAudioFormatLinearPCM
]
}
func audioCompressionSettings() -> [String: Any] {
var audioChannelLayout = AudioChannelLayout()
memset(&audioChannelLayout, 0, MemoryLayout<AudioChannelLayout>.size)
audioChannelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo
return [
AVFormatIDKey: kAudioFormatMPEG4AAC,
AVSampleRateKey: 44100,
AVEncoderBitRateKey: 128000,
AVNumberOfChannelsKey: 2,
AVChannelLayoutKey: NSData(bytes: &audioChannelLayout, length: MemoryLayout<AudioChannelLayout>.size)
]
}
func videoDecompressionSettings() -> [String: Any] {
return [
kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,
kCVPixelBufferMetalCompatibilityKey as String: true
]
}
func videoCompressionSettings(size: CGSize) -> [String: Any] {
return [
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoWidthKey: size.width,
AVVideoHeightKey: size.height
]
}完整的源代码可以找到这里。
在该项目中,有两个目标,一个用于Mac,另一个用于iOS,它们都使用相同的代码来调整视频大小。我还包括两个示例视频文件:fruit.mp4和rain.mp4。第一个目标在两个目标中都运行良好,但第二个目标在iOS中中断。
我是不是漏掉了什么东西,还是这很可能是苹果的漏洞?
发布于 2020-10-09 06:48:07
有问题的视频的音频设置如下:
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 386 kb/s (default)
另一个是:
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 137 kb/s (default)
两者之间的重要区别是音频信道的数量: 5.1 (5个全带宽信道+一个低频效应信道)在第一个信道中,在第二个音频信道中为立体声信道(2)。
读取视频文件时,我们指定解压缩设置:
[AVFormatIDKey: kAudioFormatLinearPCM]这意味着解压缩的音频将具有与源文件相同的频道数。在我们的例子中,我们有一个5.1 (实际上是6个)通道资产,我们希望将它写到一个2通道文件中。在AVAssetWriterInput中,似乎iOS没有正确地处理这种情况,我们得到了一个错误。
解决这个问题的方法是在从资产解压缩音频时指定我们想要的音频通道的数量,如下所示:
[
AVFormatIDKey: kAudioFormatLinearPCM
AVNumberOfChannelsKey: 2
]https://stackoverflow.com/questions/64273790
复制相似问题