您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 流媒体MP3播放器教程
基于libmadlibmadlibmadlibmad的简单MP3MP3MP3MP3流媒体播放器的实现.介绍本文在Fedora5Linux下实现了一个基于libmad的mp3流媒体播放器。此流媒体播放器可以播放基于HTTP1.1协议传输的MP3流媒体数据。资料下载:jj斗地主官方下载:网络电视官方下载2011:基本原理是:从HTTP服务器获得MP3媒体信息,然后通过网络传输把MP3数据以数据流的形式接收到MP3流媒体播放器客户端,由客户端通过libmad解码MP3数据流,得到PCM音频数据,写入音频设备,播放音乐。本文的流媒体播放器只是实现了必要的简单功能,没有考虑太多情况。比如,没有考虑实时播放控制,这样的话就不能随意选取播放点进行播放。本文的MP3流媒体播放器创建两个线程,使用两个缓冲区保存MP3数据,可以一边下载数据,一边播放音乐。编译运行此MP3流媒体播放器需要安装libmad()以及ALSA(AdvancedLinuxSoundArchitecture)()相关的软件。ALSA包括4部分,分别是sounddriver,soundlibrary,soundutilities以及tools。至少应该安装sounddriver,soundlibrary。编译程序时连接库的选项是:-lmad-lasound-lpthread。本文的MP3流媒体播放器使用双缓冲区,一个是数据接收缓冲区,另一个是数据解码缓冲区。主程序结构如下图所示,图中的蓝色线表示数据流向。图1111:MP3MP3MP3MP3流媒体播放器主程序结构图2222.libmadlibmadlibmadlibmad简介MAD(libmad)是一个开源的高精度MPEG音频解码库,支持MPEG-1(LayerI,LayerII和LayerIII(也就是MP3)。LIBMAD提供24-bit的PCM输出,完全是定点计算,非常适合没有浮点支持的平台上使用。使用libmad提供的一系列API,就可以非常简单地实现MP3数据解码工作。在libmad的源代码文件目录下的mad.h文件中,可以看到绝大部分该库的数据结构和API等。•本文用到的libmad中的主要数据结构有:structmad_stream,structmad_synth,structmad_frame。它们的定义如下:清单1111:libmadlibmadlibmadlibmad中的主要数据结构structmad_stream{unsignedcharconst*buffer;/*inputbitstreambuffer*/unsignedcharconst*bufend;/*endofbuffer*/unsignedlongskiplen;/*bytestoskipbeforenextframe*/intsync;/*streamsyncfound*/unsignedlongfreerate;/*freebitrate(fixed)*/unsignedcharconst*this_frame;/*startofcurrentframe*/unsignedcharconst*next_frame;/*startofnextframe*/structmad_bitptrptr;/*currentprocessingbitpointer*/structmad_bitptranc_ptr;/*ancillarybitspointer*/unsignedintanc_bitlen;/*numberofancillarybits*/unsignedchar(*main_data)[MAD_BUFFER_MDLEN];/*LayerIIImain_data()*/unsignedintmd_len;/*bytesinmain_data*/intoptions;/*decodingoptions(seebelow)*/enummad_errorerror;/*errorcode(seeabove)*/};资料下载:jj斗地主官方下载:网络电视官方下载2011:更多内容请看流媒体播放器流媒体文件格式播放技巧专题,或如果缓冲区最后一个MPEG数据帧只有部分数据包括在缓冲区中,那么structmad_stream中的next_frame域指到不完整数据的开始地址。•由于缓冲区的MPEG数据帧不一定完整,所以不完整的MPEG帧的数据必须拷贝到下一次解码操作的缓冲区中,进行再次解码。这里我们还看到bufend指向缓冲区数据的最后地址,也就是最后一字节的地址加1的位置。mad_stream.bufend–mad_stream.next_frame就是剩余的未被解码的MPEG帧的数据的字节数量(假设此帧在缓冲区中不完整)。mad_stream的error域用来记录操作mad_stream得到的错误代码。错误代码在mad.h中有很详细的定义。•清单2222:错误代码在mad.hmad.hmad.hmad.h中的详细定义•structmad_synth{•mad_fixed_tfilter[2][2][2][16][8];/*polyphasefilterbankoutputs*/•/*[ch][eo][peo][s][v]*/•unsignedintphase;/*currentprocessingphase*/•structmad_pcmpcm;/*PCMoutput*/•};mad_synth中的关键域pcm保存解码和合成后得到的PCM数据。清单3333:mad_synthmad_synthmad_synthmad_synth中的关键域structmad_pcm{unsignedintsamplerate;/*samplingfrequency(Hz)*/unsignedshortchannels;/*numberofchannels*/unsignedshortlength;/*numberofsamplesperchannel*/mad_fixed_tsamples[2][1152];/*PCMoutputsamples[ch][sample]*/};资料下载:jj斗地主官方下载:网络电视官方下载2011:定义了音频的采样率、每个声道个数以及最后的PCM采样数据。这些参数可用来初始化音频设备。清单4444:structstructstructstructmad_pcmmad_pcmmad_pcmmad_pcmstructmad_frame{structmad_headerheader;/*MPEGaudioheader*/intoptions;/*decodingoptions(fromstream)*/mad_fixed_tsbsample[2][36][32];/*synthesissubbandfiltersamples*/mad_fixed_t(*overlap)[2][32][18];/*LayerIIIblockoverlapdata*/};资料下载:jj斗地主官方下载:网络电视官方下载2011:是记录MPEG帧解码后的数据的数据结构,其中的mad_header尤其重要,其用来记录MPEG帧的一些基本信息,比如MPEG层数、声道模式、流比特率、采样比特率等等。声道模式包括单声道、双声道、联合立体混音声以及一般立体声。清单5555:mad_framemad_framemad_framemad_frameenummad_mode{MAD_MODE_SINGLE_CHANNEL=0,/*singlechannel*/MAD_MODE_DUAL_CHANNEL=1,/*dualchannel*/MAD_MODE_JOINT_STEREO=2,/*joint(MS/intensity)stereo*/MAD_MODE_STEREO=3/*normalLRstereo*/};structmad_header{enummad_layerlayer;/*audiolayer(1,2,or3)*/enummad_modemode;/*channelmode*/intmode_extension;/*additionalmodeinfo*/enummad_emphasisemphasis;/*de-emphasistouse*/unsignedlongbitrate;/*streambitrate(bps)*/unsignedintsamplerate;/*samplingfrequency(Hz)*/unsignedshortcrc_check;/*frameCRCaccumulator*/unsignedshortcrc_target;/*finaltargetCRCchecksum*/intflags;/*flags*/intprivate_bits;/*privatebits*/mad_timer_tduration;/*audioplayingtimeofframe*/};•下面就本文使用的API的功能做简单介绍。在本文中用到的API包括:voidmad_stream_init(structmad_stream*)voidmad_synth_init(structmad_synth*);voidmad_frame_init(structmad_frame*);以上3个API初始化解码需要的数据结构。voidmad_stream_buffer(structmad_stream*,unsignedcharconst*,unsignedlong);此函数把原始的未解码的MPEG数据和mad_stream数据结构关联,以便使用mad_frame_decode()来解码MPEG帧数据。intmad_frame_decode(structmad_frame*,structmad_stream*);资料下载:jj斗地主官方下载:网络电视官方下载2011:把mad_stream中的MPEG帧数据解码。voidmad_synth_frame(structmad_synth*,structmad_frameconst*);把解码后的音频数据合成PCM采样。voidmad_stream_finish(structmad_stream*);voidmad_frame_finish(structmad_frame*);mad_synth_finish(structmad_synth);以上3个API在解码完毕后使用,释放libmad占用的资源等。更多内容请看流媒体播放器流媒体文件格式播放技巧专题,或3333.PCMPCMPCMPCM音频设备的操作对音频设备的操作主要是初始化音频设备以及往音频设备发送PCM(PulseCodeModulation)数据。为了方便,本文使用ALSA(AdvancedLinuxSoundArchitecture)提供的库和驱动。在编译和运行本文中的MP3流媒体播放器的时候,必须先安装ALSA相关的文件。本文用到的主要对PCM设备操作的函数分为PCM设备初始化的函数以及PCM接口的一些操作函数。PCM硬件设备参数设置和初始化的函数有:intsnd_pcm_hw_params_malloc(snd_pcm_hw_params_
本文标题:流媒体MP3播放器教程
链接地址:https://www.777doc.com/doc-1481002 .html