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

这篇具有很好参考价值的文章主要介绍了如何把非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);//第一帧的pts
                else 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);
        }
  }

三.图解

如何把非1024的采样数放入aac编码器,# 音频,aac,ffmpeg,1024,fdk_aac

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

另外一种方法,未尝试过,供参考

用 AVFilter 来进行裁剪就行。可以用 aformat 滤镜,然后用 av_buffersink_set_frame_size 限制
buffsink 的输出采样为 1024,裁剪之后,连 pts 都是帮你算好的,可以直接用。 参考 ffmpeg.c ,他里面就是这么做的。文章来源地址https://www.toymoban.com/news/detail-626717.html

如何把非1024的采样数放入aac编码器,# 音频,aac,ffmpeg,1024,fdk_aac如何把非1024的采样数放入aac编码器,# 音频,aac,ffmpeg,1024,fdk_aac如何把非1024的采样数放入aac编码器,# 音频,aac,ffmpeg,1024,fdk_aac

到了这里,关于如何把非1024的采样数放入aac编码器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AE(自动编码器)与VAE(变分自动编码器)的区别和联系?

    他们各自的概念看以下链接就可以了:https://blog.csdn.net/weixin_43135178/category_11543123.html  这里主要谈一下他们的区别? VAE是AE的升级版,VAE也可以被看作是一种特殊的AE AE主要用于数据的 压缩与还原 ,VAE主要用于 生成 。 AE是将数据映直接映射为数值 code(确定的数值) ,而

    2024年02月03日
    浏览(51)
  • 解码器 | 基于 Transformers 的编码器-解码器模型

    基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外,建议读者对 自注意力 (self-attention) 架构 有一个基本了解

    2024年02月08日
    浏览(44)
  • FPGA VHDL文本编辑器设计8-3优先编码器并构成16-4优先编码器

    题目要求: 在文本编辑器中使用VHDL语言设计一个优先8-3编码器。在另一个新实体中将其定义成一个元件,通过元件例化的方式设计一个16-4优先编码器。文件命名为***164.vhd,器件设定为EP3C16F256C8。要求输入节点命名为d0…d15,低电平有效;输出节点命为A、B、C、D。进行波形仿

    2024年02月11日
    浏览(41)
  • STM32编码器模式(带方向/正交编码)

    看前说明 :这里重点介绍的时STM32的定时器编码器模式,是根据STMF10x参考手册,如果有使用过编码器或编码器不一样的可以直接跳过前面的编码器介绍,直接看理论分析与程序部分。 这里需要注意的参数 输出脉冲线数:1024线: 编码器每旋转一周输出的脉冲的个数 ,这个数

    2023年04月24日
    浏览(51)
  • 【单片机】STM32单片机读取旋转编码器,TIM定时器编码器模式捕获,程序

    旋转编码器简单来说,就是会输出2个PWM,依据相位可以知道旋转方向,依据脉冲个数可以知道旋转的角度。一般旋转一圈有一个固定数值的脉冲个数。 旋转编码器广泛用于电机、或者角度传感器,STM32的定时器可以直接接入这两个波形获取到信息。 前两个引脚(接地和Vcc)

    2024年02月13日
    浏览(40)
  • 鼠标滚轮编码器解析

    文章目录 前言 一、鼠标滚轮编码器逻辑? 二、使用步骤 1.引入库 2.读入数据 总结         鼠标滚轮编码器为三脚接入,一个COM脚C(一般是接地),两个脉冲波形输入脚A、B,转动滚轮编码器会在两个脉冲输入脚上产生脉冲,顺时针或逆时针转动时根据同一时刻产生的电

    2024年02月12日
    浏览(33)
  • 编码器的分类

    目录 光电编码器 一、增量式编码器 二、绝对式编码器 三、混合式绝对值编码器 四、旋转变压器 五、正余弦伺服电机编码器         光电编码器主要有增量式编码器、绝对式编码器、混合式绝对值编码器、旋转变压器、正余弦伺服电机编码器等,其中增量式编码器、绝

    2024年02月05日
    浏览(37)
  • 【深度学习】编码器专题(02)

    前文见: 【深度学习】编码器专题(01)          在上面的示例中, src_mask 设置为 “无”。 如第三篇文章所述,可选的掩码可以通过多头注意力层传递。对于编码器,此掩码通常是根据序列的填充创建的。本文中使用的三个序列的长度均为 6。但是,不同长度的序列更

    2024年02月16日
    浏览(41)
  • stm32-编码器测速

    编码电机 旋转编码器 A,B相分别接通道一和二的引脚,VCC,GND接单片机VCC,GND 以前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频繁执行,操作简单的任务,一般设计一个硬件电路模块来自动完成。 使用定时器

    2024年03月19日
    浏览(44)
  • 编码器测速原理与实现

    通常情况下编码器旋转一周会输出固定的脉冲数,即编码器的分辨率,通过测量固定时间T内编码器输出的脉冲数即可求得电机的转速。 假设编码器的分辨率为P,T时间内测得脉冲数m个,则单倍频(编码器转动一圈输出的脉冲数与分辨率相同)情况下电机转速为: (其中m/p为

    2024年02月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包