我有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和back。
更新
系统的字节顺序是LITTLE_ENDIAN我测试它是这样的:Endianness of Android NDK
如何将缓冲区中的每两个字节转换为短类型和返回的样本。请您提供任何代码示例。
更新
我试图访问短对象,这是我的固定代码,但它不起作用,我听不到任何声音:
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。
答案 0 :(得分:2)
将atoi()与变量的地址一起使用是完全错误和错误的。这是为了将值的ASCII表示转换为数字。在你的情况下,你没有真正的“字符”缓冲区,而是一个字节值的缓冲区,在C的历史记录下,它通常用 char 类型实现,而不是更新的和确定性的,例如 int8_t 。
要在字符缓冲区和短缓冲区之间进行转换,首先需要回答关键问题,如果字符缓冲区的编码是系统的本机字节顺序,或者与它相反。
如果它是本机字节顺序,那么在C语言中你所要做的就是将指针类型转换为short,并以字节对的形式访问数据。
但是,如果顺序相反,则必须访问这两个字节并按照与往常相反的顺序组合它们(shift + add)。可以使用宏来执行此操作,但手动操作具有使功能完全明显的优势。
答案 1 :(得分:1)
钠。你必须写
short sample = b1<<8|b2;
或者,根据你的endian情况,你必须交换b1和b2
答案 2 :(得分:1)
short *pshBuf = (short*)pCharBuf;
有效。我在我的现场项目中也使用相同的东西。