1

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 を参照してください。

では、辞書の何がエラーを引き起こしているのでしょうか?

4

1 に答える 1