Ios 如何使用Objective-C转换短数组中的字节数组?

Ios 如何使用Objective-C转换短数组中的字节数组?,ios,objective-c,audio,effects,voice,Ios,Objective C,Audio,Effects,Voice,我正在为iOS开发一个与语音录制相关的移动应用程序 由于这个事实,我正在开发一些不同的声音效果来修改录制的声音,但我在实现其中一些方面遇到了问题 我试图创建回声/延迟效果,我需要将字节数组转换为短数组,但我不知道如何在Objective-C中实现 谢谢 这是我目前实现它的源代码,但和byte一样,byte是一种非常短的类型,当我应用衰减(必须返回浮点值)时,会在音频中产生可怕的噪音 - (NSURL *)echo:(NSURL *)input output:(NSURL *)output{

我正在为iOS开发一个与语音录制相关的移动应用程序

由于这个事实,我正在开发一些不同的声音效果来修改录制的声音,但我在实现其中一些方面遇到了问题

我试图创建回声/延迟效果,我需要将字节数组转换为短数组,但我不知道如何在Objective-C中实现

谢谢

这是我目前实现它的源代码,但和byte一样,byte是一种非常短的类型,当我应用衰减(必须返回浮点值)时,会在音频中产生可怕的噪音

- (NSURL *)echo:(NSURL *)input output:(NSURL *)output{

    int delay = 50000;
    float attenuation = 0.5f;

    NSMutableData *audioData = [NSMutableData dataWithContentsOfURL:input];
    NSUInteger dataSize = [audioData length] - 44;
    NSUInteger audioLength = [audioData length];

    NSUInteger newAudioLength = audioLength + delay;


    // Copy bytes
    Byte *byteData = (Byte*)malloc(audioLength);
    memcpy(byteData, [audioData bytes], audioLength);

    short *shortData = (short*)malloc(audioLength/2);

    // create a new array to store new modify data
    Byte *newByteData = (Byte*)malloc(newAudioLength);
    newByteData = byteData;

    for (int i = 44; i < audioLength - delay; i++)
    {
        newByteData[i + delay] += byteData[i] * attenuation;
    }

    // Copy bytes in a new NSMutableData
    NSMutableData *newAudioData = [NSMutableData dataWithBytes:newByteData length:newAudioLength];

    // Store in a file
    [newAudioData writeToFile:[output path] atomically:YES];

    // Set WAV size
    [[AudioUtils alloc] setAudioFileSize:output];

    return output;
}
-(NSURL*)回波:(NSURL*)输入输出:(NSURL*)输出{
int延迟=50000;
浮动衰减=0.5f;
NSMutableData*音频数据=[NSMutableData数据及其内容URL:input];
NSU整数数据大小=[音频数据长度]-44;
NSU整数audioLength=[audioData长度];
NSU整数newAudioLength=audioLength+延迟;
//复制字节
字节*字节数据=(字节*)malloc(音频长度);
memcpy(字节数据,[音频数据字节],音频长度);
short*shortData=(short*)malloc(audioLength/2);
//创建新数组以存储新的修改数据
字节*新字节数据=(字节*)malloc(新音频长度);
新字节数据=字节数据;
对于(int i=44;i
没有预定义的函数可以从字节数组创建短数组,但使用for循环应该相当简单

// create a short array
short *shortData = malloc(sizeof(short)*audioLength);
for (i=0; i<bytearray.length, i++)
{
    shortData[i] = byteData[i];
}
//创建一个短数组
short*shortData=malloc(sizeof(short)*audioLength);

对于(i=0;i最后,我可以实现这四种方法的回声效果。希望它们对您有用

字节到短数组
您的音频文件格式是什么?似乎是WAV?谢谢您的回答。但将字节转换为短数组是不够的,因为短对象是字节的两倍。因此,正如您在我的最终答案中所看到的,解决方案包括在短时间内连接两个字节:)现在我明白了您在短时间内连接两个字节的意思。你原来的问题不清楚,但我很高兴你把它解决了!干杯。除非我保持衰减为0,否则可怕的噪音仍然会到来。
- (short *) byte2short:(Byte *)bytes size:(int)size resultSize:(int)resultSize{
    short *shorts = (short *)malloc(sizeof(short)*resultSize);
    for (int i=0; i < size/2; i++){
        shorts[i] = (bytes[i*2+1] << 8) | bytes[i*2];
    }
    return shorts;
}
- (Byte *) short2byte:(short *)shorts size:(int)size resultSize:(int)resultSize{
    Byte *bytes = (Byte *)malloc(sizeof(Byte)*resultSize);
    for (int i = 0; i < size; i++)
    {
        bytes[i * 2] = (Byte) (shorts[i] & 0x00FF);
        bytes[(i * 2) + 1] = (Byte) (shorts[i] >> 8);
        shorts[i] = 0;
    }
    return bytes;
}
- (NSMutableData *) effect:(NSMutableData *)data delay:(int)delay attenuation:(float)attenuation{
    NSUInteger audioLength = [data length];

    // Copy original data in a byte array
    Byte *byteData = (Byte*)malloc(sizeof(Byte)*audioLength);
    memcpy(byteData, [data bytes], audioLength);

    short *shortData = (short*)malloc(sizeof(short)*(audioLength/2 + delay));
    shortData = [self byte2short:byteData size:(int)audioLength resultSize:(int)audioLength/2 + delay];

    // Array to store shorts
    short *newShortData = shortData;

    for (int i = 44; i < audioLength/2; i++)
    {
        newShortData[i + delay] += (short)((float)shortData[i] * attenuation);
    }

    Byte *newByteData = [self short2byte:newShortData size:(int)(audioLength/2 + delay) resultSize:(int)(audioLength + delay*2)];
    // Copy bytes to a NSMutableData in order to create new file
    NSMutableData *newAudioData = [NSMutableData dataWithBytes:newByteData length:(int)(audioLength + delay*2)];

    return newAudioData;
}
- (NSURL *)echo:(NSURL *)input output:(NSURL *)output{

    NSMutableData *audioData = [NSMutableData dataWithContentsOfURL:input];

    // we call effect method that returns a NSMutableData and create a new file
    [[self effect:audioData delay:6000 attenuation:0.5f] writeToFile:[output path] atomically:YES];

    // We set file's size (is a method I have implemented)
    [[AudioUtils alloc] setAudioFileSize:output];

    return output;
}