关于雷霄骅博士的博客FFMPEG+SDL的音频播放器播放有杂音的问题

news/2024/7/10 19:05:35 标签: ffmpeg, 音视频, c++

博主在这里怀着对雷霄骅最高的敬意修复了雷神的一点点bug。
雷神的以下博客,在播放时会造成卡顿。

最简单的基于FFmpeg的音频播放器系列文章列表:
《最简单的基于FFMPEG+SDL的音频播放器》

————————————————
版权声明:本文为CSDN博主「雷霄骅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leixiaohua1020/article/details/10528443

简言之,就是雷霄骅博士的博客在播放的时候,会有杂音,杂音听起来像是兹拉兹拉的声音。
经过作者的多次实验,最终修复了雷神的一点小小的bug。
修复方法如下:

关于杂音的问题:
while(audio_len>0) SDL_Delay(1);
应该改为
while(audio_len>0) SDL_Delay(0.5);
这样就不会有兹啦啦的声音。有杂音的原因是 SDL_Delay(1);会让回调延迟1毫秒,导致播放延迟,就会感觉不连贯。把延迟缩短为SDL_Delay(0.5);这样不会导致播放延迟,就会感觉连贯了。SDL_Delay(0.5)并不是必须要是0.5ms,你也可以试试别的延迟时间。反正只要保证播放不延迟即可。
事实证明你把延迟改为SDL_Delay(0.9)都可以无杂音播放,但只要延迟SDL_Delay(1)>=1ms时,就会出现卡顿。
你可以用采样定理理解为什么必须要SDL_Delay()至少为0.9。那是因为
while(audio_len>0) SDL_Delay();
作为主线程的阻塞代码,在等待线程播放音频流的时候,如果SDL_Delay()的时间太长,就会导致在SDL_Delay()的期间,音频播放线程就已经播放结束了,导致卡顿,不连贯。所以你必须把SDL_Delay()的时间变短,应用采样定理,这样才可以让音频播放线程播放结束后,马上开启新的播放,无缝衔接,这样才不会卡顿。

附录奈奎斯特采样定理:

采样定理是E.T.Whittaker(1915)、Kotelnikov(1933)、Shannon(1948)提出的,在数字信号处理领域中,采样定理是连续时间信号(通常称为“模拟信号”)和离散时间信号(通常称为“数字信号”)之间的基本桥梁。该定理说明采样频率与信号频谱之间的关系,是连续信号离散化的基本依据。 它为采样率建立了一个足够的条件,该采样率允许离散采样序列从有限带宽的连续时间信号中捕获所有信息。
采样过程所应遵循的规律,又称取样定理、抽样定理。采样定理说明采样频率与信号频谱之间的关系,是连续信号离散化的基本依据。
在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>2fmax),采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的2.56~4倍;采样定理又称奈奎斯特定理。 [1]
如果对信号的其它约束是已知的,则当不满足采样率标准时,完美重建仍然是可能的。 在某些情况下(当不满足采样率标准时),利用附加的约束允许近似重建。 这些重建的保真度可以使用Bochner定理来验证和量化。 [2]
在这里插入图片描述
1924年奈奎斯特(Nyquist)推导出在理想低通信道的最高码元传输速率的公式。
1928年美国电信工程师H.奈奎斯特推出采样定理,因此称为奈奎斯特采样定理。
1933年由苏联工程师科捷利尼科夫首次用公式严格地表述这一定理,因此在苏联文献中称为科捷利尼科夫采样定理。
1948年信息论的创始人C.E.香农对这一定理加以明确地说明并正式作为定理引用,因此在许多文献中又称为香农采样定理。采样定理有许多表述形式,但最基本的表述方式是时域采样定理和频域采样定理。
采样定理在数字式遥测系统、时分制遥测系统、信息处理、数字通信和采样控制理论等领域得到广泛的应用。

奈奎斯特采样定理
以下为该篇博客的详情:
香农采样定理(奈奎斯特采样定理)
月疯
于 2022-03-31 12:02:50 发布
定义:为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。
在这里插入图片描述

香农采样定理,又称奈奎斯特采样定理,是信息论,特别是通讯与信号处理学科中的一个重要基本结论。采样是将一个信号(即时间或空间上的连续 函数)转换成一个数值序列(即时间或空间上的离散函数)。采样得到的离散信号经保持器后,得到的是阶梯信号,即具有零阶保持器的特性。如果信号是带限的,并且采样频率高于信号最高频率的一倍,那么,原来的连续信号可以从采样样本中完全重建出来。公式为:fs≥2fmax。采样率越高,稍后恢复的波形就越接近原信号,但是对系统的要求就更高,转换电路必须具有更快的转换速度。
在这里插入图片描述

