gpt4 book ai didi

c - 如何将字符缓冲区(带有 pcm 音频数据)转换为短缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 06:36:49 26 4
gpt4 key购买 nike

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

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 并返回。

更新:

系统的字节顺序是 LITTLE_ENDIAN 我已经这样测试过:Endianness of Android NDK

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

更新

我尝试访问 short as pairs,这是我的固定代码,但它不起作用,我听不到任何声音:

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

我做错了什么?我需要这样的转换:byte array to short array and back again in java但在 c.

最佳答案

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

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

如果它是 native 字节序,那么在 C 语言等语言中,您只需将指针类型转换为 short,并以字节对的形式访问数据。

但是,如果它的顺序相反,您将不得不访问这两个字节并将它们以与通常相反的顺序组合(shift + add)。可能有执行此操作的宏可供您使用,尽管手动执行此操作的优势在于使功能完全显而易见。

关于c - 如何将字符缓冲区(带有 pcm 音频数据)转换为短缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13894582/

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