当前位置: 首页 > news >正文

ffmpeg7.0 aac转pcm


#pragma once
#define __STDC_CONSTANT_MACROS
#define _CRT_SECURE_NO_WARNINGSextern "C"
{
#include "libavcodec/avcodec.h"
}//缓冲区大小(缓存5帧数据)
#define AUDIO_INBUF_SIZE 40960  
/*name   depthu8        8s16      16s32      32flt      32dbl      64u8p       8s16p     16s32p     32fltp     32dblp     64s64      64s64p     64//此代码解码的音频文件格式如下://AAC文件(一帧1024字节),双声道(2),FLTP(32位,4字节)//AAC文件 frame_size 和 nb_samples 大小均为1024//一帧音频所占字节大小//1024*2*4=8192字节
*/
#define AUDIO_REFILL_THRESH 8192using namespace std;#define INPUT_FILE_NAME "d:\\123.aac"
#define OUTPUT_FILE_NAME "d:\\1111.pcm"static int get_format_from_sample_fmt(const char** fmt,	enum AVSampleFormat sample_fmt)
{struct sample_fmt_entry {enum AVSampleFormat sample_fmt; const char* fmt_be, * fmt_le;} sample_fmt_entries[] = {{ AV_SAMPLE_FMT_U8,  "u8",    "u8"    },{ AV_SAMPLE_FMT_S16, "s16be", "s16le" },{ AV_SAMPLE_FMT_S32, "s32be", "s32le" },{ AV_SAMPLE_FMT_FLT, "f32be", "f32le" },{ AV_SAMPLE_FMT_DBL, "f64be", "f64le" },};*fmt = NULL;for (int i = 0; i < FF_ARRAY_ELEMS(sample_fmt_entries); i++) {struct sample_fmt_entry* entry = &sample_fmt_entries[i];if (sample_fmt == entry->sample_fmt) {*fmt = AV_NE(entry->fmt_be, entry->fmt_le);return 0;}}av_log(NULL, AV_LOG_ERROR, "sample format %s is not supported as output format\n", av_get_sample_fmt_name(sample_fmt));return -1;
}static void decode(AVCodecContext* pCodecContext, AVFrame* pFrame, AVPacket* pPacket, FILE* pFile)
{int ret = avcodec_send_packet(pCodecContext, pPacket);if (ret < 0) {av_log(NULL, AV_LOG_ERROR, "发送数据包到解码器出错。\n");exit(1);}while (ret >= 0) {ret = avcodec_receive_frame(pCodecContext, pFrame);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {return;}else if (ret < 0) {av_log(NULL, AV_LOG_ERROR, "Error sending a packet for decoding.\n");exit(1);}//获取每个采样点当中每个声道的大小int nDataSize = av_get_bytes_per_sample(pCodecContext->sample_fmt);if (nDataSize < 0) {av_log(NULL, AV_LOG_ERROR, "Failed to calculate data size.\n");exit(1);}//遍历采样点for (int i = 0; i < pFrame->nb_samples; i++) {//遍历声道for (int ch = 0; ch < pCodecContext->ch_layout.nb_channels; ch++) {fwrite(pFrame->data[ch] + nDataSize * i, 1, nDataSize, pFile);}}}
}int main(int argc, char* argv[])
{//初始化inbuf数字默认值uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE] = {0};//获取解码器(此处需要读取的文件是AAC,故)const AVCodec* pCodecOfAAC = avcodec_find_decoder(AV_CODEC_ID_AAC);if (!pCodecOfAAC) {av_log(NULL, AV_LOG_ERROR, "Codec not found.\n");exit(1);}//注册解析器AVCodecParserContext* pCodecParserParser = av_parser_init(pCodecOfAAC->id);if (!pCodecParserParser) {av_log(NULL, AV_LOG_ERROR, "parser not found.\n");exit(1);}//分配解析器上下文AVCodecContext* pCodecContextOfAAC = avcodec_alloc_context3(pCodecOfAAC);if (!pCodecContextOfAAC) {av_log(NULL, AV_LOG_ERROR, "Could not allocate video codec context.\n");exit(1);}//打开解码器if (avcodec_open2(pCodecContextOfAAC, pCodecOfAAC, NULL) < 0) {av_log(NULL, AV_LOG_ERROR, "Could not open codec.\n");exit(1);}//分配AVPacketAVPacket* pPacket = av_packet_alloc();if (!pPacket) {exit(1);}//分配AVFrameAVFrame* pFrame = av_frame_alloc();if (!pFrame) {exit(1);}//打开输入文件FILE* ifile = fopen(INPUT_FILE_NAME, "rb");if (!ifile) {av_log(NULL, AV_LOG_ERROR, "Could not open \s.\n", INPUT_FILE_NAME);exit(1);}//打开输入文件FILE* ofile = fopen(OUTPUT_FILE_NAME, "wb+");if (!ofile) {av_log(NULL, AV_LOG_ERROR, "Could not open \s.\n", OUTPUT_FILE_NAME);exit(1);}//从输入流 ifile 读取数据到 inbuf 所指向的数组中uint8_t* data = inbuf;size_t nDataSize = fread(inbuf, 1, AUDIO_INBUF_SIZE, ifile);while (nDataSize > 0) {//使用注册的解析器 parser 把数据分割成帧int nRet = av_parser_parse2(pCodecParserParser, pCodecContextOfAAC, &pPacket->data, &pPacket->size, data, nDataSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);if (nRet < 0) {fprintf(stderr, "Error while parsing\n");exit(1);}//根据使用情况重置数据位置data += nRet;nDataSize -= nRet;//送往解码if (pPacket->size) {decode(pCodecContextOfAAC, pFrame, pPacket, ofile);}//判断缓存区剩余数据是否小于一帧音频大小//小于的话从文件继续读取,之后在送往解码if (nDataSize < AUDIO_REFILL_THRESH) {memmove(inbuf, data, nDataSize);data = inbuf;int nLen = fread(data + nDataSize, 1, AUDIO_INBUF_SIZE - nDataSize, ifile);if (nLen > 0) {nDataSize += nLen;}}}//flush 解码器decode(pCodecContextOfAAC, pFrame, NULL, ofile);//此时就已经解码完了,我们稍后使用ffplay播放下音频//解码出来的pcm数据是没有这些基础数据的,我们需要从元数据获取//打印下基本信息//声道数printf("channels: %d \n", pCodecContextOfAAC->ch_layout.nb_channels);//采样率printf("sample_rate: %d  \n", pCodecContextOfAAC->sample_rate);//一帧音频所占字节代销printf("buffer: %d  \n", av_samples_get_buffer_size(NULL, pCodecContextOfAAC->ch_layout.nb_channels, pCodecContextOfAAC->frame_size, pCodecContextOfAAC->sample_fmt, 1));//采样格式enum AVSampleFormat sfmt = pCodecContextOfAAC->sample_fmt;printf("sample_fmt: %s  \n", av_get_sample_fmt_name(sfmt));//如果为planar,转换为packed格式if (av_sample_fmt_is_planar(sfmt)) {const char* packed = av_get_sample_fmt_name(sfmt);sfmt = av_get_packed_sample_fmt(sfmt);}const char* fmt = NULL;if (get_format_from_sample_fmt(&fmt, sfmt) < 0) {av_log(NULL, AV_LOG_ERROR, "Could not get forma \s.\n", av_get_sample_fmt_name(sfmt));exit(1);}//资源释放fclose(ifile);fclose(ofile);av_parser_close(pCodecParserParser);avcodec_free_context(&pCodecContextOfAAC);av_frame_free(&pFrame);av_packet_free(&pPacket);return 0;
}

 

相关文章:

ffmpeg7.0 aac转pcm

#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小&#xff08;缓存5帧数据&#xff09; #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …...

【Pandas】pandas Series rdiv

Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...

线程安全问题介绍

文章目录 **什么是线程安全&#xff1f;****为什么会出现线程安全问题&#xff1f;****线程安全问题的常见场景****如何解决线程安全问题&#xff1f;**1. **使用锁**2. **使用线程安全的数据结构**3. **原子操作**4. **使用volatile关键字**5. **线程本地存储**6. **避免死锁*…...

为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器

本文问题 现在我们回到 ONE/TWO/TREE 的资源存储库 的设计--用来指导 足以 支持 本项目&#xff08;为AI聊天工具增加一套知识系统&#xff09;的 核心能力 “语言处理” 中 最高难度系数的“自然语言处理” 中最具挑战性的“含糊性” 问题的解决。--因为足以解决 自然语言中最…...

初识verilog HDL

为什么选择用Verilog HDL开发FPGA&#xff1f;&#xff1f;&#xff1f; 硬件描述语言&#xff08;Hardware Descriptipon Lagnuage&#xff0c;HDL&#xff09;通过硬件的方式来产生与之对应的真实的硬件电路&#xff0c;最终实现所设计的预期功能&#xff0c;其设计方法与软件…...

VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署

近期有个工作需求是进行 YOLOv8 模型的 C 部署&#xff0c;部署环境如下 系统&#xff1a;WindowsIDE&#xff1a;VS2015语言&#xff1a;COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…...

Notepad++上NppFTP插件的安装和使用教程

一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP&#xff0c;一般情况下&#xff0c;自带的下载地址容易下载失败。这里准备了一个下载连接&#xff1a;Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…...

Kotlin | Android Provider 的实现案例

目标 使用 Android Room 实现持久化库。 代码 Kotlin 代码编写 DemoDatabase&#xff0c;在build生成 DemoDatabase_Impl 疑问 Provider的数据会存在设备吗&#xff1f; 内部存储: 当使用 Room 创建数据库&#xff08;如 DemoDatabase&#xff09;&#xff0c;数据库文件通常…...

频域自适应空洞卷积FADC详解

定义与原理 在探讨FADC的核心策略之前,我们需要深入了解其定义和工作原理。FADC是一种创新性的卷积技术,旨在克服传统空洞卷积的局限性。其核心思想是从 频谱分析的角度 改进空洞卷积,通过 动态调整膨胀率 来平衡有效带宽和感受野大小。 FADC的工作原理可以从以下几个方面…...

Edge浏览器内置的截长图功能

Edge浏览器内置截图功能 近年来&#xff0c;Edge浏览器不断更新和完善&#xff0c;也提供了长截图功能。在Edge中&#xff0c;只需点击右上角的“...”&#xff0c;然后选择“网页捕获”->“捕获整页”&#xff0c;即可实现长截图。这一功能的简单易用&#xff0c;使其成为…...

GAN的应用

5、GAN的应用 ​ GANs是一个强大的生成模型&#xff0c;它可以使用随机向量生成逼真的样本。我们既不需要知道明确的真实数据分布&#xff0c;也不需要任何数学假设。这些优点使得GANs被广泛应用于图像处理、计算机视觉、序列数据等领域。上图是基于GANs的实际应用场景对不同G…...

Math Reference Notes: 希腊字母表

希腊字母&#xff08;Greek alphabet&#xff09;是古希腊语使用的字母系统&#xff0c;也是西方字母系统的先驱之一&#xff0c;广泛应用于现代数学、物理学、工程学以及各种科学领域。希腊字母有24个字母&#xff0c;它们分为大写和小写两种形式。 1. Alpha (Α, α) 发音&a…...

高通,联发科(MTK)等手机平台调优汇总

一、常见手机型号介绍&#xff1a; ISP除了用在安防行业&#xff0c;还有手机市场&#xff0c;以及目前新型的A/VR眼睛&#xff0c;机器3D视觉机器人&#xff0c;医疗内窥镜这些行业。 下面是一些最近几年发布的,,,旗舰SOC型号&#xff1a; 1.联发科&#xff1a;天玑92…...

Rust语言使用iced实现简单GUI页面

使用cargo新建一个rust项目 cargo new gui_demo cd gui_demo 编辑Cargo.toml文件 ,添加iced依赖 [package] name "gui_demo" version "0.1.0" edition "2021"[dependencies] iced "0.4.2" 编辑src/main.rs文件&#xff1a; u…...

使用wav2vec 2.0进行音位分类任务的研究总结

使用wav2vec 2.0进行音位分类任务的研究总结 原文名称&#xff1a; Using wav2vec 2.0 for phonetic classification tasks: methodological aspects 研究背景 自监督学习在语音中的应用 自监督学习在自动语音识别任务中表现出色&#xff0c;例如说话人识别和验证。变换器模型…...

25/1/11 嵌入式笔记<esp32> 初入esp32

用Arduino平台&#xff0c;学习了点亮led灯。 //定义LED引脚 int led_pin 12&#xff1b;void setup() {//设定引脚为输出模式pinMode(led_pin,OUTPUT):}void loop() {// 点亮LED:digitalWrite(led_pin,HIGH);//延时1sdelay(1000);//熄灭LEDdigitalWrite(led_pin,LOW)://延时…...

基于SMT32U575RIT单片机-中断练习

任务 查看手册对所有的拓展板上和相对应的底板的引脚对应的端口找到以下结论 通过STM32MX软件对各个引脚进行相应的配置 1.第一种切换模式电脑发送 #include "main.h" #include "icache.h" #include "usart.h" #include "gpio.h"/*…...

在Django的Serializer的列表数据中剔除指定元素

【Python工作随笔】 提问 如何在List序列化方法中剔除不要的元素&#xff0c;例如在成绩中剔除0 class BasicDescriptionSubjectBoxPlotSerializer(serializers.Serializer):语文 serializers.ListField(sourcescore_chinese)数学 serializers.ListField(sourcescore_math…...

我喜欢的数学题

偏向抖机灵性质的&#xff0c;考察理解的&#xff0c;而不是比拼计算量的&#xff0c;可能跟现在岁数大了算不明白了多少有点关系吧。 高高手&#xff0c;别太重计算&#xff0c;给普通孩子留条路。就算将来真的理工治国&#xff0c;也没必要都往人形计算机方面引导。毕竟你未来…...

Redis解决热key问题

当Redis遇到热key问题时&#xff0c;即某个或某些key被频繁访问&#xff0c;可能导致单个Redis节点负载过高&#xff0c;影响整个系统性能。以下是一些常见的解决方案&#xff1a; 1. 缓存预热与复制 缓存预热&#xff1a;在系统启动阶段&#xff0c;将热key对应的value预先加…...

Vector API + Panama Foreign Function最新融合实践(2024 Q2实测):纯Java实现BLAS级矩阵运算

第一章&#xff1a;Vector API Panama Foreign Function融合背景与技术演进Java 平台长期面临两大性能瓶颈&#xff1a;一是 JVM 对现代 CPU 向量化指令&#xff08;如 AVX-512、SVE&#xff09;缺乏直接、安全、可移植的抽象&#xff1b;二是 Java 与本地系统库&#xff08;如…...

避坑指南:在YOLOv5-7.0中融合BiFPN时,如何平衡P2检测头带来的精度与速度损耗?

YOLOv5-7.0中BiFPN与P2检测头的精度与速度平衡实战 当你在无人机航拍画面中寻找几毫米大小的电子元件时&#xff0c;或者在显微镜图像中定位细胞核位置时&#xff0c;传统目标检测模型的性能往往会大打折扣。这正是微小目标检测技术大显身手的场景——而YOLOv5作为工业界最受欢…...

航空安全报告分析:UAE-Large-V1的事件分类与风险评估应用

航空安全报告分析&#xff1a;UAE-Large-V1的事件分类与风险评估应用 【免费下载链接】UAE-Large-V1 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/UAE-Large-V1 UAE-Large-V1作为一款先进的通用英文句子嵌入模型&#xff0c;在航空安全领域展现出强大的事…...

为什么选择Sammy.js:轻量级JavaScript框架的终极优势解析

为什么选择Sammy.js&#xff1a;轻量级JavaScript框架的终极优势解析 【免费下载链接】sammy Sammy is a tiny javascript framework built on top of jQuery, Its RESTful Evented Javascript. 项目地址: https://gitcode.com/gh_mirrors/sa/sammy 在当今前端开发领域&…...

提升GitHub访问效率的实用方案

提升GitHub访问效率的实用方案 【免费下载链接】gh-proxy github release、archive以及项目文件的加速项目 项目地址: https://gitcode.com/gh_mirrors/gh/gh-proxy 诊断连接瓶颈 检测网络延迟指标 准备工作&#xff1a;确保系统已安装网络诊断工具&#xff08;Linux默…...

前端进阶 课程二十六、:Flex布局进阶与实战(复杂布局)

一、学习目标 掌握Flex布局嵌套规则,实现容器内多层Flex嵌套; 运用Flex完成头部+内容区+底部、卡片详情、响应式导航三大复杂布局; 解决Flex项目溢出、对齐失效、高度自适应等常见问题; 区分Flex与float布局,明确Flex的现代布局优势。 二、核心知识点+实战代码 1. Fl…...

别只盯着价格!用统计学和三角函数“解剖”波场哈希:一份给数据科学家的区块链数据分析指南

区块链哈希值的数据科学探索&#xff1a;从统计建模到三角分析 区块链技术正在重塑数据科学的边界&#xff0c;而哈希值作为其核心组件之一&#xff0c;蕴含着丰富的数学特征等待挖掘。对于具备统计学基础的研究者而言&#xff0c;这些看似随机的字符串实际上是绝佳的研究样本。…...

AI模型评估指标:InstantID在各项基准测试中的表现

AI模型评估指标&#xff1a;InstantID在各项基准测试中的表现 【免费下载链接】InstantID 项目地址: https://ai.gitcode.com/hf_mirrors/InstantX/InstantID InstantID作为一款领先的AI模型&#xff0c;在多项基准测试中展现出卓越性能。本文将深入解析其在各项评估指…...

BYD 高通8155 OTA项目 我写的一篇专利

草根不要在BYD写专利&#xff0c;我24年1月初开始撰写&#xff0c;24年6月份才提交到专利公司&#xff0c;被驳回是因为有对比文件公开了我的发明点&#xff0c;是重庆赛力斯 4月份公开的&#xff0c;部门内部流程审核极慢&#xff0c;集团IPR找各种理由能拖上你半年&#xff0…...

OpenClaw对话日志分析:Qwen3-14B挖掘用户真实需求

OpenClaw对话日志分析&#xff1a;Qwen3-14B挖掘用户真实需求 1. 为什么需要分析对话日志&#xff1f; 作为一个长期使用OpenClaw的开发者&#xff0c;我发现自己陷入了一个典型的技术陷阱&#xff1a;花大量时间开发新功能&#xff0c;却很少回头审视用户实际如何使用这些功…...