gpt4 book ai didi

c - 采样率转换函数中的段错误

转载 作者:行者123 更新时间:2023-11-30 15:32:23 27 4
gpt4 key购买 nike

使用 libmpg123 的 playmp3()

if (isPaused==0 && mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK)
{
char * resBuffer=&buffer[0]; //22100=0,5s
buffer = resample(resBuffer,22100,22100);
if((ao_play(dev, (char*)buffer, done)==0)){
return 1;
}

resample() 使用 ffmpeg 中的 avcodec

#define LENGTH_MS 500       // how many milliseconds of speech to store
#define RATE 44100 // the sampling rate (input)
#define FORMAT PA_SAMPLE_S16NE // sample size: 8 or 16 bits
#define CHANNELS 2 // 1 = mono 2 = stereo

struct AVResampleContext* audio_cntx = 0;

char * resample(char in_buffer[(LENGTH_MS*RATE*16*CHANNELS)/8000],int out_rate,int nsamples)
{
char out_buffer[ sizeof( in_buffer ) * 4];
audio_cntx = av_resample_init( out_rate, //out rate
RATE, //in rate
16, //filter length
10, //phase count
0, //linear FIR filter
1.0 ); //cutoff frequency
assert( audio_cntx && "Failed to create resampling context!");
int samples_consumed;
int samples_output = av_resample( audio_cntx, //resample context
(short*)out_buffer, //buffout
(short*)in_buffer, //buffin
&samples_consumed, //&consumed
nsamples, //nb_samples
sizeof(out_buffer)/2,//lenout
0);//is_last
assert( samples_output > 0 && "Error calling av_resample()!" );
av_resample_close( audio_cntx );
//*resample = malloc(sizeof(out_buffer));
return &out_buffer[0];
}

当我运行此代码时,我收到 3393 段错误(已创建核心转储)。为什么?

例如,指针的使用是否正确?22100 是歌曲 0.5 秒内包含的样本?

最佳答案

您有两个问题我可以立即看到。这些都是菜鸟问题,但每个人至少都会这样做一次,所以不用担心!

检查 sizeof( in_buffer ) 是否为您提供了您期望的缓冲区大小 ((LENGTH_MS*RATE*16*CHANNELS)/8000) 或指针的大小(这将是 2、4 或 8,具体取决于您的系统。)在堆栈上的数组上使用 sizeof 可以得到它的总大小,因为没有指针只有一个缓冲区。即使您在参数列表上使用 [],参数列表上的数组的 Sizeof 也会为您提供指针的大小,因为只有一个指针。

此外,返回基于堆栈的缓冲区是未定义的(即会崩溃),因为堆栈在下一个函数调用中被重用:

return &out_buffer[0]; 

不要那样做。传入调用者已经分配的输出缓冲区。

关于c - 采样率转换函数中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268467/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com