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

如何把非1024的采样数放入aac编码器

一. aac对数据规格要求
二、代码实现
1.初始化
2.填入数据
3.取数据
三.图解

一. aac对放入的采样数要求

我们知道aac每次接受的字节数是固定的,在之前的文章里有介绍libfdk_aac音频采样数和编码字节数注意
它支持的采样数和编码字节数分别是:

fdk_aac 支持的音频采样率:7350 8000 11025 12000 16000 22050 24000 32000 44100
48000 64000 88200 96000 fdk_aac 样本类型:只支持AV_SAMPLE_FMT_S16输入.
ffmpeg本身自带的aac并不支持AV_SAMPLE_FMT_S16的,需要重采样为AV_SAMPLE_FMT_FLTP

av_opt_set(encodec_ctx_a->priv_data, “profile”, “lc”, 0);

2048 HE-AAC v1/v2 1024: Default configuration.//AAC-LC 1024
512: Default length in LD/ELD configuration.
480: Length in LD/ELD configuration.
256: Length for ELD reduced delay mode (x2).
240:Length for ELD reduced delay mode (x2).
128: Length for ELD reduced delay mode (x4).
120: Length for ELD reduced delay mode (x4). */

当我们得到的采样数是不规则的,比如decklink的采集卡每次的到的采样数帧率有关,为48000/fps。那么25fps,就是1920,60fps,是800。
那么我们就需要一个缓存,来每次读取1024个采样。
这里使用ffmpeg的重采样的缓存机制

二、代码实现

1.初始化

void swr()
{if(asc != NULL) swr_free(&asc);asc = swr_alloc_set_opts(asc,AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, 48000,AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, 48000, 0, 0);if (!asc){printf("swr_alloc_set_opts failed!\n");return ;}int ret_asc = swr_init(asc);if (ret_asc != 0){printf("swr_init failed!\n");char err[1024] = {0};av_strerror(ret_asc, err, sizeof(err) - 1);return ;}
}

2.填入数据

int fifo_size_1 = 0;int len = swr_convert(asc, 0, 0,(const uint8_t **)pcm_BMG->data, pcm_BMG->nb_samples); 

