利用ffmpeg库实现音频AAC编解码

        AAC‌(Advanced Audio Coding)是一种音频编码技术,出现于1997年,基于MPEG-2的音频编码技术。AAC具有高效的数据压缩能力和较高的音质,适用于各种音频应用场景。例如,在智能设备中,AAC技术被广泛应用于提升用户体验,提供高质量的音频体验。

一、FFmpeg 支持的 AAC 编码器对比
编码器特性适用场景
aacFFmpeg 原生实现,2015年后稳定支持‌,支持 LC-AAC 规格,兼容性高但音质略逊于第三方编码器‌基础音频编码、兼容性优先场景
libfdk_aac第三方编码器(需启用 --enable-nonfree 编译‌3),支持 HE-AAC v1/v2,音质最优‌高音质需求(如音乐流媒体)
libaac第三方编码器,非 GPL 协议‌,性能与兼容性介于原生与 libfdk_aac 之间商业项目(需规避 GPL 限制)
二、关键参数与封装格式
  1. AAC 封装格式

    • ADTS (Audio Data Transport Stream)‌:适用于流媒体传输(如直播),每帧含独立头部信息,支持随机解码‌。
    • ADIF (Audio Data Interchange Format)‌:需完整文件头,适合本地存储(如 .m4a 文件)‌。
  2. 核心参数设置

    • 比特率控制‌:
      • 恒定比特率(CBR):-b:a 128k(立体声推荐值)‌。
      • 动态比特率(VBR):-vbr 4(libfdk_aac 支持,数值范围 1-5,越高音质越好)‌。
    • 采样率与格式‌:
      • FFmpeg 新版本默认支持 32 位浮点型(AV_SAMPLE_FMT_FLTP),需确保输入 PCM 格式匹配‌。
    • HE-AAC 模式‌:
      • 启用 HE-AAC v1:-profile:a aac_he;HE-AAC v2:-profile:a aac_he_v2(需 libfdk_aac)‌。
三、命令行示例
  1. 基础转码(原生 AAC 编码器)

    ffmpeg -i input.wav -c:a aac -b:a 128k output.m4a  # 输出为 M4A 格式‌
  2. 高音质转码(libfdk_aac)

    ffmpeg -i input.mp4 -c:v copy -c:a libfdk_aac -profile:a aac_he -b:a 64k output.mp4  # HE-AAC v1 低码率高音质‌
    
  3. 流媒体场景(ADTS 封装)

    ffmpeg -i input.pcm -c:a aac -f adts output.aac  # 生成 ADTS 格式音频流‌
四、代码编解码示例 
4.1、 ‌AAC编码示例(PCM → AAC)
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>int encode_pcm_to_aac(const char* input_pcm, const char* output_aac) {const AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_AAC); // 查找编码器‌:ml-citation{ref="2" data="citationList"}AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);// 参数配置(48kHz双通道,s16格式)codec_ctx->bit_rate = 128000;codec_ctx->sample_fmt = AV_SAMPLE_FMT_S16; // 输入格式需为s16le‌:ml-citation{ref="6" data="citationList"}codec_ctx->sample_rate = 48000;codec_ctx->channel_layout = AV_CH_LAYOUT_STEREO;codec_ctx->channels = 2;// 设置编码器属性(兼容Android等平台)av_opt_set(codec_ctx->priv_data, "profile", "aac_low", 0); // LC规格‌:ml-citation{ref="6" data="citationList"}if (avcodec_open2(codec_ctx, codec, NULL) < 0) { // 打开编码器‌:ml-citation{ref="5" data="citationList"}fprintf(stderr, "编码器初始化失败\n");return -1;}AVFrame *frame = av_frame_alloc();frame->nb_samples = codec_ctx->frame_size; // 典型值1024‌:ml-citation{ref="6" data="citationList"}frame->format = codec_ctx->sample_fmt;frame->channel_layout = codec_ctx->channel_layout;av_frame_get_buffer(frame, 0);AVPacket *pkt = av_packet_alloc();FILE *aac_out = fopen(output_aac, "wb");// 编码循环(逐帧处理PCM)while (fread(frame->data, 1, frame->nb_samples * 4, pcm_in) > 0) { // s16双通道每帧4字节/样本‌:ml-citation{ref="1" data="citationList"}avcodec_send_frame(codec_ctx, frame);while (avcodec_receive_packet(codec_ctx, pkt) >= 0) {fwrite(pkt->data, 1, pkt->size, aac_out); // 写入AAC裸流‌:ml-citation{ref="5" data="citationList"}av_packet_unref(pkt);}}// 资源清理...
}
 4.2、 ‌AAC解码示例(AAC → PCM)
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>int decode_aac_to_pcm(const char* input_aac, const char* output_pcm) {const AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_AAC); // 查找解码器‌:ml-citation{ref="8" data="citationList"}AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);if (avcodec_open2(codec_ctx, codec, NULL) < 0) { // 初始化解码器‌:ml-citation{ref="4" data="citationList"}fprintf(stderr, "解码器打开失败\n");return -1;}AVPacket packet;AVFrame *frame = av_frame_alloc();FILE *pcm_out = fopen(output_pcm, "wb");// 解码循环(处理AAC裸流)while (read_aac_data(&packet)) { // 需自行实现数据读取‌:ml-citation{ref="7" data="citationList"}avcodec_send_packet(codec_ctx, &packet);while (avcodec_receive_frame(codec_ctx, frame) >= 0) {fwrite(frame->data, 1, frame->nb_samples * 4, pcm_out); // 输出s16le格式‌:ml-citation{ref="4" data="citationList"}}av_packet_unref(&packet);}// 资源清理...
}
4.3、关键参数配置
参数/函数作用示例值/说明
av_opt_set设置编码器私有参数(如规格、码率模式)av_opt_set(ctx, "profile", "aac_he")(HE-AAC)‌
frame->nb_samples每帧采样数1024(对应48kHz时21.3ms帧长)‌
codec_ctx->bit_rate目标码率64000、128000、192000‌
avcodec_send_frame向编码器提交原始数据需保证帧大小与nb_samples一致‌
4.4、开发注意事项
  1. 输入格式要求

    • PCM需为‌s16le格式‌,采样率支持8k/16k/44.1k/48k等标准值‌
    • 若输入格式不匹配(如f32le),需通过libswresample重采样‌
  2. 编译依赖
    使用 libfdk_aac 需通过 --enable-libfdk-aac 和 --enable-nonfree 参数编译 FFmpeg‌
  3. 延迟优化
    实时流场景可添加 -tune zerolatency 参数减少编码延迟‌。
  4. 多平台兼容性

    • Android NDK需使用libfdk_aac替代默认编码器(需编译时启用--enable-libfdk-aac)‌
    • iOS/macOS需处理音频会话中断(如来电时的解码器重置)‌
  5. 性能优化

    • 启用多线程编码:codec_ctx->thread_count = 4
    • 实时流场景建议使用AV_CODEC_CAP_DELAY检测编码延迟‌
