![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
音频
TopsLuo
朽木可雕
展开
-
ffmpeg如何为音频帧申请AVFrame
废话不多说,直接贴代码AVFrame* alloc_audio_frame(){ AVFrame *frame = av_frame_alloc(); if(frame == NULL) { av_log(NULL,AV_LOG_ERROR,"Allocate frame failed\n"); return NULL; }原创 2017-05-26 14:27:26 · 943 阅读 · 0 评论 -
简单的混音算法
在网上有很多关于混音的算法,但都是处理16bit的,而且是不带P的(左声道与右声道的数据是混在一起的),而我要做处理的是AAC格式混音,解码成PCM对应的是32bit,且左右声道是单独存储的,所以代签了一下他们的代码,整理如下:#include #include #include /************************************************For原创 2017-05-26 14:47:23 · 3482 阅读 · 0 评论 -
利用ffmpeg中的libswresample模块对音频进行重采样
在工作中,需要对音频进行重采样,比如说采样率为44.1kHz变为48kHz,通过研究ffmpeg中提供的例子,自己写了一段测试代码,贴出来供大家参考(当然,重采样还有另外一种方法,就是用ffmpeg中的libavfilter模块,后面我也会把该方法的代码贴出来)。测试代码仅测试过AAC格式,其它格式需要稍加改动(主要在fwrite的那一段,AAC解码出来的format为FLTP类型,如果不是该格式原创 2017-05-27 14:23:59 · 2231 阅读 · 0 评论 -
如何将重采样的数据扔给编码器(AVAudioFifo)
上一篇文件中写了一段重采样的测试代码,也提到过如何将resample的音频数据扔给编码器的方法,经过验证发现,该方法的确可行(我测试的音频为AAC格式,32bit,其它格式大家需要稍作改动)。首先需创建AVAudioFifo *fifo并为它申请空间:int FFmpegDecoder::InitAudioFifo(){ fifo = av_audio_fifo_alloc(AV原创 2017-05-27 14:55:06 · 1821 阅读 · 9 评论 -
音频重采样(libavfilter)及AVAudioFifo的使用
前面有提到过,ffmpeg音频重采样有多种方法,一种是libswresample,另外一种是libavfilter,前一种方法已经介绍过,现在介绍使用libavfilter的方法,并把filter处理后的数据写入AVAudioFifo中,再从fifo中读取一帧音频数据(因为经过filter重采样的数据长度会发生变化,可能比一帧长,也可能比一帧短,具体看是上采样还是下采样了)并存储到AVFrame结构原创 2017-05-27 16:39:43 · 2953 阅读 · 3 评论 -
aac转码后的数据无法直接播放
在使用ffmpeg对音频进行转码,发现从编码器里面出来的音频数据,存成的aac文件并不能用播放器(VLC)播放,goldwave也不行,原因:缺少包头信息,即ADTS头。具体这方面的资料大家可以问度娘。 编码出来的每一个AVPacket的数据,在写入到AAC文件前,都需要先写一个ADTS头(包含音频采样率信息,声道数信息,帧长度等),问题来了,如何构造一个正确的ADTS头?下面我就把简单的构造ad原创 2017-05-27 17:21:16 · 4057 阅读 · 0 评论 -
对format=fltp格式的PCM进行音量计算
在作音频合并的过程中,发现,如果合并的音频路数太多,合并的结果问题不能让人满意。根据实际情况分析,很多情况下有些音频数据并不需要合并,比如静音的情况,此时就需要实现音量大小的计算了。算法也是从网上找的,精髓一致,只不过音频数据的格式不一致。我参考的是这篇文章。下面是测试的算法实现,结果还可以吧(fltp的格式每个采样点占四个字节,所以算法中我把声道的数据转换成float)。static int pc原创 2017-08-17 12:01:09 · 1436 阅读 · 0 评论 -
精度丢失引发的错误--笔记
在处理音频及视频时间戳的过程中,发现音频pts跟正常的预期值偏差会随着时间越来越大(小于预期值),而视频的pts值跟预期值相等,最终导致声音与画面不同步。排查很久,最终找到问题所在,原因在于生成音频pts的过程中存在精度误差(计算pts的公式:packet_num * ((1000 * 1024) / 44100 )),下面用代码说话:#include <stdio.h>int main(){原创 2017-09-22 15:50:37 · 566 阅读 · 0 评论 -
利用ffmpeg构造静音帧
在项目中处理音频,有时候会出现音频源没数据,但又不能中断输入音频数据给编码器,否则很有可能就出现声音与画面不同步的严重问题。所以尝试了几种构造静音帧的方法,最终找到了ffmpeg上面,废话也不多话,直接上一段代码:AVFrame *alloc_silence_frame(int channels, int samplerate, int format){ AVFrame *frame...原创 2018-05-04 09:06:50 · 5237 阅读 · 5 评论