如何将重采样的数据扔给编码器(AVAudioFifo)
来源:互联网 发布:mysql count语句 编辑:程序博客网 时间:2024/06/10 12:00
上一篇文件中写了一段重采样的测试代码,也提到过如何将resample的音频数据扔给编码器的方法,经过验证发现,该方法的确可行(我测试的音频为AAC格式,32bit,其它格式大家需要稍作改动)。
首先需创建AVAudioFifo *fifo并为它申请空间:
int FFmpegDecoder::InitAudioFifo(){ fifo = av_audio_fifo_alloc(AV_SAMPLE_FMT_FLTP, cp.ap.channel, 1); if(!fifo) { cout << "Could not allocate fifo" << endl; return -1; } return 0;}
这里仅为fifo申请了一个字节,因为后面会对fifo重新申请内存,所以此处的大小不用关心
创建好fifo后,resamples后的数据存到该fifo中,调用如下函数:
int FFmpegDecoder::FeedingSamples2Fifo(uint8_t **data, const int data_size){ int ret; ret = av_audio_fifo_realloc(fifo, av_audio_fifo_size(fifo) + data_size); if(ret < 0) { cout << "av_audio_fifo realloc failed" << endl; return ret; } if(av_audio_fifo_write(fifo, (void **)data, data_size) < data_size) { cout << "Could not write data to fifo" << endl; return AVERROR_EXIT; } return 0;}存储到fifo后,我们需要判断该fifo中是否有一帧数据,如果有,则从fifo中取出,也有可能fifo中含有多帧,所以从fifo中取出数据的时候,需要用到while循环。在取出fifo中的数据前,同样需要先申请一帧音频帧的空间:
AVFrame *FFmpegDecoder::AllocAudioFrame(){ AVFrame *frame = av_frame_alloc(); if(!frame) { cout << "Could not allocate frame" << endl; return NULL; } frame->nb_samples = 1024; frame->channels = cp.ap.channel; frame->channel_layout = av_get_default_channel_layout(cp.ap.channel); frame->format = AV_SAMPLE_FMT_FLTP; frame->sample_rate = cp.ap.samplerate; av_frame_get_buffer(frame, 0); return frame;}申请好空间后,需要开始从fifo中读取音频数据了
while(av_audio_fifo_size > 1024){ AVFrame *f = AllocAudioFrame(); av_audio_fifo_read(fifo,(void**)f->data,1024);}为什么是1024?这个是AAC的nb_samples长度,其它音频格式可能又不一样了,这方面的知识我就不介绍了,好了,代码至此,已经贴完了。
阅读全文
1 0
- 如何将重采样的数据扔给编码器(AVAudioFifo)
- 如何将重采样的数据扔给编码器(AVAudioFifo)
- 音频重采样(libavfilter)及AVAudioFifo的使用
- ffmpeg重采样resample包含AVAudioFifo(三)
- 时间序列(二)数据重采样
- ffmpeg解码音频数据时,进行重采样(即改变文件原有的采样率)
- ffmpeg解码音频数据时,进行重采样(即改变文件原有的采样率)
- ffmpeg解码音频数据时,开展重采样(即改变文件原有的采样率)
- ffmpeg解码音频数据时,进行重采样(即改变文件原有的采样率)
- 如何将一个对象赋值给指定类型的数据?
- 简单的音频重采样
- 音频重采样的实现
- SMOTE非平衡数据重采样方法
- 音频重采样的基本(我的学习笔记)
- 如何使用GDAL重采样图像
- 如何使用GDAL重采样图像 .
- 重采样
- 重采样
- git checkout 一个目录
- 数据结构二叉树遍历
- 01 WebGL 着色器编程语言GLSL ES概述
- "Abort command Issued" messages appear in /var/log/messages file
- 高性能计算(HPC)
- 如何将重采样的数据扔给编码器(AVAudioFifo)
- c# winform 中如何修改listbox的某项值,如何删除某项值。
- Kotlin初体验
- leetcode.561 Array Partition I
- Guid
- 关于JS中的eval()函数问题
- 汇编--学习笔记(十四)-高级汇编技术--宏
- Java Filter过滤XSS注入非法参数
- java web 前端页面的分页逻辑