FFmpeg--AAC音频解码流程

文章目录

      • AAC 组成
      • 函数分析
        • 读aac帧
        • 写aac帧
        • aac的head参数设置
      • 运行结果

AAC 组成

AAC音频格式:是⼀种由MPEG-4标准定义的有损⾳频压缩格式
ADTS:是AAC音频的传输流格式
AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成
每⼀帧的ADTS的头⽂件都包含了⾳频的采样率,声道,帧⻓度等信息等,⼀般情况下ADTS的头信息都是7个字节,分为2部分:
adts_fixed_header(); // 固定头信息
adts_variable_header(); // 可变头信息
在这里插入图片描述
adts_fixed_header():
syncword :同步头 总是0xFFF, all bits must be 1,代表着⼀个ADTS帧的开始
Layer:always: ‘00’ 总是一字节的0
protection_absent:表示是否误码校验。
profile:表示使⽤哪个级别的AAC
adts_variable_header():
在这里插入图片描述
frame_length : ⼀个ADTS帧的⻓度包括ADTS头和AAC原始流
size(head) + size(AACFrame)
adts_buffer_fullness:0x7FF 说明是码率可变的码流
说number_of_raw_data_blocks_in_frame : 值为 0, 表示说ADTS帧中有⼀个AAC数据块

函数分析

读aac帧

函数: int av_read_frame(AVFormatContext *s, AVPacket *pkt);
先定义AVPacket pkt对象,初始化,在while循环中读取数据帧

 	AVPacket pkt;
 // 初始化packet
    av_init_packet(&pkt);
	while (av_read_frame(ifmt_ctx, &pkt) >=0 ) {
	//...
}
写aac帧

c标准库fopen创建文件aac文件,通过fwrite写文件,因为av_read_frame读取内容不包含head,所以需要先写adts head,再写adts data ,为完整一帧aac数据。

	FILE *aac_fd = NULL;
	aac_fd = fopen(aac_filename, "wb");
	while(av_read_frame(ifmt_ctx, &pkt) >=0) {
		char adts_header_buf[7] = {0};
		fwrite(adts_header_buf, 1, 7, aac_fd);  
		fwrite( pkt.data, 1, pkt.size, aac_fd); 
		// ... 
	} 
	       
aac的head参数设置

根据ADTS的head表设置变量值,如设置syncword变量值
如,syncword 值为 0xFFF, 需要2个字节的空间, 一个指针为4个字节,字节排序为大端序(数据的地位字节放到内存的高位地址)

char * const p_adts_header;
	// syncword :同步头 总是0xFFF
	p_adts_header[0] = 0xff; 
	//syncword:0xfff     高8bits
	p_adts_header[1] = 0xf0;
	 //syncword:0xfff     低4bits

运行结果

输出aac音频文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArmSoM Rockchip系列产品 通用教程 之 GPIO 使用

1. GPIO简介​ GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种在计算机和嵌入式系统中常见的数字输入输出接口。它允许软件控制硬件的数字输入和输出,例如开关、传感器、LED灯等。GPIO通常由一个芯片或…

C++矢量运算与java矢量运算

矢量运算 概述: 矢量运算是一种基于向量的数学运算,它遵循特定的法则。以下是矢量运算的一些基本原理: 矢量加法:可以使用平行四边形法则或三角形法则来执行。当两个矢量相加时,可以将它们的起点放在同一个点上&…

【硬件设计】(更新中)以 UCC27710 为例设计栅极驱动器元件选型(资料摘抄)

还没更新完。。。。。。。 【仅作自学记录,不出于任何商业目的。如有侵权,请联系删除,谢谢!】 本文摘抄翻译自: Bootstrap Network Analysis: Focusing on the Integrated Bootstrap Functionality (infineon.com)Boo…

[nlp入门论文精读] | Transformer

写在前面 最近工作从CV转向了NLP,于是空余时间便跟着哔哩哔哩李沐老师的视频学习。其实研一NLP课程讲论文的时候,我们小组就选择了经典的Attention和Bert,但还有很多细节并不完全理解,实际使用时也很困惑。 因此这个系列就来记…

【Android 内存优化】KOOM 快手开源框架线上内存监控方案-源码剖析

文章目录 前言OOMMonitorInitTask.INSTANCE.initOOMMonitor.INSTANCE.startLoopsuper.startLoopcall() LoopState.Terminate dumpAndAnalysisdumpstartAnalysisService回到startLoop方法总结 前言 这篇文章主要剖析KOOM的Java层源码设计逻辑。 使用篇请看上一篇: 【Android …

Kubesphere前端项目分析

