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

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


据说是 opus 采样高 48Khz 造成的, 如何解决这个问题啊?
...全文
1309 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Isnis-fallen 2018-12-19
  • 打赏
  • 举报
回复
输入g711,不转码直接转发输出无噪音,就是转码opus后输出有噪音
rightorwrong 2018-12-19
  • 打赏
  • 举报
回复
你可以试试先解码为原生,在用opus,看是不是opus的噪音,还是数据输入有问题
Isnis-fallen 2018-12-19
  • 打赏
  • 举报
回复
这一转码,像是把480的视频转成1920的,是否必出问题呢?有办法弥补吗?
Isnis-fallen 2018-12-19
  • 打赏
  • 举报
回复
现在就是先把g711解码,在把解码的结果做opus编码,有噪音
Isnis-fallen 2018-12-18
  • 打赏
  • 举报
回复
这是一个转码的应用,输入必须是g711,输出转成opus的,问题是噪音的原因是什么?谁能说清楚这原因也可以
rightorwrong 2018-12-17
  • 打赏
  • 举报
回复
opus输入需要是G711吗?若不是,直接用原生进行opus编码
Isnis-fallen 2018-12-12
  • 打赏
  • 举报
回复
输入g 711,对它decode ,把decode 结果encode 成opus ,这样做结果是否必有噪音呢?如何消去噪音?
Isnis-fallen 2018-12-12
  • 打赏
  • 举报
回复
应该是encode 成opus 出问题了
Isnis-fallen 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));
   }
}
Isnis-fallen 2018-12-11
  • 打赏
  • 举报
回复
输入是g 711,直接转发不转码的话,没有噪音
smwhotjay 2018-12-11
  • 打赏
  • 举报
回复
decode encode哪个出现问题了
rightorwrong 2018-12-11
  • 打赏
  • 举报
回复
多少都有点,采集时就有。试试G711编码后的怎么样
rightorwrong 2018-12-11
  • 打赏
  • 举报
回复
检查opus参数设置对不
Isnis-fallen 2018-12-10
  • 打赏
  • 举报
回复
是否没有办法解决啊? 噪音是不可避免的吗? 大家帮个忙
煲机的概述:   指新买回的音响器材得通电一段时间后才会让重放的音质变好。 煲机是一种快速使器材老化稳定的措施。有些元器件例如晶体管、集成电路、电容全新的时候电器参数不稳定,经过一段时间的使用后才能逐渐稳定。对于耳机来说,煲机实际就是在煲振膜折环,新耳机振膜折环机械顺性差,导致失真比较大,经过一段时间使用后,顺性逐渐变好,失真也会逐渐降到正常的水平。 煲机是人为的以非正常使用的方式加速器材进入成熟期的过程,一般是让器材连续工作一定的时间。而未“煲”过或未“煲”够火候儿的音箱和耳机,声音的特点可以用“紧、冷、硬、粗”四个字来形容,而“煲”后的产品则醇和、顺滑、细腻很多,仿佛发酵不全的新酒与陈年佳酿相比一般,它们的“味道”还是大不一样的。 这个“煲”字用得可是形象贴切的紧,意思是要着意伺弄,不宜“炒”、不宜“炸”,更不宜“烧”,而是要文火慢炖,慢功出细活。 新的音响器材呢,就像新车,都有个磨合期。 这里介绍一种比较安全、简单的煲机方法,你就拿着白噪音和粉红噪音轮流播放着煲去吧。 音量要适中,可逐渐加大。 下面这段是转的: 白噪声或粉红噪声之类是自然状态的噪声。之所以叫白噪声,粉红噪声,是由光波的谱线图就是光谱图类比而来,白噪声的特点是各频段的能量均匀(频谱类似太阳光谱即白光光谱),粉红噪声是在低频段强在高频段弱的噪声(频谱图类似偏红的光谱即粉红光谱)。 1: 白噪音white noise 所谓白噪音是指一段声音中的频率分量的功率在整个可听范围(0~20KHZ)内都是均匀的。由于人耳对高频敏感一点这种声音听上去是很吵耳的沙沙声。 2: 粉红噪音pink noise 粉红噪音是自然界最常见的噪音,简单说来,粉红噪音的频率分量功率主要分布在中低频段。粉红噪音从人耳中听到的是平直的频率响应——"非常悦耳的一种噪声"最常用于进行声学测试的声音。 3: 电视机无信号时的背景噪声和调频收音机无台时的背景噪声均是白噪声。白噪声可用来测量扬声器和耳机的谐振和灵敏度等。 4: 从波形角度看,粉红噪音是分形的,在一定的范围内音频数据具有相同或类似的能量。粉红噪声的电平从低频向高频不断衰减,其幅度与频率成反比(1/f)。其幅度每倍频程(一个8度)下降3dB。噪声能量在每倍频程内是相等的。 5: 从频谱仪的图形上看,白噪声在全频谱内是一条平直的线。 6: 从频谱仪的图形上看,粉红噪声是在一个小段频谱内平直的线,并且以其倍数频率向下衰减。即1倍频,2倍频……频率越高谱线高度越低。 白噪声是一种无规噪声,它的瞬时值是随机变化的。它的幅值对时间的分布满足正态分布。它具有连续的噪声谱,包含有各种频率成分的噪声。它的功率谱密度与频率无关,几个频率能量的分布是均匀的。它的等带宽输出的能量是相等的。它在线性坐标中,输出是一根平行与横坐标的直线。在对数坐标中,输出是按每倍频程带宽增加3dB的斜率而上升的。 粉红噪声与白噪声一样也是一种无规噪声,也具有连续的噪声谱。不同之处在于,它的功率谱密度与频率成反比,在对数坐标中,起输出为一水平线,在线性坐标中,其输出以每倍频程3dB下降。 在人耳可听的频率范围内,具有相同能量的噪声称为白噪声。白噪声广泛用于环境声学测量中。 ===================================分割线================================= 附上wav格式的白噪音 粉红噪音各一个(文件大小:18.7M)

2,543

社区成员

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

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