RTMP传输音频(音频是G711A格式的,使用的是VLC工具播放),现在只有杂音没有正常过

u010093608 2017-07-08 05:22:36
int CRTMPStream::DealMessage(CMsgQue::MSG tmpMsg)
{
// CGuard guard(m_Mutex);
CPacket *pPacket = (CPacket *)tmpMsg.lpa;

int ret = 0 ;
int bIsKeyFrame = 0;
int len = 0;
static bool flag = true;
unsigned long m_tickold = 0;

if(pPacket == NULL || m_lHandle == NULL)
{
return -1;
}

ret = H264_PARSER_InputData(m_lHandle, pPacket->GetBuffer(), pPacket->GetLength());
if(ret < 0)
{
return -1;
}

while ((pFrameInfo = H264_PARSER_GetNextFrame(m_lHandle)) != NULL)
{
/*
if(pFrameInfo && pFrameInfo->nFrameLength)
{
FILE *fp = NULL;
fp = fopen("/home/data.h264","a+");
fwrite(pFrameInfo->pContent,pFrameInfo->nFrameLength,1,fp);
fclose(fp);
}
*/
bIsKeyFrame = 0;

if (m_stop)
{
m_bIFrame = false;
continue;
}
if(g_waitIFrame)
{
printf("\r\n [%d]rtmpserver: need wait I frame.\n", __LINE__);
m_bIFrame = false;
m_sendfailnum ++;
if(m_sendfailnum >= 20)
{
g_rtmpsendfail = 1;
m_sendfailnum = 0;
}
g_waitIFrame = 0;
}
/*
if((MsgQueSize*3/4) <= GetMessageCount())//超过队列总长度的3/4,丢帧到下一个I帧
{
m_bIFrame = false;
}
*/
if (false == m_bIFrame)
{
if (pFrameInfo->nType == frameTypeVideo && pFrameInfo->nSubType == frameSubTypeIFrame || pFrameInfo->nType == frameTypeAudio)
{
m_bIFrame = true;
}
}
if(m_bIFrame)
{
if(pFrameInfo->nType == frameTypeVideo)
{
if( pFrameInfo->nSubType == frameSubTypeIFrame)
{
bIsKeyFrame = 1;
len = 0;
while(1)//码流分析库解析出来的I帧带有SPS等信息,前面已经发了一次,这里偏移掉
{
if(pFrameInfo->pContent[len] == 0x00 && pFrameInfo->pContent[len+1] == 0x00 && pFrameInfo->pContent[len+2] == 0x00 && pFrameInfo->pContent[len+3] == 0x01 && (pFrameInfo->pContent[len+4] == 0x25 || pFrameInfo->pContent[len+4] == 0x65))
{
break;
}
len++;
}
ret = SendH264Packet(pFrameInfo->pContent + len + 4 , pFrameInfo->nFrameLength - len - 4, bIsKeyFrame, m_tick);
}
else
{
ret = SendH264Packet(pFrameInfo->pContent + 4 , pFrameInfo->nFrameLength - 4, bIsKeyFrame, m_tick);
}

m_tick_gap = 1000/pFrameInfo->nFrameRate;
printf("pFrameInfo->nFrameRate:%d\n",pFrameInfo->nFrameRate);
//m_tickold = m_tick;
m_tick += m_tick_gap;
}
else if(pFrameInfo->nType == frameTypeAudio)
{
unsigned long current_ms = 0;
unsigned long rtp_ms = 0;

//if(flag == true)
{
//printf("___________rtmp_write_audio_header_________");
//rtmp_write_audio_header(m_pRtmp);
//flag = FALSE;
}
struct timeval tv;
//更新一下当前时间
gettimeofday(&tv,0);
current_ms = (tv.tv_sec*1000+tv.tv_usec/1000);
if(m_Initms == 0)
{
m_Initms = current_ms;
}
rtp_ms = current_ms - m_Initms;
m_tickold = rtp_ms*8;
ret = rtmp_write_audio_data(m_pRtmp,pFrameInfo->pContent + 4, pFrameInfo->nFrameLength -4,m_tickold);
printf("rtmp_write_audio_data___%d_m_tickold:__%ld____pFrameInfo->nFrameLength - 4_%d__\n",ret,m_tickold,pFrameInfo->nFrameLength - 4);
}
if(ret)
{
m_sendfailnum = 0;
}
}
else
{
//flag = true;
}
}

pPacket->Release();

return 0;
}
int CRTMPStream::rtmp_write_audio_data(RTMP *rtmp, const uchar *nalu_data, int nalu_size, int audio_TimeStamp)
{
//rtmp包结构
printf("___________rtmp_write_audio_data__audio_TimeStamp:%d_______\n",audio_TimeStamp);
int size = nalu_size ;
RTMPPacket packet;
RTMPPacket_Reset(&packet);
//RTMPPacket_Alloc(&packet, size);
int i=0;

if(RTMPPacket_Alloc(&packet, size))
{
// MP3 AAC format 48000Hz
// packet.m_body[i++] = 0x00;
// packet.m_body[i++] = 0x00;
// packet.m_body[i++] = 0x01;
//packet.m_body[i++] = 0xEA;
memcpy(&packet.m_body[i], nalu_data, nalu_size);
}
else
{
printf("________RTMPPacket_Alloc failed______\n");
}


packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM;
packet.m_packetType = RTMP_PACKET_TYPE_AUDIO;
packet.m_hasAbsTimestamp = 0;
packet.m_nChannel = 0x04;
packet.m_nTimeStamp = audio_TimeStamp;
packet.m_nInfoField2 = rtmp->m_stream_id;
packet.m_nBodySize = size;

//调用发送接口
int nRet = RTMP_SendPacket(rtmp, &packet, TRUE);
RTMPPacket_Free(&packet);//释放内存
return nRet;
}
...全文
1119 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-10
  • 打赏
  • 举报
回复
推荐使用bass库处理音频。
u010093608 2017-07-08
  • 打赏
  • 举报
回复
手动顶帖

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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