4.5、编译与调试 
# 编译命令(需链接FFmpeg库)
gcc aac_demo.c -o aac_demo -lavcodec -lavutil -lswresample# 验证编码结果(播放PCM)
ffplay -f s16le -ar 48000 -ac 2 output.pcm‌# 检查AAC文件信息
ffprobe output.aac‌

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37285.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aws训练快速入门教程

AWS 相关核心概念 简洁地介绍一下AWS训练云服务的核心关联概念: AWS核心服务层: 基础设施层: EC2(计算), S3(存储), RDS(数据库)等人工智能层: SageMaker(训练平台), AI服务等 机器学习服务分级: 高层: 预构建AI服务(开箱即用)中层: SageMaker(主要训练平台)底层: 框架和基…

(一)飞行器的姿态欧拉角, 欧拉旋转, 完全数学推导(基于坐标基的变换矩阵).(偏航角,俯仰角,横滚角)

(这篇写的全是基矢变换矩阵)不是坐标变换矩阵,坐标变换矩阵的话转置一下,之后会有推导. 是通过M转置变换到P撇点.

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

在 Windows 系统下,将 FFmpeg 编译为 .so 文件

1. 准备环境 确保你的 Windows 系统已安装以下工具&#xff1a; Android Studio NDK&#xff08;Native Development Kit&#xff09; MSYS2&#xff08;用于提供类 Unix 环境&#xff09; FFmpeg 源码 Git Bash&#xff08;可选&#xff0c;推荐使用&#xff09; 安装 …

蓝桥杯备考---》分类讨论之Fixed Points

这道题的意思啊&#xff0c;就是说我们在数组里输入n个数&#xff0c;我们尽可能让下标和数组的值相同&#xff0c;我们只能交换一次&#xff0c;最多能有多少个值和下标一样 这里我们需要分类讨论&#xff0c;如果每个下标的值都符合要求&#xff0c;我们就不交换了 如果不是…

什么是数学建模?数学建模是将实际问题转化为数学问题

数学建模是将实际问题转化为数学问题&#xff0c;并通过数学工具进行分析、求解和验证的过程。 一、数学建模的基本流程 问题分析 • 明确目标&#xff1a;确定需要解决的核心问题。 • 简化现实&#xff1a;识别关键变量、忽略次要因素。 • 定义输入和输出&#xff1a;明确模…

Microchip AN1477中关于LLC数字补偿器的疑问

