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

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


据说是 opus 采样高 48Khz 造成的, 如何解决这个问题啊?
...全文
1394 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysnis 2018-12-19
  • 打赏
  • 举报
回复
输入g711,不转码直接转发输出无噪音,就是转码opus后输出有噪音
rightorwrong 2018-12-19
  • 打赏
  • 举报
回复
你可以试试先解码为原生,在用opus,看是不是opus的噪音,还是数据输入有问题
ysnis 2018-12-19
  • 打赏
  • 举报
回复
这一转码,像是把480的视频转成1920的,是否必出问题呢?有办法弥补吗?
ysnis 2018-12-19
  • 打赏
  • 举报
回复
现在就是先把g711解码,在把解码的结果做opus编码,有噪音
ysnis 2018-12-18
  • 打赏
  • 举报
回复
这是一个转码的应用,输入必须是g711,输出转成opus的,问题是噪音的原因是什么?谁能说清楚这原因也可以
rightorwrong 2018-12-17
  • 打赏
  • 举报
回复
opus输入需要是G711吗?若不是,直接用原生进行opus编码
ysnis 2018-12-12
  • 打赏
  • 举报
回复
输入g 711,对它decode ,把decode 结果encode 成opus ,这样做结果是否必有噪音呢?如何消去噪音?
ysnis 2018-12-12
  • 打赏
  • 举报
回复
应该是encode 成opus 出问题了
ysnis 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));
   }
}
ysnis 2018-12-11
  • 打赏
  • 举报
回复
输入是g 711,直接转发不转码的话,没有噪音
smwhotjay 2018-12-11
  • 打赏
  • 举报
回复
decode encode哪个出现问题了
rightorwrong 2018-12-11
  • 打赏
  • 举报
回复
多少都有点,采集时就有。试试G711编码后的怎么样
rightorwrong 2018-12-11
  • 打赏
  • 举报
回复
检查opus参数设置对不
ysnis 2018-12-10
  • 打赏
  • 举报
回复
是否没有办法解决啊? 噪音是不可避免的吗? 大家帮个忙
内容概要:本文介绍了一款数字化控制的8输入2输出音频混音器集成电路(IC)。该IC采用创新的级联R-xR电阻梯形网络架构,旨在满足专业音频和多媒体系统的需求。每个输入通道具有1dB步进、最大63dB衰减的控制能力,并可选择分配到左、右或双声道输出。设计重点在于优化总谐波失真(THD),实现了低于0.01%的THD性能。该芯片采用先进的BiCMOS工艺制造,面积小于12.5平方毫米。文中详细描述了三阶段级联电阻梯形网络的设计原理,以及串行接口的工作机制。此外,还讨论了启动时静音功能的实现方法,确保在上电过程中不会产生噪音。 适合人群:电子工程师、音频设备开发者、集成电路设计师以及对高性能音频混频器感兴趣的科研人员。 使用场景及目标:①适用于需要处理多个音频源并进行精确音量控制的专业音频设备;②为多媒体应用提供高集成度、低失真音频解决方案;③帮助工程师理解如何通过创新的电阻梯形网络设计实现低失真和低噪声的音频处理。 其他说明:该设计不仅在性能上超越了离散元件替代方案,还在成本和功能上提供了显著优势。文中提到的专利技术确保了“拉链噪声”的最小化,并且可以通过简单的串行接口进行配置,节省了电路板空间。未来的设计可以进一步优化缓冲放大器的噪声水平以提升整体性能。

2,554

社区成员

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

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