Car-eye JT/T1078 视频服务器开发过程中的音频处理

JT/T 1078视频协议是基于JT/T 808协议的扩展。其中视频服务器和指令控制服务器用两个SOCKET 进行通信。

因为协议采用TCP-ip协议的基础上进行封装,需要对协议的数据进行解释。然后转化成RTSP或者RTMP通用的协议

以扩展视频应用的范围。其中我们用到了RTMP协议,在网络延迟越来越少的情况下。RTMP协议的服务器性能更加稳定,web

开发更加方便。但这里主要因为面对的设备端主要使用海思的G726/G711A等格式来传送音频。但非常不幸的是这些格式并

不被RTMP协议所接受。所以需要进行转码。采用FFMPEG或者海思的专用解码器G726的数据线解释成PCM数据,然后再用

FACC 编码库转成AAC 通过RTMP 推流器推送到服务器。

需要注意以下几个方面:

1. 海思的数据中包含了海思的4个字节头,如果采用别的解码器解码需要去掉

2. AAC 编码的时候需要注意,需要将PCM的数据拼接成编码器制定需要的大小,然后再送进去进行编码。

3. 需要考虑服务器多并发的性能问题

不多说,将核心代码贴上:

G726Decoder->AFrameDecoder((char*)pBuffer, rtpLength, szOutData, &nOutDataLen);

if (m_index + nOutDataLen <= m_nPCMBufferSize)

{

memcpy(m_pbPCMBuffer + m_index, szOutData, nOutDataLen);

m_index += nOutDataLen;

if (m_index == m_nPCMBufferSize)

{

m_index = 0;

AAClen = m_pPCMToAAC->Encode((int*)m_pbPCMBuffer, m_nPCMBufferSize, pbAACBuffer, m_pPCMToAAC->GetMaxOutputBytes());

}

}else

{

int last = m_index + nOutDataLen - m_nPCMBufferSize;//剩下不的部分

memcpy(m_pbPCMBuffer + m_index, szOutData, m_nPCMBufferSize - m_index);

AAClen = m_pPCMToAAC->Encode((int*)m_pbPCMBuffer, m_nPCMBufferSize, pbAACBuffer, m_pPCMToAAC->GetMaxOutputBytes());

memcpy(m_pbPCMBuffer , szOutData+ m_nPCMBufferSize - m_index, last);

m_index = last;

}

if (AAClen > 0)

{

push(MEDIA_TYPE_AUDIO, header.dataType, header.payLoad, header.timeStamp, (char*)pbAACBuffer, AAClen);

}

car-eye开源官方网址:www.car-eye.cn   

car-eye 流媒体平台网址:www.liveoss.com    

car-eye 技术官方邮箱: [email protected]    
car-eye技术交流QQ群: 590411159     

CopyRight©  car-eye 开源团队 2018

猜你喜欢

转载自blog.csdn.net/Car_eye/article/details/81544343
今日推荐