CMMB开发过程中遇到的问题

CMMB开发过程中遇到的问题
     前段时间中途接手一个CMMB开发的项目,主要是做一些Bug修正及优化的工作,现在终于基本上完成了。CMMB的标准文档大致浏览了下,由于时间比较紧,许多细节并没有搞清楚。开发平台为wince,这里记录一下遇到的问题。
1.关于频点
CMMB一共有45频点,GZ为37。在网上查到各城市的频点分配,每个城市一个频点。如果想提供多的频道,是不是可以占用多个频点呢?毕竟只要保证相邻城市占用的频点是不一样就可以了。

2.关于时隙(time slot)
CMMB信号采用时分复用,每秒钟被分成40个TS,每个频道占用一个或者多个TS。这样对于单个频道而言,1秒钟才会接收一次数据。TS可以分为三类:
1).控制信息,固定由TS0承载。
2).ESG(电子业务指南).一般情况下,TS0之后的就是ESG信息。通过ESG可以获得频道列表,定位频道占用的ts。ESG信息占用TS数是不定的,广州地区为TS1,而上海为TS1~TS2。
3).节目,每套节目占用一个或者多个ts。

3.音视频数据
接收到的CMMB音频数据需要先进行解复用,解复用过程较为复杂,好在芯片厂商提供了解复用库。
1).视频采用H264编码,分辨率为320*240,解复用后得到NALU,直接扔给解码器。
2).音频采用AAC编码,双通道,每个通道采样率为24kHz,解复用后可以得到一个个的AAC帧。音频的解码过程遇到了一些问题。
AAC的解码器,原来使用的是Helix Fixed-point HE-AAC Decoder。测试发现,某些时候线程会阻塞在解码函数中,这可是致命的。猜想可能是提供的AAC数据包有问题,解码器的容错能力太差了。
后来找到了faad,这个AAC的解码库的评价比较高,TCPMP中用的就是这个。在windows及wince中编译也非常方面,在wince平台通过宏控制,可以编译成定点版本。使用faad解码时,偶尔为出错21号错误,这个错误会导致后续的解码全部出错。尝试着关闭解码器,重新初始化,可以正常工作了,长时间测试过,没有出现其它问题。

3.AAC音频解码
1).ADTS头
AAC的解码,先将其封装成ADTS包(这个还没有仔细研究,应该不进行ADTS打包也可以直接解码吧,有时间再看看),ADTS头创建过程如下:
   	ADTSHead[7]={0x0ff,0x0f9,0x058,0x80,0,0x1f,0xfc};
	ADTSHead[3] |= (frame_length & 0x1800) >> 11;// the upper 2 bit

	/* frame size continued over full byte */
	ADTSHead[4] = (frame_length & 0x1FF8) >> 3;// the middle 8 bit

	/* frame size continued first 3 bits */
	ADTSHead[5] |= (frame_length & 0x7) << 5;//the last 3 bit

	ADTSHead[6] |= num_data_block & 0x03; //Set raw Data blocks.

2).faad的使用
faad的使用很方便,只要调用4个函数调用即可
NeAACDecOpen,打开解码器
NeAACDecInit,初始化
NeAACDecClose,关闭
NeAACDecDecode,解码

3)一个奇怪的问题

faad解码出来的音频采样率翻倍了,变成了48kHz,这个没搞明白,why?知道的朋友说一声。


CMMB的标准文档已上传至:http://download.csdn.net/detail/gavinr/3806061

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值