最近在做一款取名为变速不变调播放器的时候,解码音频遇到了些问题(ffmpeg音频解码播放速度快的问题),网络上的方法对绝大多数的音视频文件有效,但是对于某些音频会有问题,比如某些ADPCM编码的WAV音频文件。

直接贴音频解码部分的代码吧:

         int pkt_size = packet->size;for(;;)//解码,必须解码完,因为可能不止一帧数据。改变packet->data的指针{int got_picture=0;Lock.Lock();int ret = avcodec_decode_audio4(pCodecCtx_A, pFrame_A, &got_picture, packet);Lock.Unlock();if(ret<0)break;if(got_picture<=0)break;if(got_picture&&ret>=0)//这里是resample{  int bytes_per_sample=Getbytes_per_sample(out_sample_fmt);int in_samples_per_channel=pFrame_A->nb_samples;int out_samples_per_channel= av_rescale_rnd(128 +in_samples_per_channel , out_sample_rate, pFrame_A->sample_rate, AV_ROUND_UP);int size_per_sample_with_channels = out_channels*bytes_per_sample;int out_size = out_samples_per_channel*size_per_sample_with_channels;unsigned char *out[] = {(unsigned char*)audio_out_buffer};int converted_samplers_per_channel=swr_convert(audio_convert_ctx,out, out_samples_per_channel,(const uint8_t **)pFrame_A->extended_data , in_samples_per_channel);  if(converted_samplers_per_channel>0){fifo.push((BYTE*)audio_out_buffer,converted_samplers_per_channel*size_per_sample_with_channels);}}Lock.Lock();packet->data+=ret; //重要!!,必须改变输入数据的指针Lock.Unlock();pkt_size-=ret;if(pkt_size<=0)break;}

如上代码:需要注意的是,一般网上的代码只有int ret = avcodec_decode_audio4(pCodecCtx_A, pFrame_A, &got_picture, packet);然后调用swr_convert进行转换成输出的PCM格式,这样的方法对于ADPCM压缩的音频文件或其他某些文件不奏效,声音会出现断裂从而听上去像加速播放的效果。这种方法实际上是理想化了, int nRead=av_read_frame(pFormatCtx, packet)分离(demux)出来的音频帧有可能并不止1帧,所以解码那里必须有个死循环,通过int ret = avcodec_decode_audio4(pCodecCtx_A, pFrame_A, &got_picture, packet);解码的返回值判断解码了多少数据,然后改变解码数据的指针继续解码剩下的音频帧,直至解码完成!

记录下,以备后用,也希望能帮助到遇到同样问题的您!

ffmpeg中音频解码方法(附代码)+ffmpeg音频解码播放速度快的问题(随手笔记,以供查阅)相关推荐

  1. 基于 FFMPEG 的音频编解码(二):音频解码

    音频解码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在 Hell ...

  2. java实现生日提醒_asp实现的可以提醒生日的几种方法附代码

    asp实现的可以提醒生日的几种方法附代码 更新时间:2008年06月20日 08:44:52   作者: asp提醒生日的原理一般就是把用户的出生日期和当前日期对比,如果少于几天则提醒显示,下面是几种 ...

  3. 基于 CoreAudio 的音频编解码(一):音频解码

    系列文章目录 基于 CoreAudio 的音频编解码(一):音频解码 基于 CoreAudio 的音频编解码(二):音频编码 前言 Core Audio 是iOS和MAC系统中的关于数字音频处理的基础 ...

  4. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  5. 使用MediaCodec硬解码h.265视频及音频进行播放

    h.265这个视频是很多播放器不支持的,就算是bilibili开源的ijkplayer也不能直接播放,需要自己去重新编译 才可以支持. 这里通过这个demo来演示一下如何硬解码视频,播放h.265视频 ...

  6. windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载

    经过一晚上加一上午的奋斗,终于成功编译出了最新版的FFMPEG,下面是我编译的心得,因为是最新的,应该会对大家有用,编译的FFMPEG的版本是0.11.2,2012-09-19新发布的版本 平台:WI ...

  7. js encodeuricomponent php解码,Javascript下的urlencode编码解码方法附decodeURIComponent

    而本文,就大概说说如何在js中通过系统自带的函数去解决这个问题. 关于在ASP(Server.UrlEncode).PHP(urlencode())函数编码结果,或是经过asp.php等动态语言直接写 ...

  8. Python06 向前Euler法、向后Euler法、梯形方法、改进的Euler方法以及四阶Runge_Kutta方法(附代码)

    1. 实验结果 (1)解如下常微分方程: (2)分别使用向前 Euler 法.向后 Euler 法.梯形方法.改进的 Euler 方法以及 四阶 Runge_Kutta 方法,结果如下图所示: 由结果 ...

  9. kaggle点赞最多的 泰坦尼克号数据竞赛模型融合方法(附代码)

    听说很多大佬都是从kaggle上获取的知识, 加工整理成一套属于自己的竞赛体系 今年7月份我开始参加大数据竞赛, 现在差不多有10场比赛了, 都是结构化比赛. 小的比赛还能进Top名次, 大点的比赛就 ...

  10. 深度学习篇之数据集划分方法-附代码python详细注释

    在深度学习训练模型过程中,我们第一步就是要收集相应的数据集,之后我们就是要将数据划分为训练集train和验证集val,但是有时间我们时常面临数据量庞大的问题,手动划分显然是不现实的,因为太麻烦了,而且 ...

最新文章

  1. 知道这20个正则表达式,能让你少写1,000行代码
  2. android access 腾讯地图,Android 腾讯地图 选点定位,仿微信发送位置
  3. 面向对象开发===继承特点
  4. Android常用的开源框架
  5. qt5.10 for android 使用webview时qml 与html 中js的相互访问
  6. 清除Pycharm设置的方法
  7. 用MXNet实现mnist的生成对抗网络(GAN)
  8. HighCharts日期及数值格式化
  9. Swift - 环形进度条(UIActivityIndicatorView)的用法
  10. PHP 解决session 死锁
  11. 保存图片命令到指定路径_一招轻松合并文件——openall命令介绍
  12. 用计算机绘制工作表,《计算机操作基础Excel练习题答案.doc
  13. java合并果子_经典题-提高组2004年 合并果子
  14. 传奇GEE引擎版本架设
  15. 短网址还原 php,php怎么实现短网址还原
  16. STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
  17. HL6601高性价比多种快充协议芯片QC3.0QC2.0华为FCP,SCP.VOOV苹果三星快充协议
  18. 个人开发者的项目如何接入支付宝登录功能(保姆级教学)(Java的后台为例,其他语言类似)
  19. Aspose.PDF for Java 20.x
  20. DuerOS业绩亮眼,如何成为了百度财报新增长点?

热门文章

  1. 假期的生活,以及wifi和WLAN的区别
  2. 解决xp共享的批处理文件
  3. Android签名与校验过程详解
  4. 洛谷 P1014 [NOIP1999 普及组] Cantor 表 | OpenJudge NOI 2.1 8760:Cantor表
  5. 润乾报表的数据源配置
  6. 揭晓计算机的神秘面纱——计算机是如何工作的(一)
  7. 神经网络的三种训练方法,如何训练一个神经网络
  8. 腾讯QQ验证码识别dll,识别正确率95%+
  9. python使用scrapy爬取图片
  10. redis incr mysql_redis命令_INCR