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 技术官方邮箱: support@car-eye.cn
car-eye技术交流QQ群: 590411159
CopyRight© car-eye 开源团队 2018