微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅当从特定视频写入音频时,AVASsetWriter才会在iOS中失败

如何解决仅当从特定视频写入音频时,AVASsetWriter才会在iOS中失败

我有一个示例项目,用于调整视频的大小,适用于大多数视频。但是,pip3 install pyqt5==5.14.0无法写入来自特定视频的音频,并显示以下错误

AVAssetWriter

更有问题的是,如果我在macOS上运行相同的代码,则可以正常工作,但在iOS中会中断。我认为这不是硬件问题,因为它在iOS模拟器中也会中断。

这些是我用于(解压缩)资产轨道的设置:

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)"
  }
}

完整的源代码可以在here中找到。

在该项目中,有两个目标,一个针对Mac,另一个针对iOS,它们都使用相同的代码来调整视频大小。我还包括两个示例视频文件func audioDecompressionSettings() -> [String: Any] { return [ AVFormatIDKey: kAudioFormatLinearPCM ] } func audioCompressionSettings() -> [String: Any] { var audioChannelLayout = AudioChannelLayout() memset(&audioChannelLayout,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 ] } fruit.mp4。第一个在两个目标上均能正常工作,但第二个在iOS中无法使用。

在这里遗漏了一些东西吗,或者这可能是Apple的错误

解决方法

有问题的视频的音频设置为:

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),stereo,137 kb/s (default)

两者之间的重要区别是音频通道的数量:第一个音频通道为5.1(5个全带宽通道+一个低频效果通道),第二个音频通道为立体声(2)。

在读取视频文件时,我们指定解压缩设置:

[AVFormatIDKey: kAudioFormatLinearPCM]

这意味着解压缩的音频将具有与源文件相同的通道数。在我们的例子中,我们有一个5.1(实际上是6)通道的资产,我们想将其写入2通道文件。似乎AVAssetWriterInput在iOS中无法正确处理这种情况,我们会收到错误消息。

该问题的解决方案是在从资产解压缩音频时指定我们想要的音频通道数,如下所示:

[
    AVFormatIDKey: kAudioFormatLinearPCM
    AVNumberOfChannelsKey: 2
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。