1 KubeSphere console功能导图 模块: 命令行工具 (kubectl) 日志(Logging) 平台设置(Platform Settings) 服务组件(Service Components) 监控和警报(Monitoring & Alerting&…

手写分布式配置中心(六)整合springboot(自动刷新)

对于springboot配置自动刷新,原理也很简单,就是在启动过程中用一个BeanPostProcessor去收集需要自动刷新的字段,然后在springboot启动后开启轮询任务即可。 不过需要对之前的代码再次做修改,因为springboot的配置注入value("…

pytest教程-15-多个fixture以及重命名

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了fixture的yield关键字,本小节我们讲解一下使用多个fixture的方法。 使用多个fixture 如果用例需要用到多个fixture的返回数据,fixture也可以return一个元组、list或字…

[嵌入式系统-37]:龙芯1B 开发学习套件 -7-MIPS指令集

目录 一、MIPS指令分类 二、常用指令详解 三、常用MIPS指令集及格式: 四、CPU内部的32个寄存器: 一、MIPS指令分类 MIPS(Microprocessor without Interlocked Pipeline Stages)指令集是一种广泛用于教学和嵌入式系统的指令集…

在线部署ubuntu20.04服务器,安装jdk、mysql、redis、nginx、minio、开机自启微服务jar包

一、服务器 1、查看服务器版本 查看服务器版本为20.04 lsb_release -a2、服务器信息 服务器初始账号密码 sxd / 123456 首先,更改自身密码都输入123456 sudo passwd 创建最高权限root账号,密码为 123456 su root 3、更新服务器源 1、更新源列表 sudo apt-g…

【golang】Windows与Linux交叉编译保姆级教程

【golang】Windows与Linux交叉编译 大家好 我是寸铁👊 总结了一篇【golang】Windows与Linux交叉编译的文章✨ 喜欢的小伙伴可以点点关注 💝 问题背景 今天寸铁想将Windows中的程序部到Linux下跑,我们知道在从Windows与Linux下要进行交叉编译…

11、Linux-安装和配置Redis

目录 第一步,传输文件和解压 第二步,安装gcc编译器 第三步,编译Redis 第四步,安装Redis服务 第五步,配置Redis ①开启后台启动 ②关闭保护模式(关闭之后才可以远程连接Redis) ③设置远程…

Java基础 - 8 - 算法、正则表达式、异常

一. 算法 什么是算法? 解决某个实际问题的过程和方法 学习算法的技巧? 先搞清楚算法的流程,再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

21 easy 1. 两数之和

//给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 // // 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 // // 你可以…

java Spring boot简述jetcache 并叙述后续文章安排

我们之前 讲了 Spring boot 整合 cache 使用 simple(默认) redis Ehcache memcached的几种方式 但是 始终有人觉得不够完善 提出了一些问题 例如 觉得 当前spring boot 对缓存过期的控制过于松散 不严谨 比较明显的体现就是 memcached过期时间在逻辑代码中控制 Ehcache的过期时…

Tomcat的安装

下载Tomcat(这里以Tomcat8.5为例) 直接进入官网进行下载,Tomcat官网 选择需要下载的版本,点击下载这里一定要注意:下载路径一定要记住,并且路径中尽量不要有中文!!!&…

Prompt Engineering、Finetune、RAG:OpenAI LLM 应用最佳实践

一、背景 本文介绍了 2023 年 11 月 OpenAI DevDay 中的一个演讲,演讲者为 John Allard 和 Colin Jarvis。演讲中,作者对 LLM 应用落地过程中遇到的问题和相关改进方案进行了总结。虽然其中用到的都是已知的技术,但是进行了很好的总结和串联…

神经网络的矢量化,训练与激活函数

我们现在再回到我们的神经元部分,来看我们如何用python进行正向传递。 单层的正向传递: 我们回到我们的线性回归的函数。我们每个神经元通过上述的方法,就可以得到我们的激发值,从而可以继续进行下一层。 我们用这个方法就可以得…

排序算法的对比

类别排序方法时间复杂度空间复杂度稳定性平均情况特殊情况 插入 排序 插入排序基本有序最优稳定希尔排序不稳定 选择 排序 选择排序不稳定堆排序不稳定 交换 排序 冒泡排序稳定快速排序基本有序最差不稳定归并排序稳定基数排序稳定

0环PEB断链实现

截止到昨天那里我们的思路就清晰了,通过EPROCESS找到我们要隐藏的进程的ActiveProcessLinks,将双向链表的值修改,就可以将我们想要隐藏的这个进程的ActiveProcessLinks从双向链表中抹去的效果,这里的话如果在windbg里面直接使用ed…