使用Android上的javacv ffmpeg解码来自red5服务器的AAC音频流

使用Android上的javacv ffmpeg解码来自red5服务器的AAC音频流,android,ffmpeg,red5,javacv,live-streaming,Android,Ffmpeg,Red5,Javacv,Live Streaming,我正在尝试播放来自Red5服务器的AAC音频直播流,所以为了解码音频数据,我使用Javacv ffmpeg。数据作为字节[]的数据包接收。 这是我试过的 public Frame decodeAudio(byte[] adata,long timestamp){ BytePointer audio_data = new BytePointer(adata); avcodec.AVCodec codec1 = avcodec.avcodec_find_decoder(avcodec

我正在尝试播放来自Red5服务器的AAC音频直播流,所以为了解码音频数据,我使用Javacv ffmpeg。数据作为字节[]的数据包接收。 这是我试过的

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);
}  
进一步的数据包类似于

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上下文音频_c还是设置解码器的数据包


谢谢你的帮助。提前感谢。

第一个数据包(配置)描述了流数据,如果我没有弄错的话,接下来的数据是编码音频。你不能假设抽样率等。。如上所述,您需要将其从标记为“AF 00”的配置数据中取出。

我也有类似的问题。我用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
我仍然不知道如何对这些数据进行全面解码

编辑: 哈我有一件事:) 我猜前2个字节是RTMP特定的字节。第二个似乎是这样的,无论是配置(0)还是实际有效负载(1)——我没有找到任何来源证实这一点,这只是我的假设。 第一个短包是此处描述的AAC配置说明:

就我而言,它是:

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

你会建议我从哪里考虑数据要被送到解码器,数据从开始AF 00…或者只忽略AF。我在这里看到了更好的acc数据分解,但我找不到。我将不得不指出这些文章来帮助你:过了很多天。。我发现丢弃数据包中的第一个AF00数据,并为音频上下文设置正确的通道数(在我的例子中为2)和通道布局和配置文件类型,使解码器工作正常。。。
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