EasyRTSPLive是由TSINGSEE青犀开放平台开发和维护的一个完善的行业视频接入网关,拉流IPC摄像机或者NVR硬盘录像机RTSP流转成RTMP推送到阿里云CDN/腾讯云CDN/RTMP流媒体服务器,支持多路RTSP流同时拉取并以RTMP协议推送发布。git
因其稳定流畅的使用环境获得广大用户的一直好评,最近有用户反馈转码成aac格式过程当中遇到一些问题,具体以下:github
提出问题
EasyRTMP推送rtmp流到EasyDSS等RTMP流媒体服务器目前只支持推送aac格式的音频数据,而实际咱们easyrtsplive经过librtspclient拉取的网络摄像机等输出的rtsp流不少都是g711,g726等格式的音频,因此,咱们须要将音频编码格式转码成aac格式。服务器
分析问题
经过对libfaac音频编码libeasyaacencoder库的封装,咱们能够经过调用该sdk的接口轻松实现g711,g726等格式的音频转码为aac音频格式。网络
解决问题
首先,咱们须要导入libeasyaacencoder库,以下代码所示:运维
#include "EasyAACEncoderAPI.h" #ifdef _WIN32 #pragma comment(lib,"libEasyAACEncoder.lib") #endif
而后,咱们在音频数据回调时调用Easy_AACEncoder_Encode接口对音频数据进行解码,以下代码所示:工具
int bits_per_sample = frameinfo->bits_per_sample; int channels = frameinfo->channels; int sampleRate = frameinfo->sample_rate; if (EASY_SDK_AUDIO_CODEC_G711U == frameinfo->codec || EASY_SDK_AUDIO_CODEC_G726 == frameinfo->codec || EASY_SDK_AUDIO_CODEC_G711A == frameinfo->codec ) { if (pChannel->fPusherInfo.pAACCacheBuffer == NULL) { int buf_size = BUFFER_SIZE; pChannel->fPusherInfo.pAACCacheBuffer = new unsigned char[buf_size]; memset(pChannel->fPusherInfo.pAACCacheBuffer , 0x00, buf_size); } if (pChannel->fPusherInfo.aacEncHandle == NULL) { InitParam initParam; initParam.u32AudioSamplerate=frameinfo->sample_rate; initParam.ucAudioChannel=frameinfo->channels; initParam.u32PCMBitSize=frameinfo->bits_per_sample; if (frameinfo->codec == EASY_SDK_AUDIO_CODEC_G711U) { initParam.ucAudioCodec = Law_ULaw; } else if (frameinfo->codec == EASY_SDK_AUDIO_CODEC_G726) { initParam.ucAudioCodec = Law_G726; } else if (frameinfo->codec == EASY_SDK_AUDIO_CODEC_G711A) { initParam.ucAudioCodec = Law_ALaw; } pChannel->fPusherInfo.aacEncHandle = Easy_AACEncoder_Init( initParam); } unsigned int out_len = 0; int nRet = Easy_AACEncoder_Encode(pChannel->fPusherInfo.aacEncHandle, (unsigned char*)pbuf, frameinfo->length, (unsigned char*)pChannel->fPusherInfo.pAACCacheBuffer, &out_len) ; if (nRet>0&&out_len>0) { pSendBuffer = (unsigned char*)pChannel->fPusherInfo.pAACCacheBuffer ; nSendBufferLen = out_len; frameinfo->codec = EASY_SDK_AUDIO_CODEC_AAC; } }
最后,使用完后咱们须要释放申请的资源,以下代码所示:阿里云
if (pChannel->fPusherInfo.aacEncHandle ) { Easy_AACEncoder_Release(pChannel->fPusherInfo.aacEncHandle ); pChannel->fPusherInfo.aacEncHandle = NULL; } if (pChannel->fPusherInfo.pAACCacheBuffer ) { delete[] pChannel->fPusherInfo.pAACCacheBuffer; pChannel->fPusherInfo.pAACCacheBuffer = NULL; }
经过以上几步完美解决了音频转码的问题,因而可知EasyRTSPLive全平台支持(包括Windows/Linux 32&64,ARM各类平台,Android,iOS),是技术研发快速迭代的工具,也是安防运维人员进行现场问题排查的得力帮手!最新SDK版本、文档及示例代码 :https://github.com/tsingsee/EasyRTSPLive编码