当前位置: 首页 > 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…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...