音频失真有噪音, 如何解决?

Aist-memory 2018-12-08 09:07:47
输入是 G 711 的音频, decode后, 再encode 成 opus 的音频输出, 结果出现声音音质下降有噪音, 请问如何解决这个问题。


据说是 opus 采样高 48Khz 造成的, 如何解决这个问题啊?
...全文
1356 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aist-memory 2018-12-19
  • 打赏
  • 举报
回复
输入g711,不转码直接转发输出无噪音,就是转码opus后输出有噪音
rightorwrong 2018-12-19
  • 打赏
  • 举报
回复
你可以试试先解码为原生,在用opus,看是不是opus的噪音,还是数据输入有问题
Aist-memory 2018-12-19
  • 打赏
  • 举报
回复
这一转码,像是把480的视频转成1920的,是否必出问题呢?有办法弥补吗?
Aist-memory 2018-12-19
  • 打赏
  • 举报
回复
现在就是先把g711解码,在把解码的结果做opus编码,有噪音
Aist-memory 2018-12-18
  • 打赏
  • 举报
回复
这是一个转码的应用,输入必须是g711,输出转成opus的,问题是噪音的原因是什么?谁能说清楚这原因也可以
rightorwrong 2018-12-17
  • 打赏
  • 举报
回复
opus输入需要是G711吗?若不是,直接用原生进行opus编码
Aist-memory 2018-12-12
  • 打赏
  • 举报
回复
输入g 711,对它decode ,把decode 结果encode 成opus ,这样做结果是否必有噪音呢?如何消去噪音?
Aist-memory 2018-12-12
  • 打赏
  • 举报
回复
应该是encode 成opus 出问题了
Aist-memory 2018-12-11
  • 打赏
  • 举报
回复
就一个函数, 输入是 G711, 转码成 opus 输出, 麻烦看看哪里参数使用有误

