如果文件在千千静听可以听的话。说明文件好的。那就是和你的声音设置有关。 比如立体声和5声道杜比环绕的声道输出就不一样,喇叭有前后,左右等。这样你插的喇叭不对口或声道不对自然没音了。 (这里特别提醒的是不一定是你声卡上的设置,也有你用的播放软件里面的声音设置。) 还有用功放和不用功放的直接喇叭和耳机都不一样的,
WAV文件作为最经典的Windows多媒体音频格式,应用非常广泛,使用三个参数来表示声音:采样位数、采样频率和声道数。Windows Media Player 和Winamp都可以播放。
WAV格式叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持。WAV格式支持许多压缩算法,支持多种音频位数、采样频率和声道。
扩展资料:
WAV是接近无损的音乐格式,标准格式化的WAV文件和CD格式一样,也是441K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几。
MP3文件通过对音频进行编码,去掉了某些部分,从而节省了空间。MP3利用精神声学的原理,研究人类如何感知声音。某些频率是人类耳朵无法感知的,因此MP3编码删除了这些频率以节省空间。
这种情况的原因可能有以下几种:
1、该WAV文件损坏,可以尝试换一个WAV文件播放试试;
2、系统WAV解码器文件损坏,这种情况可以将WINDOWS媒体播放器卸载然后重新下载安装;
3、播放WAV文件的设备的音量太小,无法听到,Windows声音播放往往是多线程多设备的,设置音量时可以针对应用程序或设备单独设置,具体设置方法如下:
在系统盒声音图标上点右键,如下图所示:
选择打开音量合成器,如下图所示:
看看是否是某个应用程序的音量被静音或是音量太小了。
如果你已经成功地了解了关于AudioTrack的一些话题,那么你可能享受它带来的好处,例如低延迟(在STATIC(静态)模式),能够生成流式音频(在STREAM(流)模式)以及在播放之前,就能够访问和修改原始声音数据。
不过,现在的问题是如何从源获取数据。许多应用需要使用的AudioTrack并不能简单的生成PCM音频(一个例子,比如Ethereal Dialpad或者其他类似的App)。你可能需要从文件源去加载数据,例如WAV或MP3文件。
不要期望使用MediaPlayer,去解码WAV文件和MP3音频。虽然MediaPlayer播放这些文件非常好,但是其播放逻辑完全在Native层,同时并没有为我们提供额外选项,允许我们使用其他解码器实现我们的目的。因此,我们必须从手动地从音频文件进行解码出PCM。
在这篇文章中,将会讨论WAV格式文件。而在下一课中,我们将会更进一步,讨论如何从MP3文件读取音频。
背景知识: 一些数字音频术语
如果你的App不是专门为数字音频设计,那么在继续我们的讨论之前,你可能需要先了解一些基本的缩略语。别担心,都很简单,我们不需要对此做深入挖掘。
PCM(脉冲调制方式) – 实现一个物理音频信号变成数字化最简单方法。基本原理就是信号变成了一个数字阵列,而其中每个数字代表的是声音在特定的时间瞬间的电平也可以说是能量(振幅)。(如果这种解释在科学上可能不会很准确,那我就只能说声抱歉了)。信不信由你,你可以使用这种方法表示任何复杂的声音,而且回放出来也非常精准。在这里,我们将只会谈到线性PCM。在线性PCM中,其中阵列中的每个数字都是原始声音振幅的线性表示。在某些情况下,对数映射能够更好地表示原来的声音幅度比例情况 – 但是我们不会讨论那些情况。
Sampling rate(采样率):- 每秒你的数字声音有多少样本(声音幅度用数字表示)。样本越多,你能得到声音质量越好。目前在消费类音频系统目前使用的采样率通常是22050,44100和48000Hz/s。
每个样品分辨率/采样大小/位 – 定义表示振幅数字的大小和格式。例如,如果您使用的是8位整数,你只能表达出256级的幅度,所以原来的物理波形将被简化为256个离散电平,与此同时,你将失去一些声音精度也可以说是质量。如果你使用16位,那么声音质量变得更好。事实上,大部分时间你可能会使用16位音频。其他选项包括24位,32位(这些都是Android现在不支持的),或是使用浮点数。
声道 – 既可以是单声道,也可以是立体声(2个声道),或者更多声道(但是Android不支持)。如果你想要有立体声,你需要有立体声音频,就必须要在每个声道都需要有一个独立的PCM数组,相应的信息量也会翻倍。
上述定义也有助于你理解特定的格式和长度的音频缓冲区的数据量,以便提前预备缓冲区。也就是你需要一个缓冲区,以用于存储5秒长度以44100Hz采样率的立体声16-bit线性PCM数据。数据计算公式如下所示:
5 sec 44100 samples per sec 2 bytes per sample 2 channels = 882,000 bytes
这一数额所需的内存可能会让初学者感到惊讶,因为当你往你的磁盘上存储的音频时,一个MP3文件,一个880KB的文件就可以容纳以相同的采样率和分辨率1分钟时长的音轨。这是为什么呢?因为先进的格式,比如MP3格式。因为我们大脑无法分辨识别出一些音频的内容,所以使用了很多复杂的方式在压缩的过程中去掉了这些内容。然而,大多数低等级的音频API,包括Android的AudioTrack只能接受线性PCM。这就是为什么如果我们不能把整个样品都放在内存中,我们需要将要处理的数据流,循环缓冲区和其他聪明的方式来使用音频API。
希望这样的解释并没有让你产生困惑,现在让我们继续来实际做一些与Android上的数字音频有关的工作吧!
WAV文件格式
我们的目标是用一个InputStream,由其从一个WAV文件加载PCM数据,来提供原始字节数据。然后我们就可以将原始的PCM数据直接推送到使用已经正确的配置好了的AudioTrackwrite,通过使用AudioTrackwrite()这个API。
WAV文件包含一个文件头和具体数据会。我们需要读取文件头以知道诸如采样速率,分辨率等信息。另外,我们通过文件头,也可以知道此格式是否支持。WAV可以封装成多种格式,我们无法全部支持。也许,只是合理的采样率,分辨率和通道的线性PCM格式。
WAV格式的细节在互联网上都可以找到,你仅仅需要在Google上搜索下。但是,遗憾的是,我并没有搜索到一个很好的Java库来读取WAV文件,而且可以移植到Android下。因此,我自己写了一些简单的代码。
下面这个方法就是如何读取一个WAV文件的头部:
private static final String RIFF_HEADER = "RIFF";
private static final String WAVE_HEADER = "WAVE";
private static final String FMT_HEADER = "fmt ";
private static final String DATA_HEADER = "data";
private static final int HEADER_SIZE = 44;
private static final String CHARSET = "ASCII";
/ /
public static WavInfo readHeader(InputStream wavStream) throws IOException,
DecoderException {
ByteBuffer buffer = ByteBufferallocate(HEADER_SIZE);
bufferorder(ByteOrderLITTLE_ENDIAN);
wavStreamread(bufferarray(), bufferarrayOffset(), buffercapacity());
bufferrewind();
bufferposition(bufferposition() + 20);
int format = buffergetShort();
checkFormat(format == 1, "Unsupported encoding: " + format); // 1 means
// Linear
// PCM
int channels = buffergetShort();
checkFormat(channels == 1 || channels == 2, "Unsupported channels: "
+ channels);
int rate = buffergetInt();
checkFormat(rate <= 48000 && rate >= 11025, "Unsupported rate: " + rate);
bufferposition(bufferposition() + 6);
int bits = buffergetShort();
checkFormat(bits == 16, "Unsupported bits: " + bits);
int dataSize = 0;
while (buffergetInt() != 0x61746164) { // "data" marker
Logd(TAG, "Skipping non-data chunk");
int size = buffergetInt();
wavStreamskip(size);
bufferrewind();
wavStreamread(bufferarray(), bufferarrayOffset(), 8);
bufferrewind();
}
dataSize = buffergetInt();
checkFormat(dataSize > 0, "wrong datasize: " + dataSize);
return new WavInfo(new FormatSpec(rate, channels == 2), dataSize);
}
上面的代码中,缺少的部分应该是显而易见的。正如你所看到的,仅仅支持16位,但在你可以修改代码以支持8位(AudioTrack不支持任何其他分辨率的)。
下面这个方法,则是用来读取文件剩余的部分 – 音频数据。
public static byte[] readWavPcm(WavInfo info, InputStream stream)
throws IOException {
byte[] data = new byte[infogetDataSize()];
streamread(data, 0, datalength);
return data;
}
我们读取的WavInfo结构体,包含采样率,分辨率和声道数已经足够让我们去播放我们读取的音频了。
如果我们不需要将全部音频数据一次性放入内存中,我们可以使用一个InputStream,一点一点地读取。
将PCM传入AudioTrack
我们现在面临2种情况,新建一个适合这种格式的AudioTrack,或者使用一个已存在的AudioTrack,但是可能和我们WAV音频数据的格式不一致。
在第一种情况,事情就很简单了,我们仅仅需要使用AudioTrack构造器构造一个我们已经从WAV头部对应的即可。
第二种情况,我们就需要将我们的音频变成AudioTrack需要的目标格式。我们需要做一下几种转换方式:
如果采样率不同,要么丢弃或复制一个样本以便和目标速率相匹配。如果分辨率是不同的,将源信号分辨率映射到目标分辨率,从16位到8位,反之亦然。如果信道不同,我们要么将立体声声道混合成一个单声道或重复单声道的数据把它变成准立体声。(请考虑将这些算法的实现放在Native层,因为Native层在做这类处理有很大的优势。)
在其他情况下,我们已经确定格式已经匹配。我们使用AudioTrackwrite()写入缓冲区,以便实现回放。
记住,如果你使用静态模式,你需要在play()之前,新建一个包含准确的缓冲区大小的AudioTrack ,同时写入write()音频数据。而在流模式下,我们可以先使用AudioTrack的play(),然后在使用write()写入数据部分
可以使用PlaySound()函数播放声音文件,
该函数原型位于#include <mmsystemh>中,
函数原型为: BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
参数pszSound是要播放声音的文件名,
只支持WAV等格式的文件
参数hmod是应用程序的实例句柄,一般传递NULL就可以;
参数fdwSound是标志的组合掩码,
可选值有SND_FILENAME、SND_ASYNC、SND_SYNC等。
SND_FILENAME表示pszSound参数指定的是文件名(pszSound还可以指定资源、内存音乐、系统音乐等等);
SND_ASYNC:用异步方式播放声音,PlaySound函数在开始播放后立即返回;
SND_SYNC:同步播放声音,在播放完后PlaySound函数才返回;
SND_LOOP一遍遍的重复播放声音,必须与SND_ASYNC标志一块使用。
2、使用举例
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP 启动wav"),NULL,SND_FILENAME|SND_SYNC);
WMA和WAV都是音频格式,这两种音频格式主要有以下不同。
1、音质不同。
WAV是无损音频格,WMA则不是,它是有损的。
2、保存的大小不同。
由于原因一,所以WAV文件大小相对也比较大。
WMA文件,文件大小相对较小。
3、文件组成不同。
WAV文件由文件头和数据体两大部分组成,其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。常见的WAV声音文件有两种,分别对应于单声道(11025KHz采样率、8Bit的采样值)和双声道(441KHz采样率、16Bit的采样值)。
WMA文件,它的头16个字节是固定的,为十六进制的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”, 用来标识这个是否为WMA文件。接下来的8个字节为一个整数,表示整个WMA文件头部的大小,这个头部里面包含了Tag信息等所有非音频信息,头部后面的是音频信息。
4、可编码设备不同。
WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。
WMA可以用于多种格式的编码文件中。应用程序可以使用Windows Media Format SDK进行WMA格式的编码和解码。一些常见的支持WMA的应用程序包括Windows Media Player、Windows Media Encoder、RealPlayer、Winamp等等。其它一些平台,例如Linux和移动设备中的软硬件也支持此格式。
扩展资料:
WAV音频格式的优点包括:
简单的编/解码(几乎直接存储来自模/数转换器(ADC)的信号)、普遍的认同/支持以及无损耗存储。WAV格式的主要缺点是需要音频存储空间。
对于小的存储限制或小带宽应用而言,这可能是一个重要的问题。WAV格式的另外一个潜在缺陷是在32位WAV文件中的2G限制,这种限制已在为SoundForge开发的W64格式中得到了改善。
WMA音频格式的优点包括:
WMA 7之后的WMA支持证书加密,未经许可(即未获得许可证书),即使是非法拷贝到本地,也是无法收听的。
同时,微软公司开始时宣称的:同文件比MP3体积小一倍而音质不变,也得到了兑现。
事实上,这个说法,仅仅适用于低比特率的情况,另外,微软公司在WMA 9大幅改进了其引擎,实际上几乎可以在同文件同音质下比MP3体积少1/3左右。
参考资料:
参考资料:
以上就是关于WAV音频格式的文件打不开怎么办全部的内容,包括:WAV音频格式的文件打不开怎么办、WAV格式音乐用什么播放器播放、Win7播放Wav格式文件无声音等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)