0

pAudioBuffer我有从函数 ffmpeg 获得的char缓冲区:

int len = avcodec_decode_audio3(av_codec_context,
            (int16_t *) pAudioBuffer, &out_size, &packet);

我知道音频格式是每个样本两个字节,我需要将每两个字节转换为短值,我尝试使用下面的代码片段,但我经常得到零而不是短值:

int shortBufIndex = 0;
for (int i = 0; i < (out_size); i += 2) {
    char b1 = pAudioBuffer[i];
    char b2 = pAudioBuffer[i + 1];
    short sample = atoi(&b1) + atoi(&b2);
    shortBuffer[shortBufIndex] = sample;
    shortBufIndex++;
    LOGI("BUFFER_ITEM='%d'", sample);
}

我做错了什么,如何将 char 缓冲区中的每两个字节转换为 short 和 back。

更新:

系统的字节顺序是 LITTLE_ENDIAN 我有这样的测试:Android NDK的字节序

如何将缓冲区中的每两个字节转换为短类型样本并返回。请您提供任何代码示例。

更新

我试图以成对的方式访问short,这是我的固定代码,但它不起作用,我听不到任何声音:

    int shortBufIndex = 0;
    for (int i = 0; i < (out_size); i += 2) {
        char * byte = (char *) pAudioBuffer[i];
        short * sample = byte;
        shortBuffer[shortBufIndex] = sample;
}

我做错了什么?我需要这样的转换:字节数组到短数组并在java中但在c中再次返回。

4

3 回答 3

2

将 atoi() 与变量地址一起使用是完全错误和不正确的。那是为了将值的 ASCII 表示形式转换为数字。在您的情况下,您实际上并没有一个“字符”缓冲区,而是一个字节值缓冲区,在 C 的历史中,它通常是用char类型实现的,而不是像int8_t这样更新和确定的东西。

要在字符缓冲区和短缓冲区之间进行转换,首先需要回答关键问题,字符缓冲区的编码是按照系统的本机字节序还是相反。

如果它是本地字节序,那么在诸如 C 之类的语言中,您所要做的就是将指针类型转换为 short 类型,并将数据作为字节对访问。

但是,如果它的顺序相反,您将不得不访问这两个字节并以与通常相反的顺序将它们组合(移位+添加)。可能有可以使用的宏来执行此操作,尽管手动操作具有使功能完全明显的优势。

于 2012-12-15T17:48:25.987 回答
1
short *pshBuf = (short*)pCharBuf;

有用。我也在我的现场项目中使用相同的。

于 2012-12-18T09:54:20.233 回答
1

呐。你必须写

short sample = b1<<8|b2;

或者,根据您的字节序情况,您必须交换 b1 和 b2

于 2012-12-15T17:48:18.407 回答