ffmpeg中音频解码方法(附代码)+ffmpeg音频解码播放速度快的问题(随手笔记,以供查阅)
最近在做一款取名为变速不变调播放器的时候,解码音频遇到了些问题(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音频解码播放速度快的问题(随手笔记,以供查阅)相关推荐
- 基于 FFMPEG 的音频编解码(二):音频解码
音频解码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在 Hell ...
- java实现生日提醒_asp实现的可以提醒生日的几种方法附代码
asp实现的可以提醒生日的几种方法附代码 更新时间:2008年06月20日 08:44:52 作者: asp提醒生日的原理一般就是把用户的出生日期和当前日期对比,如果少于几天则提醒显示,下面是几种 ...
- 基于 CoreAudio 的音频编解码(一):音频解码
系列文章目录 基于 CoreAudio 的音频编解码(一):音频解码 基于 CoreAudio 的音频编解码(二):音频编码 前言 Core Audio 是iOS和MAC系统中的关于数字音频处理的基础 ...
- 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述
<繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...
- 使用MediaCodec硬解码h.265视频及音频进行播放
h.265这个视频是很多播放器不支持的,就算是bilibili开源的ijkplayer也不能直接播放,需要自己去重新编译 才可以支持. 这里通过这个demo来演示一下如何硬解码视频,播放h.265视频 ...
- windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载
经过一晚上加一上午的奋斗,终于成功编译出了最新版的FFMPEG,下面是我编译的心得,因为是最新的,应该会对大家有用,编译的FFMPEG的版本是0.11.2,2012-09-19新发布的版本 平台:WI ...
- js encodeuricomponent php解码,Javascript下的urlencode编码解码方法附decodeURIComponent
而本文,就大概说说如何在js中通过系统自带的函数去解决这个问题. 关于在ASP(Server.UrlEncode).PHP(urlencode())函数编码结果,或是经过asp.php等动态语言直接写 ...
- Python06 向前Euler法、向后Euler法、梯形方法、改进的Euler方法以及四阶Runge_Kutta方法(附代码)
1. 实验结果 (1)解如下常微分方程: (2)分别使用向前 Euler 法.向后 Euler 法.梯形方法.改进的 Euler 方法以及 四阶 Runge_Kutta 方法,结果如下图所示: 由结果 ...
- kaggle点赞最多的 泰坦尼克号数据竞赛模型融合方法(附代码)
听说很多大佬都是从kaggle上获取的知识, 加工整理成一套属于自己的竞赛体系 今年7月份我开始参加大数据竞赛, 现在差不多有10场比赛了, 都是结构化比赛. 小的比赛还能进Top名次, 大点的比赛就 ...
- 深度学习篇之数据集划分方法-附代码python详细注释
在深度学习训练模型过程中,我们第一步就是要收集相应的数据集,之后我们就是要将数据划分为训练集train和验证集val,但是有时间我们时常面临数据量庞大的问题,手动划分显然是不现实的,因为太麻烦了,而且 ...
最新文章
- 知道这20个正则表达式,能让你少写1,000行代码
- android access 腾讯地图,Android 腾讯地图 选点定位,仿微信发送位置
- 面向对象开发===继承特点
- Android常用的开源框架
- qt5.10 for android 使用webview时qml 与html 中js的相互访问
- 清除Pycharm设置的方法
- 用MXNet实现mnist的生成对抗网络(GAN)
- HighCharts日期及数值格式化
- Swift - 环形进度条(UIActivityIndicatorView)的用法
- PHP 解决session 死锁
- 保存图片命令到指定路径_一招轻松合并文件——openall命令介绍
- 用计算机绘制工作表,《计算机操作基础Excel练习题答案.doc
- java合并果子_经典题-提高组2004年 合并果子
- 传奇GEE引擎版本架设
- 短网址还原 php,php怎么实现短网址还原
- STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
- HL6601高性价比多种快充协议芯片QC3.0QC2.0华为FCP,SCP.VOOV苹果三星快充协议
- 个人开发者的项目如何接入支付宝登录功能(保姆级教学)(Java的后台为例,其他语言类似)
- Aspose.PDF for Java 20.x
- DuerOS业绩亮眼,如何成为了百度财报新增长点?
热门文章
- 假期的生活,以及wifi和WLAN的区别
- 解决xp共享的批处理文件
- Android签名与校验过程详解
- 洛谷 P1014 [NOIP1999 普及组] Cantor 表 | OpenJudge NOI 2.1 8760:Cantor表
- 润乾报表的数据源配置
- 揭晓计算机的神秘面纱——计算机是如何工作的(一)
- 神经网络的三种训练方法,如何训练一个神经网络
- 腾讯QQ验证码识别dll,识别正确率95%+
- python使用scrapy爬取图片
- redis incr mysql_redis命令_INCR