我一直在寻找答案,但却找不到它 - 显然;)
这就是我所拥有的 - 我有一个单词列表.每个单词都保存为iPhone上的wav文件.在我的应用程序中,用户将选择单词,我想将这些单词放在一起来制作一个句子.
我无法确定如何将多个wav文件按顺序组合在一起,以将整个句子创建为单个文件.
我已经通过示例想出了如何将文件作为一个文件一起播放 - 但是示例混合它们 - 我需要基本上将它们相互附加.我试图将它们相互追加并从除第一个文件之外的所有文件中删除标题信息,但此过程不起作用.该文件的长度正确,但只播放第一个文件的内容.
我认为正确的路径是使用AudioFileReadPacketData读取文件,AudioFileWritePacketData将信息写入新文件.事实证明这很难......
有没有人有音频API的经验,可以提供一些示例代码?
好的 - 对此事的更多研究......看起来正确的功能是音频队列离线渲染.Apple提供了一些示例代码(AQOfflineRenderTest).脱机渲染的原因是您可以将输出缓冲区附加到渲染并将其保存到文件中.随着项目的进展,还有更多......
好的 - 三天没有真正的进展....
我试图将三个.wav文件合并到目标.wav文件中.现在,当您运行此代码时,第一个文件将保存到目标中.
有任何想法吗?
此源代码使用Apple提供的iPublicUtility类 - 它们可以在多个项目中下载.一个是项目是aurioTouch.
这是我的代码(将它放在一个.cpp文件中,并在普通的Objective C源文件中引用CombineAudioFiles):
// standard includes
#include <AudioToolbox/AudioQueue.h>
#include <AudioToolbox/AudioFile.h>
#include <AudioToolbox/ExtendedAudioFile.h>
// helpers
#include "CAXException.h"
#include "CAStreamBasicDescription.h"
#define kNumberOfBuffers 3
#define kMaxNumberOfFiles 3
// the application specific info we keep track of
struct AQTestInfo
{
AudioFileID mAudioFile[kMaxNumberOfFiles];
CAStreamBasicDescription mDataFormat[kMaxNumberOfFiles];
AudioQueueRef mQueue[kMaxNumberOfFiles];
AudioQueueBufferRef mBuffer[kNumberOfBuffers];
UInt32 mNumberOfAudioFiles;
UInt32 mCurrentAudioFile;
UInt32 mbufferByteSize;
SInt64 mCurrentPacket;
UInt32 mNumPacketsToRead; …Run Code Online (Sandbox Code Playgroud) 我试图操纵波形文件头.我已将文件加载到NSMutableData中,并尝试更改wav文件头信息.我的问题是在线:
[maindata replaceBytesInRange:range withBytes:((UInt32 *)tfSC1Length)];
Run Code Online (Sandbox Code Playgroud)
我收到了EXC_BAD_ACCESS错误.无法理解为什么.有任何想法吗?
我使用的代码如下:
// calculate total file length (minus 8 for the header), chunk size, number of channels, sample rate and bits per sample
int tfLength = ([maindata length] - 8);
int tfChannels = 1; // mono
int tfSampleRate = 44100;
int tfDataLength = ([maindata length] - 44);
int tfBitsPerSample = 16;
int tfSC1Length = 16;
int tfAudioFormat = 1;
//we are rebuilding the header for the wave files...
// chunk identifier
((char *)[maindata mutableBytes])[0] = …Run Code Online (Sandbox Code Playgroud) iphone ×2