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編碼