ios - 如何使用 Objective-C 将字节数组转换为短数组?

标签 ios objective-c audio effects voice

我正在为 iOS 开发与录音相关的移动应用程序。

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

我正在尝试创建回声/延迟效果,我需要将字节数组转换为短数组,但我不知道如何在 Objective-C 中执行此操作。

谢谢。

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

- (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;
}

最佳答案

最后,我可以完成实现这四种方法的回声效果。我希望它们对您有用。

字节到短数组

- (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;
}

关于ios - 如何使用 Objective-C 将字节数组转换为短数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681545/

相关文章:

ios - 为什么不调用 deinit?

javascript - 在 Javascript 中,延迟函数是否按顺序执行?

objective-c - 关于 dictionaryWithContentsOfFile 的键值类型

ios - 当我“强制退出”时如何获得关闭事件?

iOS 7 后台获取 : Large Import Operation

objective-c - 如何在macOS objective-c 中播放本地文件?

iOS swift : EXC_BAD_ACCESS(code=EXC_i386_GPFLT ) regarding a singleton

objective-c - CFStringRef 适合常量吗?

java - 如何在 Java 中管理和编辑音频文件的元数据

html - 在网络上流式传输自适应音频(低延迟)