【发布时间】:2012-12-03 09:26:16
【问题描述】:
我有从函数 ffmpeg 获得的 char pAudioBuffer 缓冲区:
int len = avcodec_decode_audio3(av_codec_context,
(int16_t *) pAudioBuffer, &out_size, &packet);
我知道音频格式是每个样本两个字节,我需要将每两个字节转换为短值,我尝试使用下面的代码 sn-p,但我经常得到零而不是短值:
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 缓冲区中的每两个字节转换为短并返回。
更新:
系统的字节顺序是 LITTLE_ENDIAN 我有这样的测试:Endianness of 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;
}
我做错了什么? 我需要这样的转换:byte array to short array and back again in java 但在 c.
【问题讨论】:
-
为什么不直接将
shortBuffer而不是pAudiBuffer传递给ffmpeg API? -
@alk 我怎样才能做到这一点,是否只需将
pAudioBuffer替换为shortBuffer。 -
我尝试使用 shortBuffer 而不是 pAudioBuffer,但是当我将它传递给 AudioTrack 时,我听到了一些噪音,我无法使用这种方法。
-
这里可能存在字节序问题。如果 ffmpeg 和您的系统使用的字节序不同,您可以使用
ntohs()将shortBuffer的每个元素转换为avcodec_decode_audio3的调用填充后,如下所示:size_t size = out_size/2; for (size_t i = 0; i < size; ++i) shortBuffer[i] = ntohs(shortBuffer[i]); -
@alk 当我尝试使用
ntohs时,我只听到噪音,但是当我使用短而没有ntohs时,我有时会听到噪音(定期)。好像不行。
标签: c android-ndk ffmpeg short