(2)判断有没有音频数据,如果有,将它们都插入到音频缓冲区;
(3)阻塞,等待数据到来;
(4)当有数据到来时,转到第(1)步。
音视播放器模块共有4个子模块:缓冲区管理、音视频同步、音视频解码、视频显示。
2.3.1 缓冲区管理
一共设计2个队列,音频缓冲队列,视频缓冲队列。每帧数据放入缓冲区,成员分别为帧长,帧类型(视频有,音频无),时间戳,数据指针。帧长表示帧数据长度,帧类型里,1表示关键帧,0表示非关键帧,时间戳表示帧数据播放的时间,数据指针指向帧数据缓冲区。当有新的数据到来时,构造一个帧成员,填入各项参数,然后根据时间戳,将他插入到缓冲队列,播放时间近的放在前面。流程如下:
(1)首先构造一个帧缓冲成员;
(2)按照帧数据内容填充帧缓冲;
(3)根据时间戳,按照近的在前面的原则,放入缓冲区队列。
2.3.2 音视频同步
音视频数据始终与系统时间进行同步,起初初始化时,先在缓冲区存放1 s的数据。因为系统时间与发送的数据时间戳不一定相同,所以不用绝对时间,而是以缓冲区的第一帧时间戳为开始时间,后面的数据都以与这帧数据的时间差这个相对时间为准。
视频和系统时间同步的流程如下:
(1)判断缓冲队列是否为空,如果是空,休眠10 ms;
(2)如果非空,从缓冲队列取出一帧,判断这帧数据是否已经过时,如果超过播放时间100 ms以上,则判断帧类型,如果是非关键帧,丢掉这帧数据,否则处理这帧数据,然后跳到第(1)步;
(3)如果这帧数据刚刚超过播放时间并且超过时间不超过100 ms,则处理这帧数据,然后跳到第(1)步。
音频和系统时间同步的处理流程如下:
(1)判断音频缓冲区是否为空,如果是空,休眠10 ms;
(2)如果非空,取出一帧数据,判断是否已经超过播放时间100 ms,如果是,丢弃这帧数据,跳到第(1)步;
(3)否则,处理这帧数据,跳到第(1)步。
2.3.3 音视频解码
数字移动电视信号目前音频采用的是AAC编码,利用开源解码库libfaad2来解码,libfaad2的使用流程如下:
(1)首先对解码器进行配置,设置一些解码参数,例如采样率,声道数等;
(2)然后初始化解码器;
(3)如果有需要解码的音频帧,依次调用NeAAC—DecDecode进行解码;
(4)当音频帧都解码完毕,需要关闭解码器。
三星的S3C6400芯片提供了多种格式视频的硬件编解码器,简称为MFC(Multi—format Video Codec),支持的功能有:MPEG一4 Simple Profile编解码;H.264/AVC Baseline Profile编解码;H.263 P3编解码;VC一1(WMV9)Main Profile编解码;支持多任务,如同时完成1路编码和3路解码;支持多格式,如同时进行MPEG一4编码和H.264解码。理论上MFC性能可以达到全双工的720*480 30帧/s(或720*576 25帧/s)的编解码。
MFC驱动负责直接控制MFC硬件完成实际的编解码操作,提供类似字符设备的接口;MFC API封装了底层驱动的控制接口,给上层提供函数调用的接口方式,解码器调用流程如图4所示。
2.3.4 视频显示