2016-10-13 68 views
1

我正在嘗試將MPMediaItem實例轉換爲caf格式的音頻文件。我一直在關注克里斯·亞當森和他的崗位的工作對From iPod Library to PCM Samples in Far Fewer Steps Than Were Previously Necessary如何使用AVAssetWriterInput實例創建outputSettings字典<String. Any>?

我正四處尋找如何在迅速做到這一點我碰到 亞伯Domingues github上FileConverter.swift來抓斯威夫特只是在做這個。

然後,我設置轉換爲Swift 3作爲協議的擴展。 一切都很順利,直到我嘗試運行它。它在assetWriterInput對象創建時崩潰,似乎與outputSettings變量有關。

 var outputSettings = [ 
      AVFormatIDKey: kAudioFormatLinearPCM, 
      AVSampleRateKey: 44100, 
      AVNumberOfChannelsKey: 2, 
      AVChannelLayoutKey: NSData(bytes:&channelLayout, length:MemoryLayout<AudioChannelLayout>.size), 
      AVLinearPCMBitDepthKey: 16, 
      AVLinearPCMIsNonInterleaved: false, 
      AVLinearPCMIsFloatKey: false, 
      AVLinearPCMIsBigEndianKey: false 
     ] as [String : Any] 

     // create an asset writer input 
     let assetWriterInput = AVAssetWriterInput(mediaType:AVMediaTypeAudio, outputSettings:outputSettings as NSDictionary as! [String : Any]) 

我收到錯誤信息是:

-[_SwiftValue unsignedIntValue]: unrecognized selector sent to instance 0x1704407b0 2016-10-13 18:34:52.032784 Testie[3098:1535938] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue unsignedIntValue]: unrecognized selector sent to instance 0x1704407b0'

我已經尋找這樣的例子,但必須職位在Objective-C和/或與設置在字典視頻。

這是與音頻有關AVAssetWriterInput源文件:

對於AVMediaTypeAudio下面的鍵不當前 支持outputSettings詞典:AVEncoderAudioQualityKey和 AVSampleRateConverterAudioQualityKey。使用此初始化程序時,必須完整指定 音頻設置字典,這意味着它必須包含AVFormatIDKey,AVSampleRateKey和 AVNumberOfChannelsKey。如果沒有可用的其他通道佈局信息 ,則AVNumberOfChannelsKey值爲1將導致單聲道 輸出,值爲2將導致立體聲輸出。如果 AVNumberOfChannelsKey指定的通道數大於2,那麼 字典還必須爲AVChannelLayoutKey指定一個值。對於 kAudioFormatLinearPCM,必須包含所有相關的AVLinearPCM *鍵密鑰 ,並且對於kAudioFormatAppleLossless,必須包含AVEncoderBitDepthHintKey 鍵。請參閱 -initWithMediaType:outputSettings:sourceFormatHint:用於避免必須爲每個鍵指定值的方法。

那麼在字典中是什麼導致了錯誤?

+0

我可以發佈更多的代碼,我只是不想淹死這個問題了。 –

回答

2

在夫特3,kAudioFormatLinearPCM導入爲UInt32(又名AudioFormatID),並且把在時[String: Any]夫特3.0.0不能將其轉換爲適當的類型(NSNumber在這種情況下)。

試試這個:

var outputSettings = [ 
     AVFormatIDKey: UInt(kAudioFormatLinearPCM), 
     AVSampleRateKey: 44100, 
     AVNumberOfChannelsKey: 2, 
     AVChannelLayoutKey: NSData(bytes:&channelLayout, length:MemoryLayout<AudioChannelLayout>.size), 
     AVLinearPCMBitDepthKey: 16, 
     AVLinearPCMIsNonInterleaved: false, 
     AVLinearPCMIsFloatKey: false, 
     AVLinearPCMIsBigEndianKey: false 
    ] as [String : Any] 

一直等到的Xcode 8.1/3.0.1雨燕,它應該解決您的案件。

相關問題