RTSP協議轉RTMP協議的行業視頻接入網關EasyRTSPLive如何實現音頻轉碼的

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

相關文章
相關標籤/搜索