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

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

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

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

我们知道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);
        }
  }

三.图解

a1713b7f335f41b3adbd8b12eb2deae6.jpeg

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

相关文章
|
15天前
|
存储 编解码 算法
视频为什么可以被压缩?帧内压缩与帧间压缩有何区别?视频编码中的CBR、VBR、CRF...是什么?
视频压缩基于冗余,包括空间冗余、时间冗余、视觉冗余和编码冗余。帧内压缩利用空间相关性,帧间压缩利用时间相关性。视频编码中的码率控制方法有CBR(固定码率)、VBR(动态码率)、CRF(固定码率系数)、CQP(固定质量参数)、CVBR(约束可变码率)和ABR(平均码率),各有优缺点,适用于不同的场景。
|
4月前
|
机器学习/深度学习 算法 计算机视觉
【YOLOv10改进 -卷积Conv】 AKConv(可改变核卷积):任意数量的参数和任意采样形状的即插即用的卷积
AKConv是一种可改变核卷积,旨在解决传统卷积的局限,包括固定大小的卷积窗口和卷积核尺寸。AKConv提供灵活的卷积核参数和采样形状,适应不同尺度特征。其创新点包括:1)支持任意大小和形状的卷积核;2)使用新算法确定初始采样位置;3)应用动态偏移调整采样位置;4)优化模型参数和计算效率。AKConv已应用于YOLOv8,提高网络性能。相关代码可在<https://github.com/CV-ZhangXin/AKConv>找到。
|
5月前
|
Java Linux
ffmpeg音频格式转换、合成、速率调整
ffmpeg音频格式转换、合成、速率调整
114 2
|
6月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于有序抖动块截断编码的水印嵌入和提取算法matlab仿真
这是一个关于数字图像水印嵌入的算法介绍。使用MATLAB2022a,该算法基于DOTC,结合抖动和量化误差隐藏,确保水印的鲁棒性和隐蔽性。图像被分为N*N块,根据水印信号进行二值化处理,通过调整重建电平的奇偶性嵌入水印。水印提取是嵌入过程的逆操作,通过重建电平恢复隐藏的水印比特。提供的代码片段展示了从块处理、水印嵌入到噪声攻击模拟及水印提取的过程,还包括PSNR和NC的计算,用于评估水印在不同噪声水平下的性能。
|
计算机视觉
opencv之 读取视频的帧数变成图片
opencv之 读取视频的帧数变成图片
126 0
|
存储 编解码 缓存
libfdk_aac音频采样数和编码字节数注意
libfdk_aac音频采样数和编码字节数注意
172 0
|
存储 编解码 Java
【Android FFMPEG 开发】FFMPEG 音频重采样 ( 初始化音频重采样上下文 SwrContext | 计算音频延迟 | 计算输出样本个数 | 音频重采样 swr_convert )(一)
【Android FFMPEG 开发】FFMPEG 音频重采样 ( 初始化音频重采样上下文 SwrContext | 计算音频延迟 | 计算输出样本个数 | 音频重采样 swr_convert )(一)
744 0
随机乱序图像
随机乱序图像
97 0
随机乱序图像
|
内存技术
【音频处理】WAV 文件格式分析 ( 逐个字节解析文件头 | 相关字段的计算公式 )(二)
【音频处理】WAV 文件格式分析 ( 逐个字节解析文件头 | 相关字段的计算公式 )(二)
193 0
【音频处理】WAV 文件格式分析 ( 逐个字节解析文件头 | 相关字段的计算公式 )(二)
|
内存技术
【音频处理】WAV 文件格式分析 ( 逐个字节解析文件头 | 相关字段的计算公式 )(一)
【音频处理】WAV 文件格式分析 ( 逐个字节解析文件头 | 相关字段的计算公式 )(一)
417 0
【音频处理】WAV 文件格式分析 ( 逐个字节解析文件头 | 相关字段的计算公式 )(一)