FFMpeg杂音问题解决方案
最近在调试网上下载的android ffmpeg播放器的源代码。因为编译ffmpeg过程中,觉得很麻烦,因此就没有继续编译SDL库了。打算在Java层使用Bitmap显示视频帧,在C层使用OpenSLES播放音频帧。
将网上的相关源代码整合到一块后,发现音视频解码,都没有错误。并且视频可以播放出来,但是声音声调不对,主要还有杂音。试了网上的一些方法也不行。最后自己尝试性地改了一个变量。杂音就消失了,但是声调还不对。
网上的解码音频数据包,然后将解码后的原始数据push到音频缓冲区的源代码中有以下几行代码
//音频数据解码
len = avcodec_decode_audio4(aCodecCtx, frame, &got_frame, &packet);
//得到解码音频数据的大小
data_size = av_samples_get_buffer_size( NULL, aCodecCtx->channels,
frame->nb_samples,aCodecCtx->sample_fmt, 1);
//将解码的音频数据push到音频缓冲区
memcpy(stream, (uint8_t*)(frame->data[0]), data_size]);
我将 memcpy(stream, (uint8_t*)(frame->data[0]), data_size]);
改为 memcpy(stream, (uint8_t*)(frame->data[0]), frame->linesize[0]); 后杂音就消失了。但是声音明显比正常的要快。
这个时候,感觉再去网上找方法也没什么用了。必须老老实实地理解AVFrame结构体中,各个字段的具体意思和PCM的相关知识点。
后来知道了杂音和声调不对的原因了。
杂音是因为avcodec_decode_audio4(aCodecCtx, frame, &got_frame, &packet)解码后的两个声道的音频数据分别存放在frame->data[0]和frame->data[1]中,而 frame->linesize[0]和 frame->linesize[1] 分别是前两者的大小。(我用来调试的视频文件,音频部分是双声道的)。而data_size表示的是两个声道的音频数据的总和。 因此memcpy(stream, (uint8_t*)(frame->data[0]), data_size])将一大段错误的数据push到缓冲区了。
声音明显比正常的要快的原因是,memcpy(stream, (uint8_t*)(frame->data[0]), frame->linesize[0])只是push了一个声道的音频数据,而创建OpenSLES的播放器是却设置成了双 声道。format_pcm.numChannels = aCodecCtx->channels(实际上为2)。两个通道播放一个通道的数据,自然变快了。为尽快播放出正常的声音,将播放器声道数设为1,此时听到了正常的音乐。
当然最正确的方法是正确地将编码后的音频数据,转换为正确的PCM格式。这样就可以双声道播放了。
小结一下:遇到不是程序本身存在的问题时。还需要从原理入手,学习相关的知识,这样才能够真正理解一段代码的工作流程和原理。
FFMpeg杂音问题解决方案相关推荐
- DELL(i7版本)麦克风杂音问题解决方案
DELL(i7版本)麦克风杂音问题解决方案 1.打开音量设置 2.打开空间立体混音
- 亲测!windows11耳机杂音问题解决方案!
首先排除不是耳机本事的问题! 1.打开声音设置. 2.进入当前耳机的属性设置中. 3.关闭增强音频选项,如之前就未打开,先打开后关闭即可.
- 利用ffmpeg下载m3u8视频
Windows下载ffmpeg:https://ffmpeg.zeranoe.com/builds/ 添加环境变量(省略操作步骤):在PATH中加入ffmpeg二进制目录路径(例如:D:\Progra ...
- 音视频开发必备基本基础知识(1)
最近收到了朋友邮寄过来的一本书,刚拿回来就趁机学习了一波音视频开发的知识.现就音视频开发的一些基本知识做一个总结.如下: 1.视频编码 通过特定的压缩技术,将视频格式文件转换成另一种视频格式文件的方法 ...
- 「抖直播」开发技术复盘
这篇文章记录一下开发「抖直播」软件时遇到的一些技术问题,已经分享一下开发「抖直播」使用到的技术,为了避免没有我朋友圈或没看前面几篇文章的朋友蒙圈,简单介绍一下「抖直播」,它是一款可以监控抖音直播间的软 ...
- Windows系统下使用Mingw编译并运行opencv教程
一.编译环境 系统:Windows10旗舰版 cmake版本下载:3.9.2 QtMingw版本下载:qt-opensource-windows-x86-5.11.0.exe,太大了只能放网盘 ope ...
- 计算机维修直播,电脑直播过程中出现杂声怎么办?三种解决方法任你选
现在,越来越多的人开始用电脑做直播.比如说利用直播来卖货或者分享个人的工作.生活状态.在电脑直播的时候,也会遇到各种各样的问题,其中,很多人就问到电脑直播有杂音滋滋响怎么办?电脑直播中发生杂音滋滋响, ...
- FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案
FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案 参考文章: (1)FFMPEG more samples than ...
- android 获取视频缩略图终极解决方案(ffmpeg)
android 获取视频缩略图终极解决方案(ffmpeg) 参考文章: (1)android 获取视频缩略图终极解决方案(ffmpeg) (2)https://www.cnblogs.com/juka ...
最新文章
- 【随笔】express中间件系统的基本实现
- 找工作java还是python有用_你觉得学 Python 还是 Java 更好找工作?
- 西伯利亚(Siberia)冷空气
- 前端开发的正确姿势——各种文件的目录结构规划及引用
- linux phpunit 安装,PHPUnit安装教程
- 计算机原理期中考试,计算机组成原理期中考试试题
- 14c语言合并两个字符串,C语言编程实现,将给定字符串中连续出现3次的小写字母替换为改小写字母在字母表中的下一个字母...
- python中返回上一步操作的代码_【代码学习】PYTHON字符串的常见操作
- 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!
- 考勤系统——代码分析datagrid
- MFC中CImageList的用法
- python 目标跟踪算法_目标跟踪入门——目标跟踪算法综述
- 安卓手机版php服务器地址,Almp——安卓系统上搭建本地php服务器环境
- Power BI 学习六:报表中视觉对象元素
- 互联网大厂面试考点————设计模式
- 手把手教你win10下安装Anaconda
- 【TypeScript】HTML直接引入TypeScript脚本
- U盘被写保护解决经历
- 看很多人要求目录树,我的代码可以满足大多数要求 作 者: flyxxxxx (灭神)
- 手动搭建webase(1)——节点前置服务
热门文章
- 019 函数:我的地盘听我的
- 条码软件如何制作SN开头的条形码
- UltraEdit 最新安装教程
- 跳槽怎么选择一家靠谱的公司​
- “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
- 一文了解27市5G建设最新进展与规划
- Ardunio开发实例-微型振动电机
- 高德地图根据点标记位置自动调整地图缩放级别
- 第12期《乘风破浪》2月刊
- 怎么用stata打开dta文件_用shell命令打开任意格式的文件