zoukankan      html  css  js  c++  java
  • RTSP协议转RTMP协议的行业视频接入网关EasyRTSPLive如何实现音频转码的

    EasyRTSPLive是由TSINGSEE青犀开放平台开发和维护的一个完善的行业视频接入网关,拉流IPC摄像机或者NVR硬盘录像机RTSP流转成RTMP推送到阿里云CDN/腾讯云CDN/RTMP流媒体服务器,支持多路RTSP流同时拉取并以RTMP协议推送发布。

    因其稳定流畅的使用环境得到广大用户的一直好评,最近有用户反馈转码成aac格式过程中遇到一些问题,具体如下:

    提出问题

    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

  • 相关阅读:
    Elasticsearch崩溃解决办法
    阿里云服务器ubuntu14.04安装Redis
    error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1
    本机访问阿里云服务器上的Elasticsearch
    阿里云服务器配置ElasticSearch
    ElasticSearch-RTF的安装
    【已解决】neo4j-import使用过程中遇到的问题(there's a field starting with a quote and whereas it ends that quote there seems to be characters in that field /Executor has been shut down in panic)
    OutOfMemoryError和StackOverflowError
    线程的终止
    scala基础
  • 原文地址:https://www.cnblogs.com/EasyNVR/p/11512569.html
Copyright © 2011-2022 走看看