从0开始做播放器---音频播放有杂音且音调异常
时间:2022-07-22
本文章向大家介绍从0开始做播放器---音频播放有杂音且音调异常,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
我的播放器,音频像是电视信号不好,需要动一下天线,有那种沙沙声。 明确音频数据问题,在get音频数据处找问题。
- 音调不对,原因是我用的播放器只能播放 packed类型pcm数据,所以做了planar-->packed类型转换,将AV_SAMPLE_FMT_FLTP planar的样本格式转成AV_SAMPLE_FMT_S32 packed 类型的。
- 有杂音,原因是音频原样本格式是AV_SAMPLE_FMT_FLTP,float类型 32位,而我用的opensl播放,只支持int类型的样本,所以需要转换成32位的int类型 ,即AVSampleFormat::AV_SAMPLE_FMT_S32。
代码如下
int YaoAVFrame::getAudioPackedData(unsigned char * data){
//每个样本的字节数 * 每个声道的样本数 * 声道数
int bufferSize = getPerSampleSize() * getNBSamples() * getChannels();
if(data == nullptr){
return bufferSize;
}
// 判断是 Packed 还是 Plane
int isPanar = av_sample_fmt_is_planar((AVSampleFormat)imp->frame->format);
if(isPanar){
//EyerLog("Planarn");
SwrContext * swrCtx = swr_alloc_set_opts(
NULL,
imp->frame->channel_layout,
// av_get_packed_sample_fmt((AVSampleFormat)imp->frame->format),
AVSampleFormat::AV_SAMPLE_FMT_S32,
imp->frame->sample_rate,
imp->frame->channel_layout,
(AVSampleFormat)imp->frame->format,
imp->frame->sample_rate,
0,
NULL
);
swr_init(swrCtx);
int ret = swr_convert(swrCtx, &data, imp->frame->nb_samples, (const uint8_t **)imp->frame->data, imp->frame->nb_samples);
swr_free(&swrCtx);
}
else{
//EyerLog("Packedn");
memcpy(data, imp->frame->data[0], bufferSize);
}
return 0;
}
完整代码:https://github.com/yinhuiyao11/YaoPlayerAndroid.git
- 腾讯云容器微服务API设计实践
- CentOS 7安装Hadoop 3.0.0
- 揭秘ThreadLocal
- Java异常体系中的秘密
- 10分钟搞懂蚁群算法
- 手把手0基础项目实战(三)——教你开发一套电商平台的安全框架
- 遇见requestAnimationFrame
- 认识createDocumentFragment
- 点击穿透原理及解决
- 如何使用Intellij搭建Spark开发环境
- 如何重置Cloudera Manager的admin密码
- 如何在CDH集群安装Anaconda&搭建Python私有源
- 如何使用Python Impyla客户端连接Hive和Impala
- 如何在Windows Server2008搭建DNS服务并配置泛域名解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在美帝的服务器的prefetch和aspera下载比较
- 全面介绍eBPF-概念
- 在ubuntu20上面安装R4
- 冷饭新炒:理解Snowflake算法的实现原理
- Python基础之算数运算符
- 一文带你领略并发编程的内功心法
- HBase监控
- CVPR19-Deep Stacked Hierarchical Multi-patch Network for Image Deblurring
- HTTP缓存机制与Cookie
- 52. Vue使用watch监听网页的URL变化
- 如何设计一个秒杀系统
- SQL注入之dns回显注入
- 只要一行代码,实现五种 CSS 经典布局
- Flutter-引入第三方依赖包
- Hive操作——删除表(drop、truncate)