如何与知名网站做友情链接,wordpress 多色主题,建站系统哪个好,手机建行网站一. aac对数据规格要求 二、代码实现 1.初始化 2.填入数据 3.取数据 三.图解 一. aac对放入的采样数要求
我们知道aac每次接受的字节数是固定的#xff0c;在之前的文章里有介绍libfdk_aac音频采样数和编码字节数注意 它支持的采样数和编码字节数分别是#xff1a; fdk_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就是192060fps是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)