void Flow::send(char* buffer, unsigned int size)
{
	char encodedDataTemp[48000] = { 0 };
	char encodedDataTemp1[48000] = { 0 };
	char decodedDataTemp[48000] = { 0 };
	char tempData[48000] = { 0,1,2,3,11,12,13,21,22,23,31,32,33,41,42,43,51,52,53,61,62,63,71,72,73,81,82,83,91,92,93 };
	if (true)
	{
		memcpy(tempData, buffer, size);
	}
	
	if (mMediaStream)
	{
		MBRTPHeader *rtpheader;
		rtpheader = (MBRTPHeader *)buffer;
		if (rtpheader->payloadtype == 103 || rtpheader->payloadtype == 8 || rtpheader->payloadtype == 0 || rtpheader->payloadtype == 105)
		{
			CMBOpusEncoder1 oMbOpusEncoder;
			CMBOpusDecoder1	oMbOpusDecoder;
			MBG711Codec1 m_G711CodecDecoder;

			//if判断, 如果输入输出是同类型编码, 直接转发, 不进入这个if
			if (!((mMediaStream->audioRtpInfo.codecType == 0 && rtpheader->payloadtype==0) ||
				(mMediaStream->audioRtpInfo.codecType == 1 && rtpheader->payloadtype == 8) ||
				(mMediaStream->audioRtpInfo.codecType == 2 && rtpheader->payloadtype == 105) || 
				(mMediaStream->audioRtpInfo.codecType == 4 && rtpheader->payloadtype == 103)))
			{
				unsigned int statusMB = 1;
				int extension_lenth = 0;
				if (rtpheader->extension)
				{
					extension_lenth = buffer[sizeof(MBRTPHeader)+3] & 0xff;
					extension_lenth = (extension_lenth << 8) + buffer[sizeof(MBRTPHeader)+2] & 0xff;
					extension_lenth = (extension_lenth << 16) + buffer[sizeof(MBRTPHeader)+1] & 0xff;
					extension_lenth = (extension_lenth << 24) + buffer[sizeof(MBRTPHeader)] & 0xff;
				}
				int ret_length = 0;
				switch (rtpheader->payloadtype)
				{
				case 103://opus解码
					oMbOpusDecoder.Create();
					ret_length = oMbOpusDecoder.DecodeFrame(buffer + sizeof(MBRTPHeader)+extension_lenth, size - sizeof(MBRTPHeader)-extension_lenth, decodedDataTemp, 48000);
					
					oMbOpusDecoder.Destroy();
					break;
				case 8://G711解码
					statusMB = m_G711CodecDecoder.DecodePCMA((unsigned char*)buffer + sizeof(MBRTPHeader)+extension_lenth, size - sizeof(MBRTPHeader)-extension_lenth, (unsigned char*)decodedDataTemp, ret_length);
					break;
				case 0://G711解码
					statusMB = m_G711CodecDecoder.DecodePCMU((unsigned char*)buffer + sizeof(MBRTPHeader)+extension_lenth, size - sizeof(MBRTPHeader)-extension_lenth, (unsigned char*)decodedDataTemp, ret_length);
					break;
				case 105:
					break;
				default:
					break;
				}

				MBRTPHeader *rtpheadertmp = (MBRTPHeader *)tempData;
				switch (mMediaStream->audioRtpInfo.codecType)
				{
				case 4://opus编码
					oMbOpusEncoder.Create();
					oMbOpusEncoder.EncodeFrame(decodedDataTemp, ret_length, encodedDataTemp);
					
					size = oMbOpusEncoder.m_EncodedFrameSize;

					oMbOpusEncoder.Destroy();
 					
					memcpy(tempData + sizeof(MBRTPHeader)+extension_lenth, encodedDataTemp, size);
					rtpheadertmp->payloadtype = 103;
					size = size + sizeof(MBRTPHeader)+extension_lenth;
					break;
				case 1://G711编码
					m_G711CodecDecoder.EncodePCMA((unsigned char*)decodedDataTemp, ret_length);
					//size = m_G711CodecDecoder.encodedLen;//
					size = ret_length / 2;
					memcpy(tempData + sizeof(MBRTPHeader)+extension_lenth, m_G711CodecDecoder.encodedData, size);
					rtpheadertmp->payloadtype = 8;
					size = size + sizeof(MBRTPHeader)+extension_lenth;
					break;
				case 0://G711编码
					m_G711CodecDecoder.EncodePCMU((unsigned char*)decodedDataTemp, ret_length);
					//size = m_G711CodecDecoder.encodedLen;//
					size = ret_length / 2;
					memcpy(tempData + sizeof(MBRTPHeader)+extension_lenth, m_G711CodecDecoder.encodedData, size);
					rtpheadertmp->payloadtype = 0;
					size = size + sizeof(MBRTPHeader)+extension_lenth;
					break;
				case 2:
					break;
				default:
					break;
				}
			}
		}
	}

   assert(mTurnSocket.get());
   if(isReady())
   {
	   if (processSendData(tempData, size, mTurnSocket->getConnectedAddress(), mTurnSocket->getConnectedPort()))
      {
		  mTurnSocket->send(tempData, size);
      }
	  if (!mStartingSend)
	  {
		  if(mMediaStream)
			 mMediaStream->onFlowFirstSendRtp(mMediaStream->audioRtpInfo.localrtpid,mMediaStream->videoRtpInfo.localrtpid);
		 mStartingSend = true;
	  }
   }
   else
   {
      onSendFailure(mTurnSocket->getSocketDescriptor(), boost::system::error_code(flowmanager::InvalidState, boost::asio::error::misc_category));
   }
}
Aist-memory 2018-12-11
  • 打赏
  • 举报
回复
输入是g 711,直接转发不转码的话,没有噪音
smwhotjay 2018-12-11
  • 打赏
  • 举报
回复
decode encode哪个出现问题了
rightorwrong 2018-12-11
  • 打赏
  • 举报
回复
多少都有点,采集时就有。试试G711编码后的怎么样
rightorwrong 2018-12-11
  • 打赏
  • 举报
回复
检查opus参数设置对不
Aist-memory 2018-12-10
  • 打赏
  • 举报
回复
是否没有办法解决啊? 噪音是不可避免的吗? 大家帮个忙

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