49290


拡張子が.wav形式のファイルを読み込みたいのですが、できません。  
XcodeはVersion 9.0.1 でswiftはversion 4.0です。

.wavファイルから最終的にデータ部分をIntやFloatのarrayとして取り出したいです。

下記のソースコードは  
<http://atmarkplant.com/ios-wav-file-read/>  
をもとに書きました

[code]

    let orgWaveData:NSData = try NSData(contentsOfFile:"/Users/username/Desktop/sample.WAV",options:[])
    let subWaveData:NSData = orgWaveData.subdata(with: NSMakeRange(44, orgWaveData.length-44)) as NSData
    let sample = malloc(subWaveData.length)
    memcpy(sample, subWaveData.bytes, subWaveData.length);
    
[/code]

また、AudioToolboxを使いできないかと思い、下記のようなコードでも試してみましたが、  
resultが-54という結果で、うまく取得できていませんでした。

[code]

    import AudioToolbox
    
    let filePath = "/Users/username/Desktop/sample.WAV"
    let url: CFURL = NSURL(fileURLWithPath: filePath)
    var dataPointer:AudioFileID?
    let filetype = kAudioFileWAVEType
    let result = AudioFileOpenURL(url,.readPermission,filetype, &dataPointer)
    
[/code]


CC BY-SA 4.0
2018-10-15T04:25:57.880
49287
2018-10-15T07:42:36.120
25745
question
swift4
swiftでWAVファイルを読み込みたい


[`AVAudioFile`](https://developer.apple.com/documentation/avfoundation/avaudiofile)を使ってみてはいかがでしょうか。

[ネタ元はこちら](https://stackoverflow.com/q/34751294/6541007)ですが、最新版のXcode 10/Swift
4.2に合わせて書き換えています。(申し訳ありませんが、Xcode 9.0.1は手元にありません。それほど大きな書き換えはいらないと思います…。)

[code]

    import Foundation
    import AVFoundation
    
    let url = URL(fileURLWithPath: "/Users/dev/Desktop/sound.wav")
    doBlock: do {
        //所定の処理形式でデータを読み込む(16-bit整数、非インターリーブ)
        let file = try AVAudioFile(forReading: url, commonFormat: .pcmFormatInt16, interleaved: false)
        let format = file.processingFormat
        print(format)
        //AVAudioPCMBufferを`file.processingFormat`と同じフォーマットで作成
        guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: 1024) else {
            print("Failed to create AVAudioPCMBuffer")
            break doBlock
        }
        //AVAudioPCMBufferに読み込み
        try file.read(into: buffer)
        //UnsafeBufferPointerに変換する
        var samples: [UnsafeBufferPointer<Int16>] = []
        let channels = Int(format.channelCount)
        for ch in 0..<channels {
            samples.append(UnsafeBufferPointer(start: buffer.int16ChannelData![ch], count: Int(buffer.frameLength)))
        }
        //AVAudioPCMBufferが解放されてしまうと以下の処理が失敗するので、おまじない
        withExtendedLifetime(buffer) {
            //最初の50サンプルを出力してみる
            for i in 0..<50 {
                let index = i * buffer.stride
                for ch in 0..<channels {
                    print(samples[ch][index], terminator: " ")
                }
                print()
            }
        }
    
    } catch {
        print(error)
    }
    
[/code]

ご質問中のリンク先記事は、WAVファイルのヘッダが44バイトなんて言い切っていたりして、いまいち信頼性が低いような気がします。私のコードもありとあらゆるWAVファイルで試してみただけではありませんが。

お試しの上、何かお気付きの点があればおしらせください。


CC BY-SA 4.0
2018-10-15T07:15:24.407
49290
2018-10-15T07:42:36.120
2018-10-15T07:42:36.120
13972
13972
49287
answer