最近在调试网上下载的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杂音问题解决方案相关推荐

  1. DELL(i7版本)麦克风杂音问题解决方案

    DELL(i7版本)麦克风杂音问题解决方案 1.打开音量设置 2.打开空间立体混音

  2. 亲测!windows11耳机杂音问题解决方案!

    首先排除不是耳机本事的问题! 1.打开声音设置. 2.进入当前耳机的属性设置中. 3.关闭增强音频选项,如之前就未打开,先打开后关闭即可.

  3. 利用ffmpeg下载m3u8视频

    Windows下载ffmpeg:https://ffmpeg.zeranoe.com/builds/ 添加环境变量(省略操作步骤):在PATH中加入ffmpeg二进制目录路径(例如:D:\Progra ...

  4. 音视频开发必备基本基础知识(1)

    最近收到了朋友邮寄过来的一本书,刚拿回来就趁机学习了一波音视频开发的知识.现就音视频开发的一些基本知识做一个总结.如下: 1.视频编码 通过特定的压缩技术,将视频格式文件转换成另一种视频格式文件的方法 ...

  5. 「抖直播」开发技术复盘

    这篇文章记录一下开发「抖直播」软件时遇到的一些技术问题,已经分享一下开发「抖直播」使用到的技术,为了避免没有我朋友圈或没看前面几篇文章的朋友蒙圈,简单介绍一下「抖直播」,它是一款可以监控抖音直播间的软 ...

  6. Windows系统下使用Mingw编译并运行opencv教程

    一.编译环境 系统:Windows10旗舰版 cmake版本下载:3.9.2 QtMingw版本下载:qt-opensource-windows-x86-5.11.0.exe,太大了只能放网盘 ope ...

  7. 计算机维修直播,电脑直播过程中出现杂声怎么办?三种解决方法任你选

    现在,越来越多的人开始用电脑做直播.比如说利用直播来卖货或者分享个人的工作.生活状态.在电脑直播的时候,也会遇到各种各样的问题,其中,很多人就问到电脑直播有杂音滋滋响怎么办?电脑直播中发生杂音滋滋响, ...

  8. FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案

    FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案 参考文章: (1)FFMPEG more samples than ...

  9. android 获取视频缩略图终极解决方案(ffmpeg)

    android 获取视频缩略图终极解决方案(ffmpeg) 参考文章: (1)android 获取视频缩略图终极解决方案(ffmpeg) (2)https://www.cnblogs.com/juka ...

最新文章

  1. 【随笔】express中间件系统的基本实现
  2. 找工作java还是python有用_你觉得学 Python 还是 Java 更好找工作?
  3. 西伯利亚(Siberia)冷空气
  4. 前端开发的正确姿势——各种文件的目录结构规划及引用
  5. linux phpunit 安装,PHPUnit安装教程
  6. 计算机原理期中考试,计算机组成原理期中考试试题
  7. 14c语言合并两个字符串,C语言编程实现,将给定字符串中连续出现3次的小写字母替换为改小写字母在字母表中的下一个字母...
  8. python中返回上一步操作的代码_【代码学习】PYTHON字符串的常见操作
  9. 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!
  10. 考勤系统——代码分析datagrid
  11. MFC中CImageList的用法
  12. python 目标跟踪算法_目标跟踪入门——目标跟踪算法综述
  13. 安卓手机版php服务器地址,Almp——安卓系统上搭建本地php服务器环境
  14. Power BI 学习六:报表中视觉对象元素
  15. 互联网大厂面试考点————设计模式
  16. 手把手教你win10下安装Anaconda
  17. 【TypeScript】HTML直接引入TypeScript脚本
  18. U盘被写保护解决经历
  19. 看很多人要求目录树,我的代码可以满足大多数要求 作  者: flyxxxxx (灭神)
  20. 手动搭建webase(1)——节点前置服务

热门文章

  1. 019 函数:我的地盘听我的
  2. 条码软件如何制作SN开头的条形码
  3. UltraEdit 最新安装教程
  4. 跳槽怎么选择一家靠谱的公司​
  5. “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
  6. 一文了解27市5G建设最新进展与规划
  7. Ardunio开发实例-微型振动电机
  8. 高德地图根据点标记位置自动调整地图缩放级别
  9. 第12期《乘风破浪》2月刊
  10. 怎么用stata打开dta文件_用shell命令打开任意格式的文件