精华内容
下载资源
问答
  • 考虑到Wav文件播放、文件合并、文件分隔、文件格式转换等都要求对文件内部结构要有所了解,NAudio是如何组织管理文件内容要清晰掌握,本篇将这两者对应关系做深入分析,下篇将基于此,实现音频分割功能。...

    考虑到Wav文件播放、文件合并、文件分隔、文件格式转换等都要求对文件内部结构要有所了解,对NAudio中是如何组织管理文件内容要清晰掌握,本篇将对这两者的对应关系做深入分析,下篇将基于此,实现音频分割功能。
    重要声明
    Wav文件结构描述主要参考以下作者的文章:
    wav文件格式分析与详解:https://www.cnblogs.com/ranson7zop/p/7657874.html
    WAV文件格式详解:https://www.jianshu.com/p/947528f3dff8
    对作者表示感谢。

    WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。WAV文件格式简称WAV格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,经过了多次修订,可用于Windows,Macintosh,Linix等多种操作系统,详述如下。

    波形文件的基础知识

    波形文件的存储过程

    声源发出的声波通过话筒被转换成连续变化的电信号,经过放大、抗混叠滤波后,按固定的频率进行采样,每个样本是在一个采样周期内检测到的电信号幅度值;接下来将其由模拟电信号量化为由二进制数表示的积分值;最后编码并存储为音频流数据。有的应用为了节省存储空间,存储前,还要对采样数据先进行压缩。

    与声音有关的三个参数

    1、采样频率

    又称取样频率。是单位时间内的采样次数,决定了数字化音频的质量。采样频率越高,数字化音频的质量越好,还原的波形越完整,播放的声音越真实,当然所占的资源也越多。根据奎特采样定理,要从采样中完全恢复原始信号的波形,采样频率要高于声音中最高频率的两倍。人耳可听到的声音的频率范围是在16Hz-20kHz之间。因此,要将听到的原声音真实地还原出来,采样频率必须大于4 0k H z 。常用的采样频率有8 k H z 、1 1 . 02 5 k H z 、22.05kHz、44.1kHz、48kHz等几种。22.05KHz相当于普通FM广播的音质,44.1KHz理论上可达到CD的音质。对于高于48KHz的采样频率人耳很难分辨,没有实际意义。

    2、采样位数

    也叫量化位数(单位:比特),是存储每个采样值所用的二进制位数。采样值反应了声音的波动状态。采样位数决定了量化精度。采样位数越长,量化的精度就越高,还原的波形曲线越真实,产生的量化噪声越小,回放的效果就越逼真。常用的量化位数有4、8、12、16、24。量化位数与声卡的位数和编码有关。如果采用PCM编码同时使用8 位声卡, 可将音频信号幅度从上限到下限化分成256个音量等级,取值范围为0-255;使用16位声卡,可将音频信号幅度划分成了64K个音量等级,取值范围为-32768至32767。

    3、声道数

    是使用的声音通道的个数,也是采样时所产生的声音波形的个数。播放声音时,单声道的WAV一般使用一个喇叭发声,立体声的WAV可以使两个喇叭发声。记录声音时,单声道,每次产生一个波形的数据,双声道,每次产生两个波形的数据,所占的存储空间增加一倍。

    WAV文件的编码

    编码包括了两方面内容,一是按一定格式存储数据,二是采用一定的算法压缩数据。WAV格式对音频流的编码没有硬性规定,支持非压缩的PCM(Puls Code Modulation)脉冲编码调制格式,还支持压缩型的微软自适应分脉冲编码调制Microsoft ADPCM(Adaptive Differential Puls Code Modulation)、国际电报联盟(International Telegraph Union)制定的语音压缩标准ITUG.711 a-law、ITU G.711-law、IMA ADPCM、ITU G.723 ADPCM (Yamaha)、GSM 6.10、ITU G.721 ADPCM编码和其它压缩算法。MP3编码同样也可以运用在WAV中,只要安装相应的Decode,就可以播放WAV中的MP3音乐。

    文件整体结构

    WAV文件遵循RIFF规则,其内容以区块(chunk)为最小单位进行存储。WAV文件一般由3个区块组成:RIFF chunk、Format chunk和Data chunk。另外,文件中还可能包含一些可选的区块,如:Fact chunk、Cue points chunk、Playlist chunk、Associated data list chunk等。
    本文将只介绍RIFF chunk、Format chunk和Data chunk。
    先用utraedit打开一个实际wav文件。

    00000000h: 52 49 46 46 A6 C0 00 00 57 41 56 45 66 6D 74 20 ; RIFF..WAVEfmt 
    00000010h: 10 00 00 00 01 00 01 00 80 3E 00 00 00 7D 00 00 ; ........€>...}..
    00000020h: 02 00 10 00 64 61 74 61 82 C0 00 00 DB FF DB FF ; ....data偫..??
    00000030h: DA FF DA FF D9 FF D8 FF D8 FF D7 FF D6 FF D5 FF ; ????????
    00000040h: D6 FF D4 FF D4 FF D3 FF D2 FF D2 FF D1 FF D0 FF ; ????????
    00000050h: CF FF CF FF CE FF CE FF CC FF CC FF CB FF CA FF ; ????????
    00000060h: C9 FF C8 FF C7 FF C6 FF C7 FF AD FF 9B FF 95 FF ; ????????
    00000070h: C5 FF F0 FF C8 FF 89 FF 95 FF B5 FF CA FF FA FF ; ????????
    00000080h: D7 FF 84 FF 8D FF 97 FF 98 FF D6 FF E6 FF 9F FF ; ????????
    

    在这里插入图片描述
    从上图可以看出来,典型的文件结构分为3个区块:RIFF区块、fmt区块和data区块。
    字节序说明
    上图左侧的单词endian意思是字节序、端序,表示字节的存储顺序。
    字节序分为两种:大端模式(big)和小端模式。

    • 大端模式,是指数据的低字节保存在内存的高地址中,而数据的高字节,保存在内存的低地址中;
    • 小端模式,是指数据的低字节保存在内存的低地址中,而数据的高字节保存在内存的高地址中。

    例如如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为

    内存 big-endian little-endian
    0x0000 0x12 0xcd
    0x0001 0x34 0xab
    0x0002 0xab 0x34
    0x0003 0xcd 0x12

    简单记忆就是小端方式字节和地址高低一致。

    RIFF区块

    名称 移地址 字节数 端序 内容 说明
    ID 0x00 4Byte 大端 ‘RIFF’ (0x52494646) 以’RIFF’为标识
    Size 0x04 4Byte 小端 fileSize - 8 是整个文件的长度减去ID和Size的长度
    Type 0x08 4Byte 大端 ‘WAVE’(0x57415645) WAVE表示后面需要两个子块:Format区块和Data区块

    fmt区块(FORMAT区块)

    名称 偏移地址 字节数 端序 内容 说明
    ID 0x00 4Byte 大端 'fmt ’ (0x666D7420) 以’fmt '为标识
    Size 0x04 4Byte 小端 16 表示该区块数据的长度(不包含ID和Size的长度)
    AudioFormat 0x08 2Byte 小端 音频格式 Data区块存储的音频数据的格式,PCM音频数据的值为1
    NumChannels 0x0A 2Byte 小端 声道数 音频数据的声道数,1:单声道,2:双声道
    SampleRate 0x0C 4Byte 小端 采样率 音频数据的采样率
    ByteRate 0x10 4Byte 小端 每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8
    BlockAlign 0x14 2Byte 小端 数据块对齐 每个采样所需的字节数 = NumChannels * BitsPerSample / 8
    BitsPerSample 0x16 2Byte 小端 采样位数 每个采样存储的bit数,8:8bit,16:16bit,32:32bit

    读者可以自己对照着上面的实际wav文件,看看这些参数分别是多少。

    DATA区块

    名称 偏移地址 字节数 端序 内容 说明
    ID 0x00 4Byte 大端 ‘data’ (0x64617461) 以’data’为标识
    Size 0x04 4Byte 小端 N 音频数据的长度,N = ByteRate * seconds
    Data 0x08 NByte 小端 音频数据

    下面解释一下PCM数据在WAV文件中的bit位排列方式

    PCM数据类型 采样1 采样2
    8Bit 单声道 声道0 声道0
    8Bit 双声道 声道0 声道1
    16Bit 单声道 声道0低位,声道0高位 声道0低位,声道0高位
    16Bit 双声道 声道0低位,声道0高位 声道1低位,声道1高位

    NAudio文件数据管理分析

    NAudio文件主要由AudioFileReader类来管理,最终的文件数据由WaveFileReader类来管理。

    AudioFileReader类

    AudioFileReader的继承关系如下图所示。
    在这里插入图片描述

    构造函数

    AudioFileReader只有一个构造函数,传入声音文件名。

            public AudioFileReader(string fileName)
            {
                lockObject = new object();
                FileName = fileName;
                CreateReaderStream(fileName);
    			//......
            }
    

    通过CreateReaderStream函数获得音频流。

    		private void CreateReaderStream(string fileName)
           {
               if (fileName.EndsWith(".wav", StringComparison.OrdinalIgnoreCase))
               {
                   readerStream = new WaveFileReader(fileName);
                   if (readerStream.WaveFormat.Encoding != WaveFormatEncoding.Pcm && readerStream.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat)
                   {
                       readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream);
                       readerStream = new BlockAlignReductionStream(readerStream);
                   }
               }
               else if (fileName.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase))
               {
                   readerStream = new Mp3FileReader(fileName);
               }
               else if (fileName.EndsWith(".aiff", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".aif", StringComparison.OrdinalIgnoreCase))
               {
                   readerStream = new AiffFileReader(fileName);
               }
               else
               {
                   // fall back to media foundation reader, see if that can play it
                   readerStream = new MediaFoundationReader(fileName);
               }
           }
    

    从以上代码可以看出来,AudioFileReader支持3种文件格式:wav、mp3和aiff。如果不是这3种扩展名,AudioFileReader会尝试按照标准的媒体格式尝试读取,使用IMFSourceReader接口实现此功能。
    从代码可以看出,对wav文件,得到的读数据流readerStream来自WaveFileReader对象。

    属性

    AudioFileReader有5个属性,如下表所示。

    属性名 数据类型 类型 功能
    FileName string R 声音文件名
    WaveFormat WaveFormat R 数据流的格式信息
    Length long R 数据流的数据区字节数(每个通道的每采样按4字节),
    Position long RW 数据流的位置
    Volume float RW 音量,0~1f

    几个属性的代码如下。

            public override WaveFormat WaveFormat => sampleChannel.WaveFormat;
            
            public float Volume
           {
               get { return sampleChannel.Volume; }
               set { sampleChannel.Volume = value; } 
           }
    

    可见这些属性的操作都是通过sampleChannel对象来执行,关于此对象下面详细分析。

    读数据

    AudioFileReader本质上只有一个对外方法Read,代码如下。

            public int Read(float[] buffer, int offset, int count)
           {
               lock (lockObject)
               {
                   return sampleChannel.Read(buffer, offset, count);
               }
           }
    

    NAudio用法详解(6)播放过程流程分析 中可知,waveOutEvent最终调用了AudioFileReader.Read方法实现读取数据,而这个Read最终来自SampleCannel.Read方法,因此后面详细分析SampleCannel
    下图为WaveOutEvent调用的WaveOutBuffer对象的OnDone方法。
    在这里插入图片描述
    下面首先介绍WaveFileRead类,然后再详细介绍SampleChannel

    WaveFileReader类

    WaveFileReader类主要实现两大功能,读取声音文件,获得音频格式;读取任意位置音频数据,并可以任意调整当前数据位置。

    构造函数

            public WaveFileReader(String waveFile) :
                this(File.OpenRead(waveFile), true)
            {            
            }
    

    构造函数传入文件名,然后使用File.OpenRead函数得到stream,再执行下面的构造函数。

            public WaveFileReader(Stream inputStream) :
               this(inputStream, false)
            {
            }
    

    最终执行的构造函数如下。

            private WaveFileReader(Stream inputStream, bool ownInput)
            {
                this.waveStream = inputStream;
                var chunkReader = new WaveFileChunkReader();
                try
                {
                    chunkReader.ReadWaveHeader(inputStream);
                    waveFormat = chunkReader.WaveFormat;
                    dataPosition = chunkReader.DataChunkPosition;
                    dataChunkLength = chunkReader.DataChunkLength;
                    ExtraChunks = chunkReader.RiffChunks;
                }
                catch
                {
                    if (ownInput)
                    {
                        inputStream.Dispose();
                    }
    
                    throw;
                }
    
                Position = 0;
                this.ownInput = ownInput;
            }
    

    在这个构造函数冲,WaveFileChunkReader类管理文件流的头部信息,整合成WaveFormat对象,管理数据区块的位置、长度等等信息。WaveFileReader保存waveFormat(文件格式信息)、dataPosition(数据区块在文件中的位置)、dataChunkLength(数据区块的长度)。

    读取数据

    读取数据使用实现的Read函数。

            public override int Read(byte[] array, int offset, int count)
            {
                if (count % waveFormat.BlockAlign != 0)
                {
                    throw new ArgumentException(
                        $"Must read complete blocks: requested {count}, block align is {WaveFormat.BlockAlign}");
                }
                lock (lockObject)
                {
                    // sometimes there is more junk at the end of the file past the data chunk
                    if (Position + count > dataChunkLength)
                    {
                        count = (int) (dataChunkLength - Position);
                    }
                    return waveStream.Read(array, offset, count);
                }
            }
    

    本质上是调用了fileStream.Read函数而已。

    SampleChannel类

    SampleChannel类翻译为采集通道,一个声音文件由文件描述信息(RIFF区块和fmt区块)和数据信息(数据区块)组成,而声音又分为单通道、双通道及多通道。本类就是管理通道数据。
    SampleChannel类主要实现3大功能。

    • 输入为IWaveProvider类型,转换为ISampleProvider类型,并对外暴露出来。
    • 音量调节
    • 在读数据过程中,通过MeteringSampleProvider对象,周期性的生成事件,报告最大音量信息。

    构造函数

    构造函数实现了3个功能。

    • 将输入为IWaveProvider类型,转换为ISampleProvider类型;
    • 按需要将单声道转换为双声道;
    • 初始化两个对象MeteringSampleProvider、和VolumeSampleProvider
            public SampleChannel(IWaveProvider waveProvider, bool forceStereo)
            {
                ISampleProvider sampleProvider = SampleProviderConverters.ConvertWaveProviderIntoSampleProvider(waveProvider);
                if (sampleProvider.WaveFormat.Channels == 1 && forceStereo)
                {
                    sampleProvider = new MonoToStereoSampleProvider(sampleProvider);
                }
                waveFormat = sampleProvider.WaveFormat;
                // let's put the meter before the volume (useful for drawing waveforms)
                preVolumeMeter = new MeteringSampleProvider(sampleProvider);
                volumeProvider = new VolumeSampleProvider(preVolumeMeter);
            }
    

    读数据

    上节分析过,waveOutEvent最终调用了AudioFileReader.Read方法实现读取数据,而这个Read()方法调用了SampleCannel.Read方法,下面是这个方法的代码。

            public int Read(float[] buffer, int offset, int sampleCount)
            {
                return volumeProvider.Read(buffer, offset, sampleCount);
            }
    

    哈哈,令人失望的是,这个Read也不是最终的Read,而是调用了VolumeSampleProvider对象的Read方法。关于VolumeSampleProvider,本篇不会全面分析,只分析关键的Read方法。

    		//VolumeSampleProvider.Read
            public int Read(float[] buffer, int offset, int sampleCount)
            {
                int samplesRead = source.Read(buffer, offset, sampleCount);
                if (Volume != 1f)
                {
                    for (int n = 0; n < sampleCount; n++)
                    {
                        buffer[offset + n] *= Volume;
                    }
                }
                return samplesRead;
            }
    

    从代码可以看出VolumeSampleProvider.Read内部又调用的source.Read,而这个Source从SampleChannel构造函数中可以看出来。

                preVolumeMeter = new MeteringSampleProvider(sampleProvider);
                volumeProvider = new VolumeSampleProvider(preVolumeMeter);
    

    即,source为preVolumeMeter,那么相当于调用了preVolumeMeter.Read,再看MeteringSampleProvider.Read,代码如下。

    		//MeteringSampleProvider
            public int Read(float[] buffer, int offset, int count)
            {
                int samplesRead = source.Read(buffer, offset, count);
    

    天哪,又是个source.Read,这个source是sampleProvider。从SampleChannel构造函数中可以看出,这个sampleProvider对象为实现了ISampleProvider接口的某个实际类的对象。

                ISampleProvider sampleProvider = SampleProviderConverters.ConvertWaveProviderIntoSampleProvider(waveProvider);
    

    继续追这个ConvertWaveProviderIntoSampleProvider函数,可以发现,最终的Read由waveProvider来实现,而这个waveProvider其实就是WaveFileReader对象

    public static ISampleProvider ConvertWaveProviderIntoSampleProvider(IWaveProvider waveProvider)
            {
                ISampleProvider sampleProvider;
                if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.Pcm)
                {
                    // go to float
                    if (waveProvider.WaveFormat.BitsPerSample == 8)
                    {
                        sampleProvider = new Pcm8BitToSampleProvider(waveProvider);
                    }
                    else if (waveProvider.WaveFormat.BitsPerSample == 16)
                    {
                        sampleProvider = new Pcm16BitToSampleProvider(waveProvider);
                    }
                    else if (waveProvider.WaveFormat.BitsPerSample == 24)
                    {
                        sampleProvider = new Pcm24BitToSampleProvider(waveProvider);
                    }
                    else if (waveProvider.WaveFormat.BitsPerSample == 32)
                    {
                        sampleProvider = new Pcm32BitToSampleProvider(waveProvider);
                    }
                    else
                    {
                        throw new InvalidOperationException("Unsupported bit depth");
                    }
                }
                else if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat)
                {
                    if (waveProvider.WaveFormat.BitsPerSample == 64)
                        sampleProvider = new WaveToSampleProvider64(waveProvider);
                    else
                        sampleProvider = new WaveToSampleProvider(waveProvider);
                }
                else
                {
                    throw new ArgumentException("Unsupported source encoding");
                }
                return sampleProvider;
            }
    

    读数据的路线

    WaveOutEvent类的Read方法路线如下(省略Read()方法)。
    AudioFileReader→SampleChanel→VolumeSampleProvider→MeteringSampleProvider→WaveFileReader

    音量调节原理

    调节音量是通过VolumeSampleProvider对象的Volume属性。

            public float Volume
            {
                get { return volumeProvider.Volume; }
                set { volumeProvider.Volume = value; }
            }
    

    VolumeSampleProvider类的读方法中,对获得的数据的值,直接乘以音量属性即可,是不是很简单!。

    //VolumeSampleProvider
            public int Read(float[] buffer, int offset, int sampleCount)
            {
                int samplesRead = source.Read(buffer, offset, sampleCount);
                if (Volume != 1f)
                {
                    for (int n = 0; n < sampleCount; n++)
                    {
                       buffer[offset + n] *= Volume;
                    }
                }
                return samplesRead;
            }
    
    展开全文
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类服务提供者抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...
  • 11、以下对视频设备的描述中...视频压缩卡用于压缩视频信息答案:B2、以下对视频格式文件的描述中,不正确的是______。A.avi 格式可以将视频和音频交织在一起进行同步播放B.avi 格式的优点是图像质量好C.avi 格式可...
    1

    1、以下对视频设备的描述中,不正确的是______。

    A.视频采集卡用于采集视频数据

    B.音频卡用于对摄像头或者摄像机等信号进行捕捉﹑并以MPEG格式存储在硬盘上

    C.电视卡用于在PC机上看电视

    D.视频压缩卡用于压缩视频信息

    答案:B

    2、以下对视频格式文件的描述中,不正确的是______。

    A.avi 格式可以将视频和音频交织在一起进行同步播放

    B.avi 格式的优点是图像质量好

    C.avi 格式可以跨多个平台使用,其缺点是体积过于庞大

    D.avi 格式可以将视频和音频交织在一起进行同步播放,而且体积非常小

    答案:D

    3、在声音文件中,具有较好的压缩效果并且保持较好的音质的是______。

    A.WAV文件

    B.MP3文件

    C.MIDI文件

    D.AU文件

    答案:B

    4、mpeg﹑mpg 或 dat 格式是运动图像专家组(MPEG)格式,采用这种格式的家用设备不包括______。

    A.DVD

    B.收音机

    C.VCD

    D.SVCD

    答案:B

    5、以下是关于使用触摸屏的说法,其中正确的是______。

    A.用手指操作直观﹑方便

    B.操作简单,无须学习

    C.交互性好,简化了人机接口

    D.以上都是

    答案:D

    6、要使用Windows自带附件中的“录音机”进行录音,计算机必须安装______。

    A.麦克风

    B.耳机

    C.软驱

    D.CD-ROM

    答案:A

    7、下列选项中,不属于音频播放软件的是______。

    A.Windows Media Player

    B.GoldWave

    C.QuickTime

    D.ACDsee

    答案:D

    8、计算机硬件中声卡的作用是:______。

    A.压缩

    B.显示

    C.图形转换

    D.数模﹑模数转换

    答案:D

    9、要使用Windows自带附件中的“录音机”进行录音,计算机必须安装______。

    A.麦克风

    B.耳机

    C.软驱

    D.CD-ROM

    答案:A

    10、多媒体技术能处理的对象包括字符﹑数值﹑声音和______。

    A.光盘数据

    B.电压数据

    C.图像数据

    D.电流数据

    答案:C

    11、下列不属于多媒体范畴的是______。

    A.交互式视频游戏

    B.交互式多媒体教学

    C.有声图书

    D.普通电视

    答案:D

    12、以下应用领域中,属于典型的多媒体应用的是______。

    A.网络远端控制

    B.视频会议系统

    C.电子表格处理

    D.CSCW计算机支持协同工作

    答案:B

    13、视频设备不包括______。

    A.视频监控卡

    B.数字调音台

    C.DV卡、视频压缩卡、电视卡

    D.视频采集卡

    答案:B

    14、音频设备是音频输入输出设备的总称,包括很多种类型的产品,但不包括______。

    A.中高频音箱、音箱音频采样卡

    B.多媒体控制台、数字调音台

    C.打印机、激光扫描仪

    D.功放机、话筒、PC中的声卡、合成器、耳机

    答案:C

    15、现代多媒体技术使得远程教学的传输过程______。

    A.职业化

    B.平民化

    C.快速化

    D.网络化

    答案:D

    16、下列关于多媒体技术的集成特性的说法中,正确是______。

    A.指多种媒体综合使用的特性

    B.指仅限于视频、图形二种媒体各自使用的特性

    C.指仅限于声、光媒体各自使用的特性

    D.指动画单一媒体使用的特性

    答案:A

    17、对以下Windows自带的一个附件“录音机”设备功能描述正确的是______。

    A.录下的声音被保存为压缩(.ra)文件

    B.录下的声音被保存为音频压缩(.rpm)文件

    C.录下的声音被保存为压缩(.ram )文件

    D.录下的声音被保存为音频(.wma)文件

    答案:D

    9e1d949e2228c2468c8bd949eee5780c.png61c0138e0d143aef9cbabafeb1194817.png
    展开全文
  • Java 1.6 API 中文 New

    2013-10-26 14:08:22
    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类服务提供者抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。...
  • JavaAPI中文chm文档 part2

    2011-08-19 08:58:42
    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类服务提供者抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...
  • JavaAPI1.6中文chm文档 part1

    热门讨论 2011-08-19 08:33:34
    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类服务提供者抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...
  • 音视频基础

    2020-08-19 11:51:50
    概述 视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。...这些信令数据包括播放的控制(播放,暂停,停止),或者网络状态的描述等。解协议的过程

    概述

    视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示:
    在这里插入图片描述

    解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。

    解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。

    解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

    视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

    在这里插入图片描述

    流媒体协议

    在这里插入图片描述

    封装格式

    在这里插入图片描述

    视频编码

    在这里插入图片描述

    音频编码

    在这里插入图片描述

    现有网络视音频平台对比

    直播参数对比

    在这里插入图片描述

    点播参数对比

    在这里插入图片描述

    展开全文
  • 音视频编码_笔记

    2016-03-20 22:36:29
    1、视频播放器原理 视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频...流媒体传输数据包含指令数据,如暂停、播放、停止等,或者网络状态的描述。解协议的过程会去除掉

    1、视频播放器原理

    视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。


    解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。流媒体传输数据中包含指令数据,如暂停、播放、停止等,或者对网络状态的描述。解协议的过程中会去除掉信令数据而只保留视音频数据

    解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。

    解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

    视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。


    2、流媒体协议

    主要流媒体协议一览

    名称

    推出机构

    传输层协议

    客户端

    目前使用领域

    RTSP+RTP

    IETF

    TCP+UDP

    VLC, WMP

    IPTV

    RTMP

    Adobe Inc.

    TCP

    Flash

    互联网直播

    RTMFP

    Adobe Inc.

    UDP

    Flash

    互联网直播

    MMS

    Microsoft Inc.

    TCP/UDP

    WMP

    互联网直播+点播

    HTTP

    WWW+IETF

    TCP

    Flash

    互联网点播


    3、封装格式

    封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中

    主要封装格式一览

    名称

    推出机构

    流媒体

    支持的视频编码

    支持的音频编码

    目前使用领域

    AVI

    Microsoft Inc.

    不支持

    几乎所有格式

    几乎所有格式

    BT下载影视

    MP4

    MPEG

    支持

    MPEG-2, MPEG-4, H.264, H.263等

    AAC, MPEG-1 Layers I, II, III, AC-3等

    互联网视频网站

    TS

    MPEG

    支持

    MPEG-1, MPEG-2, MPEG-4, H.264

    MPEG-1 Layers I, II, III, AAC,

    IPTV,数字电视

    FLV

    Adobe Inc.

    支持

    Sorenson, VP6, H.264

    MP3, ADPCM, Linear PCM, AAC等

    互联网视频网站

    MKV

    CoreCodec Inc.

    支持

    几乎所有格式

    几乎所有格式

    互联网视频网站

    RMVB

    Real Networks Inc.

    支持

    RealVideo 8, 9, 10

    AAC, Cook Codec, RealAudio Lossless

    BT下载影视



    4、视频编码

    主要视频编码一览

    名称

    推出机构

    推出时间

    目前使用领域

    HEVC(H.265)

    MPEG/ITU-T

    2013

    研发中

    H.264

    MPEG/ITU-T

    2003

    各个领域

    MPEG4

    MPEG

    2001

    不温不火

    MPEG2

    MPEG

    1994

    数字电视

    VP9

    Google

    2013

    研发中

    VP8

    Google

    2008

    不普及

    VC-1

    Microsoft Inc.

    2006

    微软平台


    5、音频编码

    主要音频编码一览

    名称

    推出机构

    推出时间

    目前使用领域

    AAC

    MPEG

    1997

    各个领域(新)

    AC-3

    Dolby Inc.

    1992

    电影

    MP3

    MPEG

    1993

    各个领域(旧)

    WMA

    Microsoft Inc.

    1999

    微软平台



    6、直播/点播平台

    直播平台参数对比

    现有网络视音频平台参数对比

    名称

    协议

    封装

    视频编码

    音频编码

    播放器

    CNTV

    私有

    华数TV

    RTMP

    FLV

    H.264

    AAC

    Flash

    六间房

    RTMP

    FLV

    H.264

    AAC

    Flash

    中国教育电视台

    RTMP

    FLV

    H.264

    AAC

    Flash

    北广传媒移动电视

    RTMP

    FLV

    H.264

    AAC

    Flash

    上海IPTV

    RTSP+RTP

    TS

    H.264

    MP2

    机顶盒


    直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式。

    采用RTMP作为直播协议的好处在于其被Flash播放器支持。而Flash播放器如今已经安装在全球99%的电脑上,并且与浏览器结合的很好。因此这种流媒体直播平台可以实现“无插件直播”,极大的简化了客户端的操作。

    FLV是RTMP使用的封装格式,H.264是当今实际应用中编码效率最高的视频编码标准,AAC则是当今实际应用中编码效率最高的音频编码标准。视频播放器方面,都使用了Flash播放器。


     点播平台参数对比

    现有互联网视音频平台参数对比

    名称

    协议

    封装

    视频编码

    音频编码

    播放器

    CNTV

    HTTP

    MP4

    H.264

    AAC

    Flash

    CNTV(部分)

    RTMP

    FLV

    H.264

    AAC

    Flash

    华数TV

    HTTP

    MP4

    H.264

    AAC

    Flash

    优酷网

    HTTP

    FLV

    H.264

    AAC

    Flash

    土豆网

    HTTP

    F4V

    H.264

    AAC

    Flash

    56网

    HTTP

    FLV

    H.264

    AAC

    Flash

    音悦台

    HTTP

    MP4

    H.264

    AAC

    Flash

    乐视网

    HTTP

    FLV

    H.264

    AAC

    Flash

    新浪视频

    HTTP

    FLV

    H.264

    AAC

    Flash


    点播服务普遍采用了HTTP作为流媒体协议,H.264作为视频编码格式,AAC作为音频编码格式。

    采用HTTP作为点播协议有以下两点优势:一方面,HTTP是基于TCP协议的应用层协议,媒体传输过程中不会出现丢包等现象,从而保证了视频的质量;另一方面,HTTP被绝大部分的Web服务器支持,因而流媒体服务机构不必投资购买额外的流媒体服务器,从而节约了开支。



    参考文章:

    http://blog.csdn.net/leixiaohua1020/article/details/18893769




    展开全文
  • Axx:ARJ压缩文件的分包序号文件,用于将一个大文件压至几个小的压缩包(xx取01-99的数字) A3L:Authorware 3.x库文件 A4L:Authorware 4.x库文件 A5L:Authorware 5.x库文件 A3M,A4M:Authorware Macintosh...
  • Egret 童话 与 现实

    2021-01-03 14:33:25
    在FlashIDE里导出动画描述文件(json格式)可以被这类仿Flash引擎直接使用。但是懂技术都懂,这根本不需要模仿Flash,这只和json解析方式有关。 而从集Flash和HTML5技术之大成...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    -p,--preserve-timestamps:以<来源>文件的访问/修改时间作为相应的目的地文件的时间属性。 -s,--strip:用strip命令删除symbol table,只适用于第一及第二种使用格式。 -S,--suffix=后缀:自行指定...
  • 除此以外,系统还可以不同分类栏目,不同分站设置不同标题、关健词、描述进行了优化,专为搜索引擎优化(SEO)开发了功能模块。 多级用户权限与内容管理支持 后台管理员可以给不同用户分配不同管理权限,...
  • 计算机以MID为扩展名的文件称为MIDI文件,其中存放MIDI设备命令,即每个音符频率、音量、通道号等指示信息。最后播出声音是由MIDI设备根据这些信息产生。 MIDI声音可以用于配音,它缺点是回放...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    支持音频格式: MP3 、 AAC 、 AAC+ 、 W MA 、 MPEG4 、 WAV 、 MIDI 、 REAL 、 AUDIO 和 OGG ;支持墙纸格式: JPG 、 BMP 、 PNG 和 GIF ;铃声 (MP3 、 AAC 、 AAC+ 和 WMA) 。 接入技术 蓝牙 (class 1) ;四频...
  • 多媒体教室

    2013-06-14 08:10:31
    选择要提交的文件后,任务栏将会出现您要提交的文件。 单击第二个按钮,则供您选择将是文件夹。 单击第四个按钮,则您选择的文件或文件夹将会被提交到教师机设定目录下。 提交完成之后教师机可以右击屏幕右下...
  •  (9)在“高级音频属性”对话框选择“性能”选项卡,这里提供了音 频播放及其硬件加速和采样率转换质量调节功能。要说明是,并不是所 有选项都是越高越好,你需要根据自己硬件情况进行设定,较好...
  • java api最新7.0

    千次下载 热门讨论 2013-10-26 17:34:06
    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类服务提供者抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。...
  • 通过输入处理得到每一帧人脸位置信息输出到json文件中,并且截取人脸位置照片。 人脸特写照片:用于third step 训练人脸转换GAN模型。 Json文件:用于fourth step 人脸转换,只标记区域进行转换,我们只...
  • 操作系统Ximu以及TCP/IP协议实现在他书中都有介绍,并且应用到了商业产品。 译者: 蒋慧 蒋慧,女,1973年2月出生。1995年毕业于南京通信工程学院计算机系,获计算机应用专业工学学土学位。1998年于南京...
  • 注意:千万不要到第二个文本框选择文件路径,下面是升级uboot文件的,一旦上传上传错误文件,会导致随身看变砖。 随身看固件T50稳定版本更新! 7、 升级过程,不要开关随身看盒子,等待盒子升级完成,电脑会...
  • javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类服务提供者抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。...
  • JDK_1_6 API

    2017-03-04 23:06:21
    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类服务提供者抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...
  • [Java参考文档]

    2013-03-19 16:56:15
    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类服务提供者抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...
  •  本书详细描述以下4种不同IPC形式:  (1) 消息传递(管道、FIFO和消息队列);  (2) 同步(互斥量、条件变量、读写锁、文件和记录锁、信号量);  (3) 共享内存(匿名和具名);  (4) 远程过程调用...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
     《iphone开发秘籍(第2版)》提供了关于iphone sdk以及iphone开发全面信息,iphone sdk中的各种组件做了深入浅出介绍,包括iphone 3.0 sdk所有新增特性,同时iphone开发基本流程、基本原理和基本原则...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

以下对音频格式文件的描述中