热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在AAC原始流中添加ADTS头并进行解码播放

本文介绍了如何在AAC原始流中添加ADTS头以便通过FFmpeg进行软解码或系统硬解码。我们将详细解释ADTS头的结构,并提供一个示例代码来演示如何动态生成ADTS头。

AAC原始流可以通过FFmpeg进行软解码或系统硬解码。为了简化处理,可以在流的前面添加ADTS头。ADTS头由7个字节组成,下面是生成ADTS头的示例代码,每次传递数据都以一个样本为单位:

uint8_t adts_header[7] = {0xff, 0xf9, 0x00, 0x00, 0x00, 0x1f, 0xfc};

// 设置AAC级别
switch (aac_level) {
    case AUDIO_AACM:
        adts_header[2] |= (0x00 <<6) & 0xc0;
        break;
    case AUDIO_AACL:
        adts_header[2] |= (0x01 <<6) & 0xc0;
        break;
    case AUDIO_AACS:
        adts_header[2] |= (0x02 <<6) & 0xc0;
        break;
    default: // 默认使用AACL
        adts_header[2] |= (0x01 <<6) & 0xc0;
        break;
}

// 设置采样率
switch (aac_sample_rate) {
    case SAMPLING_RATE_96000:
        adts_header[2] |= (0x00 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_88200:
        adts_header[2] |= (0x01 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_64000:
        adts_header[2] |= (0x02 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_48000:
        adts_header[2] |= (0x03 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_44100:
        adts_header[2] |= (0x04 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_32000:
        adts_header[2] |= (0x05 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_24000:
        adts_header[2] |= (0x06 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_22050:
        adts_header[2] |= (0x07 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_16000:
        adts_header[2] |= (0x08 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_12000:
        adts_header[2] |= (0x09 <<2) & 0x3c;
        break;
    case SAMPLING_RATE_11025:
        adts_header[2] |= (0x0a <<2) & 0x3c;
        break;
    case SAMPLING_RATE_8000:
        adts_header[2] |= (0x0b <<2) & 0x3c;
        break;
    default: // 默认使用44100Hz
        adts_header[2] |= (0x04 <<2) & 0x3c;
        break;
}

// 设置声道数
switch (aac_channel_count) {
    case 1:
        adts_header[2] |= (0x01 >> 2) & 0x01;
        adts_header[3] |= (0x01 <<6) & 0xc0;
        break;
    case 2:
        adts_header[2] |= (0x02 >> 2) & 0x01;
        adts_header[3] |= (0x02 <<6) & 0xc0;
        break;
    case 3:
        adts_header[2] |= (0x03 >> 2) & 0x01;
        adts_header[3] |= (0x03 <<6) & 0xc0;
        break;
    case 4:
        adts_header[2] |= (0x04 >> 2) & 0x01;
        adts_header[3] |= (0x04 <<6) & 0xc0;
        break;
    case 5:
        adts_header[2] |= (0x05 >> 2) & 0x01;
        adts_header[3] |= (0x05 <<6) & 0xc0;
        break;
    case 6:
        adts_header[2] |= (0x06 >> 2) & 0x01;
        adts_header[3] |= (0x06 <<6) & 0xc0;
        break;
    case 8:
        adts_header[2] |= (0x07 >> 2) & 0x01;
        adts_header[3] |= (0x07 <<6) & 0xc0;
        break;
    default: // 默认使用2个声道
        adts_header[2] |= (0x02 >> 2) & 0x01;
        adts_header[3] |= (0x02 <<6) & 0xc0;
        break;
}

// 设置帧长度
adts_header[3] |= (aac_frame_length >> 11) & 0x03;
adts_header[4] = (aac_frame_length >> 3) & 0xff;
adts_header[5] |= ((aac_frame_length & 0x07) <<5);

通过上述代码,您可以根据实际的AAC流参数动态生成ADTS头,从而实现对AAC原始流的解码和播放。


推荐阅读
  • 本文介绍了一个项目中如何在Windows平台上实现多声道音频数据的采集,特别是针对DANTE音频接口的8路立体声音频通道。文章详细描述了使用Windows底层音频API进行音频采集的方法,并提供了一个具体的实现示例。 ... [详细]
  • 本文详细介绍了如何在 Java 中使用 com.badlogic.gdx.utils.JsonValue.iterator() 方法来遍历和解析 JSON 数据,并提供了多个实际应用中的代码示例。 ... [详细]
  • 本文详细介绍了Java编程中的基本运算符,包括算术、赋值、关系和逻辑运算符,并深入探讨了三元运算符的使用。此外,还讲解了如何使用Scanner类进行用户输入处理以及if和switch语句等流程控制结构。 ... [详细]
  • 本文介绍了如何通过ARM编译器组件重定向标准C运行时库的I/O函数,以适应不同的硬件平台。原文链接:https://www.keil.com/pack/doc/compiler/RetargetIO/html/retarget_overview.html ... [详细]
  • 本文深入探讨了JavaScript中循环结构的使用方法,特别是While循环,用于重复执行一段代码直到特定条件不再满足。同时,文章还介绍了Switch语句在多条件分支选择中的应用。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 大数据基础:JavaSE_day06 ... [详细]
  • Spring Security核心概念与应用实践
    本文详细介绍了Spring Security的核心机制,包括其作为一系列过滤器的工作原理,如何实现用户认证与授权,以及常见的配置方法和高级特性如CSRF防护。 ... [详细]
  • 本文介绍如何在Android中利用Handler和Bundle来发送包含多个参数的消息,并详细说明了消息的构建与处理方法。 ... [详细]
  • Java Servlet中获取客户端IP与MAC地址的方法
    本文介绍了一种在Java Servlet应用中获取客户端IP地址及MAC地址的技术实现方法,通过示例代码详细解析了获取过程中的关键步骤和技术点。 ... [详细]
  • 在DELL Inspiron 14R上部署CentOS X64 6.4的详细步骤
    本文详细记录了在DELL Inspiron 14R笔记本电脑上安装CentOS X64 6.4操作系统的过程,包括遇到的问题及解决方法。 ... [详细]
  • 本文提供了一个详细的PHP用户认证和管理的代码示例,包括用户登录验证、数据库连接、错误处理等关键部分的实现。 ... [详细]
  • 本文由「Vue虚拟实验室」的成员effort撰写,深入探讨了Vue CLI 3.0创建项目后的配置细节,特别是如何通过配置代理解决开发环境中的跨域问题。 ... [详细]
  • 本文详细介绍了如何使用Python通过GET和POST方法发送HTTP请求,并接收HTTP响应的具体实现方法。包括示例代码和相关模块的功能说明。 ... [详细]
  • 本文详细介绍如何结合Django框架和DRF(Django REST Framework)来设计一套有效的全局异常处理系统。这套系统不仅能够妥善处理DRF引发的异常,还能兼容Django自带的admin界面异常处理逻辑。 ... [详细]
author-avatar
星宿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有