簡體   English   中英

從特定視頻寫入音頻時,AVAssetWriter 僅在 iOS 失敗

[英]AVAssetWriter fails only in iOS when writing audio from specific videos

我有一個用於調整視頻大小的示例項目,適用於大多數視頻。 但是, 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.mp4rain.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), 48000 Hz, stereo, fltp, 137 kb/s (default)

兩者之間的重要區別在於音頻通道的數量:第一個為 5.1(5 個全帶寬通道 + 一個低頻效果通道),第二個為立體聲 (2)。

讀取視頻文件時,我們指定解壓設置:

[AVFormatIDKey: kAudioFormatLinearPCM]

這意味着解壓縮的音頻將具有與源文件相同數量的通道。 在我們的例子中,我們有一個 5.1(實際上是 6)通道資產,我們想將它寫入一個 2 通道文件。 似乎AVAssetWriterInput在 iOS 中沒有正確處理這種情況,我們得到一個錯誤。

該問題的解決方案是在從資產中解壓縮音頻時指定我們想要的音頻通道數,如下所示:

[
    AVFormatIDKey: kAudioFormatLinearPCM
    AVNumberOfChannelsKey: 2
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM