首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在从特定视频写入音频时,AVAssetWriter仅在iOS中失败

在从特定视频写入音频时,AVAssetWriter仅在iOS中失败
EN

Stack Overflow用户
提问于 2020-10-09 04:04:26
回答 1查看 407关注 0票数 2

我有一个调整视频大小的示例项目,它对大多数视频都很有效。但是,AVAssetWriter无法从特定视频中写入音频,错误如下:

代码语言:javascript
运行
复制
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模拟器中也会出现故障。

以下是我用于压缩资产轨道的设置:

代码语言:javascript
运行
复制
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.mp4rain.mp4。第一个目标在两个目标中都运行良好,但第二个目标在iOS中中断。

我是不是漏掉了什么东西,还是这很可能是苹果的漏洞?

EN

Stack Overflow用户

回答已采纳

发布于 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)。

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

代码语言:javascript
运行
复制
[AVFormatIDKey: kAudioFormatLinearPCM]

这意味着解压缩的音频将具有与源文件相同的频道数。在我们的例子中,我们有一个5.1 (实际上是6个)通道资产,我们希望将它写到一个2通道文件中。在AVAssetWriterInput中,似乎iOS没有正确地处理这种情况,我们得到了一个错误。

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

代码语言:javascript
运行
复制
[
    AVFormatIDKey: kAudioFormatLinearPCM
    AVNumberOfChannelsKey: 2
]
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64273790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档