3.取数据

  while(1){int CIRCLE = 0;fifo_size_1 = swr_get_out_samples(asc, 0);if (fifo_size_1 >= 1024){int len = swr_convert(asc, p_pcm_enc->data, p_pcm_enc->nb_samples,0, 0);if(CIRCLE != 0) p_pcm_enc->pts = p_pcm_enc->pts  + CIRCLE * 1024 * (1000000 / 48000);//第一帧的ptselse p_pcm_enc->pts = pcm_BMG->pts - (fifo_size_1 - p_pcm_enc->nb_samples) * (1000000 / 48000);//long long swr_pts = swr_next_pts(asc, pcm_BMG->pts); 这个函数计算出的pts有误,亦或是我没有用对,望斧正CIRCLE++;}else {break;}re = avcodec_send_frame(encodec_ctx_a, p_pcm_enc);if(send_pkt_a.size != 0 && b_alloc == true) av_packet_unref(&send_pkt_a);while (re >= 0){re = avcodec_receive_packet(encodec_ctx_a, &send_pkt_a);}}

三.图解

x:缓存中的采样数
y:这次放入的采样数
p0:取出的1024包的pts
py:这次放入缓存包的pts
则:
p0 = py - (x-y)(1/48000)

相关文章:

如何把非1024的采样数放入aac编码器

一. aac对数据规格要求 二、代码实现 1.初始化 2.填入数据 3.取数据 三.图解 一. aac对放入的采样数要求 我们知道aac每次接受的字节数是固定的,在之前的文章里有介绍libfdk_aac音频采样数和编码字节数注意 它支持的采样数和编码字节数分别是: fdk_aac …...

linux安装nodejs和vue

下载nodejs 打开 下载地址页面中下载**Linux Binaries (x64)**的二进制包设置安装目录 sudo mkdir -p /usr/local/lib/nodejs # 解压 如下载的 node-v18.17.0-linux-x64.tar.xz sudo tar -xJvf node-v18.17.0-linux-x64.tar.xz -C /usr/local/lib/nodejs 加入到PATH #######…...

spring整合mybatis

所需配置&#xff1a; <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>m…...

Spring指定bean在哪个应用加载

1.背景 某项目,spring架构,有2个不同的WebAppApplication入口,大部分service类共用,小部分类有区别,只需要在一个应用中加载,不需要在另一个应用中加载. 2.实现代码 自定义限制注解 package mis.shared.annotation;import java.lang.annotation.ElementType; import java.lan…...

二维网格划分 LRU缓存设计

背景 有大量的二维矩形需要存储查看点在哪些矩形中给定一个矩形 查看与哪些矩阵相交项目背景与图形图像基本无关&#xff0c;只涉及大文件分块读取&#xff0c;所以不用实现游戏行业中的物理引擎 设计思路 使用空间划分算法&#xff1a;二维栅格将整个空间划分为多个小区域。…...

C++中使用 sizeof 确定变量的长度

C中使用 sizeof 确定变量的长度 变量长度指的是程序员声明变量时&#xff0c;编译器将预留多少内存&#xff0c;用于存储赋给该变量的数据。变量的长度随类型而异&#xff0c; C 提供了一个方便的运算符——sizeof&#xff0c;可用于确定变量的长度&#xff08;单位为字节&…...

我们的衣物收纳商品政策

本政策涵盖的衣物收纳商品 衣物收纳商品是指带有抽屉或铰链门的家具商品&#xff0c;用于存放衣物。此政策适用于独立式衣物收纳商品&#xff0c;包括但不限于高度为 27 英寸&#xff08;69 厘米或 686 毫米&#xff09;或更高&#xff08;从地面到商品顶部测量&#xff09;的…...

代码随想录算法训练营第25天| 第七章 回溯算法part02: leetcode 216、leetcode 17

Part I : 回溯算法基础 对回溯算法不清楚的可以参看前一篇&#xff1a;代码随想录算法训练营第24天| 第七章 回溯算法part01 理论基础、leetcode 77 Part II: 相关题目 Leetcode 216.组合总和III 解决问题&#xff1a;在数字1~9之间&#xff0c;找出k个数且它们的和为n从而…...

WebAPI文档与自动化测试

目录 1、控制器&#xff0c;项目属性里需要勾选输出Xml文档选项&#xff1a; 2、下载文档的网页数据 3、运行访问网址 4、接口测试&#xff1a; 5、批量测试&#xff1a; 6、微服务文档 总结&#xff1a; 本篇介绍框架的WebAPI文档与自动化测试 1、控制器&#xff0c;项…...

netty架构

https://zhuanlan.zhihu.com/p/181239748 https://cloud.tencent.com/developer/article/1754078...

拉普拉斯平滑算法

原理 最简单的拉普拉斯平滑算法的原理是将每个顶点都移动到相邻顶点的平均位置上。公式 示例&#xff08;UE5代码片段&#xff09; 参考 https://blog.csdn.net/mrbaolong/article/details/105859109...

Java课题笔记~ IoC 控制反转

二、IoC 控制反转 控制反转&#xff08;IoC&#xff0c;Inversion of Control&#xff09;&#xff0c;是一个概念&#xff0c;是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器&#xff0c;通过容器来实现对象的 装配和管理。控制反转就是对对象控制权的转移&a…...

【Spring】Spring中的设计模式

文章目录 责任链模式工厂模式适配器模式代理模式模版方法观察者模式构造器模式 责任链模式 Spring中的Aop的通知调用会使用责任链模式责任链模式介绍 角色&#xff1a;抽象处理者&#xff08;Handler&#xff09;具体处理者&#xff08;ConcreteHandler1&#xff09;客户类角…...

【ChatGLM_02】LangChain知识库+Lora微调chatglm2-6b模型+提示词Prompt的使用原则

经验沉淀 1 知识库1.1 Langchain知识库的主要功能(1) 配置知识库(2) 文档数据测试(3) 知识库测试模式(4) 模型配置 2 微调2.1 微调模型的概念2.2 微调模型的方法和步骤(1) 基于ptuning v2 的微调(2) 基于lora的微调 3 提示词3.1 Prompts的定义及原则(1) Prompts是什么&#xf…...

构建未来移动应用:探索安卓、iOS和HarmonyOS的技术之旅

安卓、iOS和HarmonyOS的比较分析 在移动应用开发领域&#xff0c;安卓、iOS和HarmonyOS是三个常见的操作系统。本文将对它们进行比较分析&#xff0c;并展示一些相关的代码示例。 安卓&#xff08;Android&#xff09; 安卓是由Google开发的移动操作系统&#xff0c;基于Lin…...

【新版系统架构补充】-嵌入式软件

嵌入式软件 嵌入式软件是指应用在嵌入式计算机系统当中的各种软件&#xff0c;除了具有通用软件的一般特性&#xff0c;还具有一些与嵌入式系统相关的特点&#xff0c;包括&#xff1a;规模较小、开发难度大、实时性和可靠性要求高、要求固化存储。 嵌入式软件分类&#xff1…...

【云原生】K8S超详细概述

目录 一、Kubernets概述1.1 K8S什么1.2为什么要用K8S 二、Kubernetes 集群架构与组件2.1Master组件Kube-apiserverKube-controller-managerKube-scheduler 2.2 配置存储中心etcd 2.3 Node 组件KubeletKube-Proxydocker 或 rocket 三、 Kubernetes 核心概念3.1Pod3.2Pod 控制器K…...

(五)Node.js -模块的加载机制

1. 优先从缓存中加载 模块在第一次加载后会被缓存。这意味着多次调用require()不会导致模块的代码被执行多次。 注意&#xff1a;不论是内置模块、用户自定义模块、还是第三方模块&#xff0c;它们都会优先从缓存中加载&#xff0c;从而提高模块的加载效率。 2. 内置模块的加载…...

【docker】Windows11系统下安装并配置阿里云镜像加速

【docker】Windows11系统下安装并配置阿里云镜像加速 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【docker】Windows11系统下安装并配置阿里云镜像加速一、查看Windows环境是否支持docker二、 启动Hyper-V三、 官网下载安装Docker应用和数据…...

SpringBoot搭建WebSocket初始化

1.java后端的maven添加websocket依赖 <!-- websocket依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>2.实例化ServerEndpointExport…...

保姆级教程:手把手教你用CANape和VX1000给ECU刷写镜像(附避坑指南)

汽车ECU刷写实战&#xff1a;从零掌握CANape与VX1000工具链 第一次接触汽车电子控制单元&#xff08;ECU&#xff09;刷写时&#xff0c;面对复杂的工具链和专业术语&#xff0c;很多工程师都会感到无从下手。CANape和VX1000作为行业内广泛使用的专业工具组合&#xff0c;其强大…...

嵌入式环形缓冲区LwRB:高效数据流管理实践

1. 环形缓冲区&#xff1a;嵌入式数据流管理的基石在嵌入式系统开发中&#xff0c;数据流管理是个永恒的话题。想象一下这样的场景&#xff1a;你的物联网设备每秒接收数百个传感器数据包&#xff0c;串口不断涌入数据&#xff0c;而处理器需要有条不紊地处理这些信息。传统线性…...

Switch破解新选择:大气层系统稳定版完整安装与优化指南

Switch破解新选择&#xff1a;大气层系统稳定版完整安装与优化指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 想要让你的Switch焕发新生&#xff0c;体验自制软件和游戏优化的无限可能…...

【电路设计实战】BUCK降压电源:从原理到PCB布局的降噪与效率优化

1. BUCK降压电路的核心原理 BUCK降压电路作为开关电源中最基础的拓扑结构之一&#xff0c;其工作原理看似简单却蕴含着精妙的能量转换机制。我第一次接触BUCK电路时&#xff0c;被它高达90%以上的转换效率所震撼 - 这可比传统的线性稳压器强太多了。那么它是如何做到的呢&#…...

【数据结构与算法】第30篇:哈希表(Hash Table)

一、什么是哈希表1.1 基本思想哈希表通过哈希函数将关键字映射到数组的某个位置&#xff0c;实现快速访问。textkey → 哈希函数 → 数组下标 → 访问/存储示例&#xff1a;hash(key) key % 10key25 → 25%105 → 存入下标5key37 → 37%107 → 存入下标71.2 哈希冲突不同的key…...

基于扩展卡尔曼滤波器(EKF)的PMSM无位置传感器控制优化策略解析

1. 为什么PMSM需要无位置传感器控制&#xff1f; 永磁同步电机&#xff08;PMSM&#xff09;凭借高功率密度、高效率等优势&#xff0c;在电动汽车、工业伺服等领域广泛应用。但传统控制方案依赖机械位置传感器&#xff08;如编码器、旋转变压器&#xff09;&#xff0c;不仅增…...

PPOCRLabel快捷键全解析:告别鼠标点点点,提升标注效率的隐藏技巧

PPOCRLabel快捷键全解析&#xff1a;告别鼠标点点点&#xff0c;提升标注效率的隐藏技巧 当你面对上千张待标注的图片时&#xff0c;每次点击菜单、切换工具、调整选框的微小延迟&#xff0c;都会累积成惊人的时间损耗。专业标注员的秘密武器从来不是鼠标&#xff0c;而是那些藏…...

实战演练:基于快马平台与OpenClaw实现颜色分拣机器人应用

最近在做一个工厂自动化的小项目&#xff0c;正好用到了OpenClaw机械爪控制库&#xff0c;结合颜色识别实现了一个智能分拣系统。这个实战案例特别适合在InsCode(快马)平台上快速验证&#xff0c;下面分享下我的实现思路和关键要点。 项目整体架构设计 系统主要分为三个核心模块…...

3大优势!Scarab模组管理工具使用技巧:从新手到高手的进阶指南

3大优势&#xff01;Scarab模组管理工具使用技巧&#xff1a;从新手到高手的进阶指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否在安装空洞骑士模组时遇到过文件路…...

Java8时间魔法:Duration与Period实战,精准掌控时间与日期间隔

1. Duration与Period&#xff1a;Java8的时间魔法棒 第一次接触Java8的日期时间API时&#xff0c;我被LocalDate和LocalDateTime的简洁惊艳到了。但真正让我感受到时间魔法魅力的&#xff0c;是在处理两个时间点间隔时遇到的Duration和Period。记得有次做会员系统&#xff0c;…...