MPMediaItem インスタンスを caf 形式のオーディオ ファイルに変換しようとしています。私は Chris Adamson の作品と彼の記事「iPod ライブラリから PCM サンプルへ、以前よりもはるかに少ないステップで」をフォローしてきました。
Swift でこれを行う方法を調べていたときに、Abel Domingues github FileConverter.swiftに出くわしました。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*Key キーを含める必要があり、kAudioFormatAppleLossless の場合、AVEncoderBitDepthHintKey キーを含める必要があります。-initWithMediaType を参照してください。
では、辞書の何がエラーを引き起こしているのでしょうか?