我正在尝试播放来自Red5服务器的AAC音频直播流,所以要解码我正在使用Javacv-ffmpeg的音频数据。数据以 byte [] 的包接收 这是我试过的
public Frame decodeAudio(byte[] adata,long timestamp){
BytePointer audio_data = new BytePointer(adata);
avcodec.AVCodec codec1 = avcodec.avcodec_find_decoder(avcodec.AV_CODEC_ID_AAC);// For AAC
if (codec1 == null) {
Log.d("showit","avcodec_find_decoder() error: Unsupported audio format or codec not found: " + audio_c.codec_id() + ".");
}
audio_c = null;
audio_c = avcodec.avcodec_alloc_context3(codec1);
audio_c.sample_rate(44100);
audio_c.sample_fmt(3);
audio_c.bits_per_raw_sample(16);
audio_c.channels(1);
if ((ret = avcodec.avcodec_open2( audio_c, codec1, (PointerPointer)null)) < 0) {
Log.d("showit","avcodec_open2() error " + ret + ": Could not open audio codec.");
}
if (( samples_frame = avcodec.avcodec_alloc_frame()) == null)
Log.d("showit","avcodec_alloc_frame() error: Could not allocate audio frame.");
avcodec.av_init_packet(pkt2);
samples_frame = avcodec.avcodec_alloc_frame();
avcodec.av_init_packet(pkt2);
pkt2.data(audio_data);
pkt2.size(audio_data.capacity());
pkt2.pts(timestamp);
pkt2.pos(0);
int len = avcodec.avcodec_decode_audio4( audio_c, samples_frame, got_frame, pkt2);
}
但解码后的len为第一帧返回-1,然后始终为-22 第一个包总是这样
AF 00 12 08 56 E5 00
其他数据包就像
AF 01 01 1E 34 2C F0 A4 71 19 06 00 00 95 12 AE AA 82 5A 38 F3 E6 C2 46 DD CB 2B 09 D1 00 78 1D B7 99 F8 AB 41 6A C4 F4 D2 40 51 17 F5 28 51 9E 4C F6 8F 15 39 49 42 54 78 63 D5 29 74 1B 4C 34 9B 85 20 8E 2C 0E 0C 19 D2 E9 40 6E 9C 85 70 C2 74 44 E4 84 9B 3C B9 8A 83 EC 66 9D 40 1B 42 88 E2 F3 65 CF 6D B3 20 88 31 29 94 29 A4 B4 DE 26 B0 75 93 3A 0C 57 12 8A E3 F4 B9 F9 23 9C 69 C9 D4 BF 9E 26 63 F2 78 D6 FD 36 B9 32 62 01 91 19 71 30 2D 54 24 62 A1 20 1E BA 3D 21 AC F3 80 33 3A 1A 6C 30 3C 44 29 F2 A7 DC 9A FF 0F 99 F2 38 85 AB 41 FD C7 C5 40 5C 3F EE 38 70
无论是设置AVcodec上下文audio_c还是设置解码器数据包,都无法找出问题所在。
任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:0)
第一个数据包(config)描述了流数据,如果我没有弄错后续数据是编码音频。您不能假设采样率等。如上所述,您需要将其从标记为&#34; AF 00&#34;的配置数据中拉出来。
答案 1 :(得分:0)
我有类似的问题。我用Wireshark拦截了数据包,这就是它告诉我的内容: AF是AAC帧的控制字节,它解码为以下位:
1010 .... = Format: HE-AAC
.... 11.. = Sample rate: 44kHz (allthough FFMPEG shows me 48kHz and I would lean to believe it more)
.... ..1. = Sample size: 16 bit
.... ...1 = Channels: stereo
我仍然无法弄清楚如何对这些数据进行普遍解码。
编辑: 哈!我有东西:) 我猜前两个字节是特定于RTMP的字节。第二个似乎说明,无论是配置(0)还是实际有效载荷(1) - 我发现没有消息来源证实这一点,这只是我的假设。 然后第一个短包是这里描述的AAC配置描述: http://thompsonng.blogspot.com/2010/03/aac-configuration.html
就我而言:
11 90
是二进制:
0001 0001 1001 0000
并解码为:
0001 0... .... .... = 2 = AAC LC
.... .001 1... .... = 3 = 48 kHz
.... .... .001 0... = 2 = 2 channels (stereo)
.... .... .... .0.. = 0 = 1024 sample length
.... .... .... ..0. = 0 = doesn't depends on core code (?)
.... .... .... ...0 = 0 = extension flag