【问题标题】:Decoding AAC audio stream coming from red5 server with javacv-ffmpeg on Android在 Android 上使用 javacv-ffmpeg 解码来自 red5 服务器的 AAC 音频流
【发布时间】:2014-03-25 13:36:45
【问题描述】:

我正在尝试播放来自 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 还是设置解码器的数据包。

任何帮助表示赞赏。提前致谢。

【问题讨论】:

    标签: android ffmpeg red5 javacv live-streaming


    【解决方案1】:

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

    【讨论】:

    • 你会建议我应该从哪里考虑将数据提供给解码器,从 AF 00 开始的数据......还是只忽略 AF..
    • 我在 SO 上看到了对 acc 数据的更好细分,但我找不到。我将不得不指出这些文章来帮助你:wiki.multimedia.cx/…wiki.multimedia.cx/index.php?title=MPEG-4_Audio
    • 经过很多天......我发现丢弃数据包中的第一个 AF 00 数据,并设置正确的频道数(在我的情况下为 2)和频道布局和音频上下文的配置文件类型使解码器工作正常......
    【解决方案2】:

    我也有类似的问题。我已经用 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 配置描述: 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 2021-12-17
      • 1970-01-01
      • 2017-10-30
      • 2017-07-21
      • 2012-01-20
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多