C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了内存问题连续录制音频大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在这里,我正在为一个连续录音音频系统编写一些代码.然后,当某个幅度阈值被破坏时,我尝试将音频录制一段时间.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <String.h>
#include <time.h>
#include <portaudio.h>
#include <sndfile.h>

#define FRAMES_PER_BUFFER (1024)
#define SAMPLE_SIZE (4)

typedef struct
{
    uint16_t formatType;
    uint16_t numberOfChAnnels;
    uint32_t sampleRate;
    float* recordedSamples;
} AudioData;

AudioData initAudioData(uint32_t sampleRate,uint16_t chAnnels,int typE)
{
    AudioData data;
    data.formatType = type;
    data.numberOfChAnnels = chAnnels;
    data.sampleRate = sampleRate;
    return data;
}

float avg(float *data)
{
    int elems = sizeof(data) / sizeof(data[0]);
    float sum = 0;
    for (int i = 0; i < elems; i++)
    {
        sum += fabs(*(data + i));
    }
    return (float) sum / elems;
}

int main(void)
{
    AudioData data = initAudioData(44100,2,paFloat32);
    PaStream *stream = NULL;
    PaError err = paNoError;
    int size = FRAMES_PER_BUFFER * data.numberOfChAnnels * SAMPLE_SIZE;
    float *sampleBlock = malloc(sizE);
    float *recordedSamples = NULL;
    time_t talking = 0;
    time_t silence = 0;

    if((err = Pa_Initialize())) goto done;
    PaStreamParameters inputParameters =
    {
        .device = Pa_GetDefaulTinputDevice(),.chAnnelCount = data.numberOfChAnnels,.sampleFormat = data.formatType,.suggestedLatency = Pa_GetDeviceInfo(Pa_GetDefaulTinputDevice())->defaultHighInputLatency,.hostApiSpecificStreamInfo = NULL
    };
    if((err = Pa_OpenStream(&stream,&inputParameters,NULL,data.sampleRate,FRAMES_PER_BUFFER,paClipOff,NULL))) goto done;
    if((err = Pa_StartStream(stream))) goto done;
    for(int i = 0;;)
    {
        err = Pa_ReadStream(stream,sampleBlock,FRAMES_PER_BUFFER);
        if(avg(sampleBlock) > 0.000550) // talking
        {
            printf("You're talking! %d\n",i);
            i++;
            time(&talking);
            recordedSamples = realloc(recordedSamples,size * i);
            if (recordedSamples) memcpy(recordedSamples + ((i - 1) * sizE),sizE); // problem here wriTing to memory at i = 16?
            else free(recordedSamples);
        }
        else //silence
        {
            double test = difftime(time(&silencE),talking);
            printf("Time diff: %g\n",test);
            if (test >= 1.5)
            {
                // TODO: finish code processing audio snippet
                talking = 0;
                free(recordedSamples); // problem freeing memory?
            }
        }
    }

done:
    free(sampleBlock);
    Pa_Terminate();
    return err;
}

然而,代码有点精彩.有时,当我在xcode中运行我的程序时,我得到以下输出

使用Xcode指向这一行是问题:

其他时候我运行代码,我得到这个错误

这两个错误有点令我困惑…任何建议?

解决方法

你正在写出分配的缓冲区的边界:
recordedSamples = realloc(recordedSamples,size * i);
memcpy(recordedSamples + ((i - 1) * sizE),sizE);

realloc()分配一定数量的字节,这里size * i.生成的指针存储在具有float *类型的recordsSamples中.

@H_313_4@memcpy()然后尝试将数据写入到记录样本((i – 1)* sizE)中,指针算术用于确定应写入的位置,由于recordsSamples的类型为float *,所以记录的样本X指向X的偏移量浮点值(不是X字节).

换句话说,recordingSamples((i – 1)* size指向recordSamples之后的内存位置((i – 1)* size * sizeof(float)),通常不在分配的缓冲区内,因为浮点大于单字节.

解决这个问题,最大的问题是如果大小应该是多个字节或一些浮点数.这取决于您使用的API函数,我没有详细研究.

如果它是一些浮点数,那么您必须调整对malloc,realloc和memcpy等基本内存管理功能调用,因为这些操作都是以字节为单位的.要取代malloc(sizE),你可以@L_301_27@malloc(size * sizeof(float)).

如果大小确实是多个字节,那么将recordSamples作为char *,或者至少在使用字节偏移量进行指针运算(如memcpy((char *)recordsSamples …)之前将其转换为更合理的方式).

大佬总结

以上是大佬教程为你收集整理的内存问题连续录制音频全部内容,希望文章能够帮你解决内存问题连续录制音频所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。