分别是采样频率大于、等于和小于奈奎斯特采样的情况,小于的情况下直接出现了混叠。

在这里插入图片描述

网上找到图片

所以说:采样定理是连续信号和离散信号之间的桥梁。

举个例子:
在这里插入图片描述

采样定理的作用和意义:

   采样过程所应遵循的规律,又称取样定理、抽样定理。采样定理说明采样频率与信号频谱之间的关系,是连续信号离散化的基本依据。采样定理是1928年由美国电信工程师H.奈奎斯特首先提出来的,因此称为奈奎斯特采样定理。1933年由苏联工程师科捷利尼科夫首次用公式严格地表述这一定理,因此在苏联文献中称为科捷利尼科夫采样定理。1948年信息论的创始人C.E.香农对这一定理加以明确地说明并正式作为定理引用,因此在许多文献中又称为香农采样定理。采样定理有许多表述形式,但最基本的表述方式是时域采样定理和频域采样定理。

采样定理在数字式遥测系统、分时制遥测系统、信息处理、数字通信和采样控制理论等领域得到广泛的应用。
————————————————
版权声明:本文为CSDN博主「月疯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chehec2010/article/details/123865626

个人感想:
本文不想再这里参杂任何政治性的讨论。诚然,美国在上世纪开启了信息化革命,但是苏联的科学家们做出了更多贡献。
如果完全否定苏联科学家的贡献,那真的就是心胸狭隘。美国各界甚至包括影视界都在诋毁苏联,否定加加林。个人觉得这真的是一种心胸狭隘的表现。
事实证明,科学无国界是很难的。


http://www.niftyadmin.cn/n/1365065.html

相关文章

OPENCV BGRA四通道图像

本demo输入一张24位BGR真彩色图像,输出32位BGRA带透明通道的彩色图像。 在输出前,对Alpha透明通道做了些处理。源24位真彩色图像的左下角置为透明。 在运行中查看BGRA四通道图片时,是无法查看到透明通道的。 必须要把图片保存下来&#xff0c…

vc2010基于web对话框

还在因为使用VC2010自定义对话框,而使界面惨不忍睹吗?那就试试VC2010的新功能,基于对话框的HTML dialog吧! 1.建立HTML Dialog 2.让它支持javascript外部调用函数 //1.在OnInitDialog()中添加: EnableAutomation(); //…

霍夫曼编码与霍夫曼树

C语言编写。 stack.h #ifndef __STACK_H__ #define __STACK_H__ #include <stdio.h> #define MaxSize 50 #define FALSE 0 #define TRUE 1typedef struct stack {int top, maxstack;int element[MaxSize]; }Stack; void CreateStack(Stack* s, int m) {s->top -1;s…

adb命令行安装和卸载apk包到真机

前 注&#xff1a;如果不需要在设备上安装指定的包&#xff0c;eclipse直接运行启动相应的device即可。Why&#xff1a;在Pc机上借助adb&#xff0c;以命令行方式方便的进行安装和卸载apk包到设备&#xff08;尤其适用于安装卸载混淆过的apk包&#xff09;。How&#xff1a;  …

C语言动态内存分配与变长数组

闲来无事&#xff0c;读了读Stephen Prata的C Primer Plus&#xff0c; 在 “动态内存分配与变长数组” 作者的代码示例有点问题&#xff1a; C语言声明定长数组的数组长度必须是常量。 给出UP主修正的代码示例&#xff1a; #include<stdio.h> //#include <stdlib.h&…

将数据库导入SQL Server

将数据库导入SQL Server Lionden 2013年1月24日星期四 有时&#xff0c;我们会遇到导出&#xff0c;导入数据库的问题。有时候明明导出了数据库文件却无法导入另一台机器&#xff0c;感觉很费劲和费解。今天我介绍一种方法&#xff0c;我测试是可行的。 一、“导出”数据库文件…

C# Action<T>事件与Action<T>委托

C# 提供了一个Action委托&#xff0c;真的超级方便 下面是对应的案例可供参考&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net;namespace Action委托与Action事件 {class Program{static void Main(st…

3ds max 2012 VRay 2.0-效果图设计与制作-VRay景深模糊设置

腾龙视觉设计学院www.tlvi.net目前采用的是网络教学模式&#xff0c;邀请顶尖软件专家、依托权威出版社、携手YY教育频道打造最专业的免费网络课堂&#xff0c;让没有时间到实体学校学习的朋友们能够利用闲在的时间在网络上听课学习&#xff0c;提高自己的设计水平&#xff0c;…