【ffmpeg学习记录】解决ffmpeg-tutorial的噪声问题

在使用ffmpeg 2.5.1编译ffmpeg-tutorial时遇到音频噪声问题,与ffplay对比,发现read_thread、decoder_decode_frame、audio_decode_frame三个函数在音频处理上的差异。关键区别在于audio_decode_frame在ffplay中仅做格式转换,而教程中可能包含了错误的解码操作。
摘要由CSDN通过智能技术生成

在ffmpeg 2.5.1版本下编译ffmpeg-tutorial,发现所有与音频相关的tutorial都有噪声,而ffplay却能完美播放。问度娘谷歌无果,只好看ffplay的代码。对ffplay.c代码结构不熟悉的可以戳这里点击打开链接

在ffplay.c中,有三个与audio有关的重要函数,分别是read_thread、decoder_decode_frame、audio_decode_frame。read_thread负责从文件或流中读取数据,decoder_decode_frame则把read_thread读取到的数据解码,audio_decode_frame从名字上看好像也是在做解码的工作,实际上在ffplay.c中它只是做了格式转换,解码的工作在decoder_decode_frame做了。

对比ffplay.c和tutorial05.c两个文件中处理音频的代码,从数据获取到解码,两者基本都是一致的,唯一的差别就在audio_decode_frame。其中有一行比较关键的代码

len2 = swr_convert(is->swr_ctx, out, out_count, in, is->audio_frame.nb_samples);
swr_convert这个函数应该是swresample中的,对音频进行重采样。既然我们找到了两份代码的不同点,只要把tutorial05.c中缺少的那部分补上去应该就没问题了。在这里只贴出audio_decode_frame函数的代码:
int audio_decode_frame(VideoState *is, double *pts_ptr) {
  int len1, data_size = 0, n, resampled_data_size;
  int64_t dec_channel_layout;
  int wanted_nb_samples;
  AVPacket *pkt = &is->audio_pkt;
  double pts;
  AVFrame *frame;

  for(;;) {
    while(is->audio_pkt_size > 0) {
      int got_frame;
      len1 = avcodec_decode_audio4(is->audio_st->codec, &is->audio_frame, &got_fram
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值