【问题标题】:How to write array of float values to audio file in Core Audio?如何将浮点值数组写入 Core Audio 中的音频文件?
【发布时间】:2011-03-08 11:31:30
【问题描述】:

我正在尝试使用 Core Audio 实现线性卷积,我已经实现并运行了算法,但我正在尝试将其输出写入 .wav 音频文件。这是算法的代码...

    //Create array containing output of convolution (size of array1 + array2 - 1)
float *COutput;

COutput = (float *)malloc(((size1+size2)-1)* sizeof(float));

int sizeOutput = ((size1 + size2)-1);


//Convolution Algorithm!!!

for (i=0; i<sizeOutput; i++) {

    COutput[i]=0;

    for (j=0; j<sizeCArray1; j++) {

        if (((i-j)+1) > 0) {
            COutput[i] += CArray1[i - j] * CArray2[j];
        }

    }

}

我需要将 COutput(一个标准的浮点数组)中的浮点值写入音频文件。我假设我最初需要将这些浮点值发送到 AudioBufferList 中的 AudioBuffer 是否正确?或者有什么简单的方法吗?

非常感谢您的帮助或指导!

【问题讨论】:

    标签: objective-c arrays audio core-audio audioformat


    【解决方案1】:

    免费的 DiracLE 时间拉伸库 (http://dirac.dspdimension.com) 具有实用程序代码,可将 ABL (AudioBufferLists) 转换为浮点数组,反之亦然,作为其示例代码的一部分。查看他们的 EAFRead 和 EAFWrite 类,它们正是您正在寻找的。​​p>

    【讨论】:

      【解决方案2】:

      是的,我会将它们放入 AudioBuffer 中,然后放入 AudioBufferList 中。之后,您可以在使用 ExtAudioFileCreateNew() 创建的 ExtAudioFileRef 上使用 ExtAudioFileWrite() 将它们写入文件。

      音频文件文档: http://developer.apple.com/library/mac/#documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html%23//apple_ref/doc/uid/TP40007912

      【讨论】:

        【解决方案3】:

        这是一个迟到的答案,但我很难获得一个 float * 缓冲区来写入 Swift 中的文件。

        发布此示例以防它对某人有所帮助。

        enum AudioFileError: ErrorType {
            case FailedToCreate(OSStatus)
            case FailedToWrite(OSStatus)
            case FailedToClose(OSStatus)
        }
        
        func writeAudioData(audioData:NSData, toFile destination:NSURL, description:AudioStreamBasicDescription) throws {
            //get a pointer to the float buffer
            let floatBuffer = UnsafeMutablePointer<Float>(audioData.bytes)
        
            //get an AudioBufferList from the float buffer
            let buffer = AudioBuffer(mNumberChannels: 1, mDataByteSize: UInt32(audioData.length), mData: floatBuffer)
            var bufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: buffer)
        
        
            //create the CAF file using the stream description
            var file = ExtAudioFileRef()
            var result:OSStatus = noErr
        
            var streamDescription = description
        
            withUnsafePointer(&streamDescription) { streamDescription in
                withUnsafeMutablePointer(&file) { file in
                    result = ExtAudioFileCreateWithURL(destination, kAudioFileCAFType, streamDescription, nil, AudioFileFlags.EraseFile.rawValue, file)
                }
            }
        
            if result != noErr {
                throw AudioFileError.FailedToCreate(result)
            }
        
            //write the AudioBufferList to the file
            withUnsafeMutablePointer(&bufferList) { bufferList in
                result = ExtAudioFileWrite(file, UInt32(audioData.length / sizeof(Float)), bufferList)
            }
        
            if result != noErr {
                throw AudioFileError.FailedToWrite(result)
            }
        
            //close the file
            result = ExtAudioFileDispose(file)
        
            if result != noErr {
                throw AudioFileError.FailedToClose(result)
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-19
          • 1970-01-01
          • 2016-04-17
          相关资源
          最近更新 更多