How to reverse an audio file?

后端 未结 4 516
渐次进展
渐次进展 2020-11-29 09:49

I\'d like to reverse an existing audio file (e.g. WAV, CAF, ...) on iOS. Any suggestions on how to achieve this? Open-source libraries?

4条回答
  •  -上瘾入骨i
    2020-11-29 10:26

    Kiran's answer in Swift 2.2:

        let forwardAudioURL: NSURL = ... // wherever your original audio is
        let reversedAudioURL: NSURL = ... // wherever you want the reversed file to go
    
        // Load forward audio into originalAudioFile
        var originalAudioFile: AudioFileID = nil
        let possibleError1 = AudioFileOpenURL(forwardAudioURL,
                                              AudioFilePermissions.ReadPermission,
                                              0,
                                              &originalAudioFile)
    
        // Load the size in bytes of the original audio into originalAudioSize variable
        var originalAudioSize: Int64 = 0
        var propertySize: UInt32 = 8
        let possibleError2 = AudioFileGetProperty(originalAudioFile,
                                                  kAudioFilePropertyAudioDataByteCount,
                                                  &propertySize,
                                                  &originalAudioSize)
    
        if possibleError1 != 0 || possibleError2 != 0 {
            // Handle errors if you want
        }
    
        // Set up file that the reversed audio will be loaded into
        var reversedAudioFile: AudioFileID = nil
        var format = AudioStreamBasicDescription()
        format.mSampleRate = 16000
        format.mFormatID = kAudioFormatLinearPCM
        format.mChannelsPerFrame = 1
        format.mFramesPerPacket = 1
        format.mBitsPerChannel = 16
        format.mBytesPerPacket = 2
        format.mBytesPerFrame = 2
        AudioFileCreateWithURL(reversedAudioURL,
                               kAudioFileCAFType,
                               &format,
                               AudioFileFlags.EraseFile,
                               &reversedAudioFile)
    
        // Read data into the reversedAudioFile
        var readPoint: Int64 = originalAudioSize
        var writePoint: Int64 = 0
        var buffer: Int16 = 0
        while readPoint > 0 {
            var bytesToRead: UInt32 = 2;
            AudioFileReadBytes(originalAudioFile,
                               false,
                               readPoint,
                               &bytesToRead,
                               &buffer)
            AudioFileWriteBytes(reversedAudioFile,
                                false,
                                writePoint,
                                &bytesToRead,
                                &buffer)
            writePoint += 2
            readPoint -= 2
        }
        AudioFileClose(originalAudioFile)
        AudioFileClose(reversedAudioFile)
    

提交回复
热议问题