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

标签 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.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 还是在为解码器设置数据包。

感谢任何帮助。提前致谢。

最佳答案

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

关于android - 在 Android 上使用 javacv-ffmpeg 解码来自 red5 服务器的 AAC 音频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22636271/

相关文章:

android - Flutter 更改所选选项卡的背景

Android Webview 处理方向不工作

ffmpeg - 是否可以通过 FFMpeg 制作启用 DRM 的视频?

java - Android 通知无法访问接收到的字符串

android - 在视频中添加叠加层导出为 android 中的视频

ffmpeg - 使用 FFMPEG 读取元数据

java - Java 中的 ScreenVideo 编码器

video - 如何在Red5 IServerStream中添加直播源?

java - Red5 最新 svn : configuring tomcat as Java EE-Container

java - 通过java发送推送通知GCM