最近在学习Microchip的AN1477关于LLC的功率级传递函数推导及数字补偿器设计&#xff0c;对其中的2P2Z数字补偿器的系数有一些困惑。我在MATLAB中运行了源程序提供的VMC_LLC.m文件&#xff0c;发现有些地方和AN1477中的结果不一致。现在把相关有疑问的地方列举出来&#xff0c;也…

【软考-架构】8.4、信息化战略规划-CRO-SCM-应用集成-电子商务

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 信息化战略体系&#x1f4af;考试真题第一题第二题 信息系统战略规划&#x1f4af;考试真题第一题第二题 ✨客户关系管理CRM供应链管理SCM&#x1f4af;考试真题第一题第二…

Excel处理控件Spire.XLS系列教程:C# 在 Excel 中添加或删除单元格边框

单元格边框是指在单元格或单元格区域周围添加的线条。它们可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引读者注意重要的单元格或使工作表看起来更美观。本文将介绍如何使用 Spire.XLS for .NET 在 C# 中添加或删除 Excel 单元格边框。 安装 Spire.XLS for .NET E-…

【工具分享】vscode+deepseek的接入与使用

目录 第一章 前言 第二章 获取Deepseek APIKEY 2.1 登录与充值 2.2 创建API key 第三章 vscode接入deepseek并使用 3.1 vscode接入deepseek 3.2 vscode使用deepseek 第一章 前言 deepseek刚出来时有一段时间余额无法充值&#xff0c;导致小编没法给大家发完整的流程&…

Android之悬浮窗实现

文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限以及service注册2.service代码3.activity实现 总结 前言 经常接触音视频以及直播的同学应该知道&#xff0c;悬浮窗是必备需求&#xff0c;今天就记录一下自己悬浮窗的视线过程&#xff0c;流程就是点击缩小按钮回到…

25.单例模式实现线程池

一、线程池的概念 1.1 线程池的介绍 线程池是一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅…

基于springboot的免税商品优选购物商城(020)

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;免税商品优选购物商城当然也不能排除在外&#xff0c;随着购物商城的不断成熟&#xff0c;它彻底改变了过去传统的免税商品优选购物商城方式&…

RIP路由欺骗攻击与防御实验详解

一、基础网络配置 1. 路由器R1配置 interface GigabitEthernet0/0/0ip address 192.1.2.254 255.255.255.0 ! interface GigabitEthernet0/0/1ip address 192.1.3.254 255.255.255.0 ! router rip 1version 2network 192.1.2.0network 192.1.3.0 2. 路由器R2配置 interface…

整理和总结微信小程序的高频知识点

前言 近期萌生了一些想法&#xff0c;感觉可以做一个小程序作为产出。 但小程序做得比较少&#xff0c;因此边做边复习。整理和总结了一些高频知识点和大家一起分享。 一、模板和组件 1.1模板&#xff08;Template&#xff09; 优势 简单灵活&#xff1a;模板定义和使用都较…

如何检查CMS建站系统的插件是否安全?

检查好CMS建站系统的插件安全是确保网站安全的重要环节&#xff0c;对于常见的安全检查&#xff0c;大家可以利用以下几种有效的方法和工具&#xff0c;来帮你评估插件的安全性。 1. 检查插件来源和开发者信誉 选择可信来源&#xff1a;仅从官方插件库或可信的第三方开发者处…

RAG优化:利用python实现上下文感知(扩展)增强检索效果

检索增强生成(RAG)通过从外部知识源检索相关信息来增强AI的响应能力。传统的检索方法通常返回孤立的文本片段,这可能导致回答不完整。 为了解决这个问题,我们引入了基于上下文的检索方法,确保检索到的信息包含相邻的文本片段,以提高回答的连贯性。 通过结合重叠分块、上…

在 macOS Sequoia 15.2 中启用「三指拖动」并实现快速复制的完整指南 ✨

在 macOS Sequoia 15.2 中启用「三指拖动」并实现快速复制的完整指南 &#x1f34e;✨ 适用系统&#xff1a;macOS Sequoia 版本15.2 及以上 一、功能简介 &#x1f31f; 通过「三指拖动」手势&#xff0c;你可以轻松完成以下操作&#xff1a; • 移动文件/文本&#xff1a;直…

LeetCode 2614.对角线上的质数:遍历(质数判断)

【LetMeFly】2614.对角线上的质数&#xff1a;遍历(质数判断) 力扣题目链接&#xff1a;https://leetcode.cn/problems/prime-in-diagonal/ 给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数&…

基于Java(Springboot+Gradle+Mybatis+templeaf 框架)+Mysql构建的(Web)校园二手平台系统

二手市场 1 系统分析 1.1 需求分析 项目背景 国内最大的二手服务商“易趣、淘宝”其注册用户有 61% 为在校大学生&#xff0c;其他占 25% 为社会人士注册&#xff0c;他们每年与学生的交易量占总交易量的 85% 以上. “易淘”均不向交易双方任何用户提供商品质保和售后服务…