【发布时间】:2011-09-10 19:13:44
【问题描述】:
我已经为此苦苦挣扎了很长一段时间,并且没有在网上完成它的代码示例。谁能帮我?
我的应用使用 AVFoundation 来录制音频。 @16 位深度,2 通道,WAV
我可以访问音频的字节,我只是不知道如何反转它。
【问题讨论】:
标签: iphone objective-c audio reverse
我已经为此苦苦挣扎了很长一段时间,并且没有在网上完成它的代码示例。谁能帮我?
我的应用使用 AVFoundation 来录制音频。 @16 位深度,2 通道,WAV
我可以访问音频的字节,我只是不知道如何反转它。
【问题讨论】:
标签: iphone objective-c audio reverse
波形数据样本是交错的。这意味着数据是这样组织的。
Sample 1 Left | Sample 1 Right | Sample 2 Left | Sample 2 right ... Sample n Left | Sample n right
由于每个样本都是 16 位(2 个字节),因此前 2 个通道样本(即左右两边)的大小为 4 个字节。
这样你就知道一个波形数据块中的最后一个样本如下:
wavDataSize - 4
然后,您可以通过从记录结束开始并向后读取将其复制到不同的缓冲区来一次加载每个样本。当您到达波形数据的开头时,您已经反转了波形数据并且播放将被反转。
编辑:如果您想要在 iOS 上轻松读取波形文件,请查看Audio File Services Reference。
编辑2:
readPoint = waveDataSize;
writePoint = 0;
while( readPoint > 0 )
{
readPoint -= 4;
Uint32 bytesToRead = 4;
Uint32 sample;
AudioFileReadBytes( inFile, false, maxData, &bytesToRead &sample );
AudioFileWriteBytes( outFile, false, writePoint, &bytesToRead, &sample );
writePoint += 4;
}
【讨论】:
假设一个单块 WAV 文件,请尝试对文件进行内存映射,并在回调期间从文件末尾开始以相反的顺序将样本复制到音频队列或 RemoteIO 缓冲区中,同时使用这些 API 之一播放音频。在到达 WAV/RIFF 标头(通常是第一个 44 字节)之前停止复制。
【讨论】:
要反转音频,为什么不在 MPMediaPlayback 中使用 currentPlaybackRate (https://developer.apple.com/library/ios/#DOCUMENTATION/MediaPlayer/Reference/MPMediaPlayback_protocol/Reference/Reference.html)
【讨论】: