如何把非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
所需配置: <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缓存设计
背景 有大量的二维矩形需要存储查看点在哪些矩形中给定一个矩形 查看与哪些矩阵相交项目背景与图形图像基本无关,只涉及大文件分块读取,所以不用实现游戏行业中的物理引擎 设计思路 使用空间划分算法:二维栅格将整个空间划分为多个小区域。…...
C++中使用 sizeof 确定变量的长度
C中使用 sizeof 确定变量的长度 变量长度指的是程序员声明变量时,编译器将预留多少内存,用于存储赋给该变量的数据。变量的长度随类型而异, C 提供了一个方便的运算符——sizeof,可用于确定变量的长度(单位为字节&…...
我们的衣物收纳商品政策
本政策涵盖的衣物收纳商品 衣物收纳商品是指带有抽屉或铰链门的家具商品,用于存放衣物。此政策适用于独立式衣物收纳商品,包括但不限于高度为 27 英寸(69 厘米或 686 毫米)或更高(从地面到商品顶部测量)的…...
代码随想录算法训练营第25天| 第七章 回溯算法part02: leetcode 216、leetcode 17
Part I : 回溯算法基础 对回溯算法不清楚的可以参看前一篇:代码随想录算法训练营第24天| 第七章 回溯算法part01 理论基础、leetcode 77 Part II: 相关题目 Leetcode 216.组合总和III 解决问题:在数字1~9之间,找出k个数且它们的和为n从而…...
WebAPI文档与自动化测试
目录 1、控制器,项目属性里需要勾选输出Xml文档选项: 2、下载文档的网页数据 3、运行访问网址 4、接口测试: 5、批量测试: 6、微服务文档 总结: 本篇介绍框架的WebAPI文档与自动化测试 1、控制器,项…...
netty架构
https://zhuanlan.zhihu.com/p/181239748 https://cloud.tencent.com/developer/article/1754078...
拉普拉斯平滑算法
原理 最简单的拉普拉斯平滑算法的原理是将每个顶点都移动到相邻顶点的平均位置上。公式 示例(UE5代码片段) 参考 https://blog.csdn.net/mrbaolong/article/details/105859109...
Java课题笔记~ IoC 控制反转
二、IoC 控制反转 控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的 装配和管理。控制反转就是对对象控制权的转移&a…...
【Spring】Spring中的设计模式
文章目录 责任链模式工厂模式适配器模式代理模式模版方法观察者模式构造器模式 责任链模式 Spring中的Aop的通知调用会使用责任链模式责任链模式介绍 角色:抽象处理者(Handler)具体处理者(ConcreteHandler1)客户类角…...
【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是什么…...
构建未来移动应用:探索安卓、iOS和HarmonyOS的技术之旅
安卓、iOS和HarmonyOS的比较分析 在移动应用开发领域,安卓、iOS和HarmonyOS是三个常见的操作系统。本文将对它们进行比较分析,并展示一些相关的代码示例。 安卓(Android) 安卓是由Google开发的移动操作系统,基于Lin…...
【新版系统架构补充】-嵌入式软件
嵌入式软件 嵌入式软件是指应用在嵌入式计算机系统当中的各种软件,除了具有通用软件的一般特性,还具有一些与嵌入式系统相关的特点,包括:规模较小、开发难度大、实时性和可靠性要求高、要求固化存储。 嵌入式软件分类࿱…...
【云原生】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()不会导致模块的代码被执行多次。 注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。 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…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
