公司项目中使用rtmp推流,音频编码aac、视频编码H264。
windows和android平台都没有发现问题。
然而在IOS版本的APP中发现几个问题:
1. 推流后flash播放异常
2. IOS平台微信分享后html5播放异常
但是在PC上播放正常,android平台上html5播放正常。

经过两天的钻研,发现问题如下:
1. rtmp建立连接的时候先发送音视频相关参数。或者第一帧发送的数据应该如下:

 m_pPacketAudio->m_nChannel = 0x04;
m_pPacketAudio->m_headerType = RTMP_PACKET_SIZE_LARGE;
m_pPacketAudio->m_nTimeStamp = ;
m_pPacketAudio->m_nInfoField2 = m_pRtmp->m_stream_id;
m_pPacketAudio->m_hasAbsTimestamp = ; char * szBodyBufferAudio = m_pPacketAudio->m_body;
/*
[UB4]:10,soundformat:aac
[UB2]:3,sample reate,44k
[UB1]:1,bitspersample,16bit
[UB1]:1,channel,2
*/
szBodyBufferAudio[ ] = 0xAF;
//AACPacketType,[UI8],0:AAC sequence header
szBodyBufferAudio[ ] = 0x00;
//AudioSpecificConfig,2 byte
//for AAC LE
//44k ,2-ch aac-lc
szBodyBufferAudio[ ] = 0x12;
szBodyBufferAudio[ ] = 0x10;
m_pPacketAudio->m_nBodySize = ;
m_pPacketAudio->m_packetType = RTMP_PACKET_TYPE_AUDIO;
RTMP_SendPacket(m_pRtmp, m_pPacketAudio, );

2. 后面的音视频流发送rtmp时,写法如下:

 if(dwType == PACKET_VIDEO)
{
// ......
//RTMP_SendPacket(m_pRtmp, m_pPacketVideo, 0);
// ......
}
else if(dwType == PACKET_AUDIO)
{
char * szBodyBufferAudio = m_pPacketAudio->m_body;
/* [UB4]:10,soundformat:aac
[UB2]:3,sample reate,44k
[UB1]:1,bitspersample,16bit
[UB1]:1,channel,2
*/ // 以下两行是最关键的两行
lDataSize -= 7;
pFrameData += 7;
szBodyBufferAudio[ ] = 0xAF;
//AACPacketType,[UI8],1:Raw AAC frame data
szBodyBufferAudio[ ] = 0x01;
m_pPacketAudio->m_nBodySize = lDataSize + ;
m_pPacketAudio->m_nChannel = 0x04;
m_pPacketAudio->m_headerType = RTMP_PACKET_SIZE_MEDIUM;
m_pPacketAudio->m_nInfoField2 = m_pRtmp->m_stream_id;
m_pPacketAudio->m_hasAbsTimestamp = ;
//memcpy(szBodyBufferAudio + 2, pFrameData, lDataSize);
//RTMP_SendPacket(m_pRtmp, m_pPacketAudio, 0); CMQueueUnit* pQu = m_pSendBuffer->StartWrite();
if(pQu)
{
MByte* pBuf = pQu->GetBuf();
if(pBuf){
memcpy(pBuf, m_pPacketAudio, sizeof(RTMPPacket));
((RTMPPacket*)pBuf)->m_body = (char*)(pBuf + sizeof(RTMPPacket) + RTMP_MAX_HEADER_SIZE);
memcpy(((RTMPPacket*)pBuf)->m_body, szBodyBufferAudio, );
memcpy(((RTMPPacket*)pBuf)->m_body + , pFrameData, lDataSize);
m_pSendBuffer->EndWrite(pQu, TRUE);
}
else
m_pSendBuffer->EndWrite(pQu, FALSE);
} #ifdef WIN32
m_dwRemainTimes += ();
m_pPacketAudio->m_nTimeStamp += ;
#elif defined __IPHONE__
m_dwRemainTimes += ();
m_pPacketAudio->m_nTimeStamp += ;
#else
m_dwRemainTimes += (/);
m_pPacketAudio->m_nTimeStamp += ;
#endif
if(m_dwRemainTimes>)
{
m_pPacketAudio->m_nTimeStamp += ;
m_dwRemainTimes -= ;
} m_dwOldTimeStamp = CMHelpFunc::GetCurTimeStamp();
}

3. 视频编码后的数据,处理如下。
那几句一定要注释 不然flash和Html5播放不出视频。

 if( lOutSize ==  || lOutSize > m_lVFrameOutBuffSize )
{
LOGE( "Encoding one video frame failed 2 (%d)", res );
res = MV2_ERR_MEDIASTREAM_VIDEOENCODE;
return res;
}
else
{
MByte * pRawData = m_pVFrameOutBuff; // 以下几句一定要注释
// if(bIsSyncFrame)//first frame ,skip sps/pps header,length is 22,NAL header,length:4
// {
// lOutSize -= 26;
// pRawData += 26;
// m_bFirstVF = MFalse;
// }
// else
// {
// /*just skip NAL Header: 4 byte*/
// lOutSize -= 4;
// pRawData += 4;
// } if( m_pRtmp )
res = m_pRtmp->SendMediaData( pRawData, lOutSize, PACKET_VIDEO, bIsSyncFrame );
}

不然播放出来的将会是这样

librtmp推流使用aac编码音频的html5和flash播放问题的更多相关文章

  1. JW Player 6.7(网页视频播放器,可在手机中播放),自定义Logo和右键菜单链接,支持MP3、MP4、FLV等格式,支持通过HTML5、FLash播放

    原版下载地址:http://www.jwplayer.com/ JW Player是世界上最流行的网页影音播放器,支持的视频格式主要有:MP4.FLV.F4V等格式,支持的音频格式主要有:MP3.AA ...

  2. 采集音频和摄像头视频并实时H264编码及AAC编码[转]

    0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...

  3. 采集音频和摄像头视频并实时H264编码及AAC编码

    转自:http://www.cnblogs.com/haibindev/archive/2011/11/10/2244442.html 0. 前言 我在前两篇文章中写了DirectShow捕获音视频然 ...

  4. 音频AAC编码浅析

    /* * unsigned long nSampleRate, // 采样率,单位是bps * unsigned long nChannels, // 声道,1为单声道,2为双声道 * unsigne ...

  5. C++实现RTMP协议发送H.264编码及AAC编码的音视频

    http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP ...

  6. C++实现RTMP协议发送H.264编码及AAC编码的音视频(转)

    C++实现RTMP协议发送H.264编码及AAC编码的音视频(转) RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia ...

  7. 【转】C++实现RTMP协议发送H.264编码及AAC编码的音视频

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

  8. RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

  9. html5页面怎么播放音频和视频

    html5页面怎么播放音频和视频 一.总结 一句话总结:html5 音频和视频标签:(audio And video),局限是不同浏览器对音频视频的格式支持很让人头痛 1.最基础的音频和视频标签的使用 ...

随机推荐

  1. 【翻译】Zakas解答Baranovskiy的JavaScript测验题

    原文:http://www.nczonline.net/blog/2010/01/26/answering-baranovskiys-javascript-quiz/ ---------------- ...

  2. uva1637Double Patience

    状态压缩,记忆化搜索. 用一个5进制数来表示每堆排到了哪一个位置.和2进制是一样的,不过不能用位运算. #include<cstdio> #include<algorithm> ...

  3. Qt之自定义界面(窗体缩放-跨平台终极版)

    简述 通过上一节内容,我们实现了窗体的缩放,功能很不错,但是很遗憾-不支持跨平台!如果对于多平台来说,这是一个硬伤,所以,我们急需要一个能够支持跨平台的实现方案. 在网上看到过很多不同的实现方式,多多 ...

  4. springMVC传对象参数、返回JSON格式数据

    假如请求路径:http://localhost/test/test.do?user.id=1 后台接收参数的方法如下: @RequestMapping("/test") publi ...

  5. UVa 10341 (二分求根) Solve It

    很水的一道题,因为你发现这个函数是单调递减的,所以二分法求出函数的根即可. #include <cstdio> #include <cmath> //using namespa ...

  6. Thread.sleep() & SystemClock.sleep()

    Thread.sleep()是java提供的函数.在调用该函数的过程中可能会发生InterruptedException异常. SystemClock.sleep()是android提供的函数.在调用 ...

  7. HTMLParser 解析HTML

    from html.parser import HTMLParser from html.entities import name2codepoint class MyHTMLParser(HTMLP ...

  8. dagli最早干了这样一件事儿 Localization of Cardiac-Induced Signal Change in fMRI

    Localization of Cardiac-Induced Signal Change in fMRI 这篇文章是最早做生理噪声相关组织的定位的. 很奇特,因为,这位学者甚至得出了,血管心动等变化 ...

  9. DataGuard相同SID物理Standby搭建

    Oracle Data Guard 是针对企业数据库的最有效和最全面的数据可用性.数据保护和灾难恢复解决方案.它提供管理.监视和自动化软件基础架构来创建和维护一个或多个同步备用数据库,从而保护数据不受 ...

  10. 【转】UITableView详解(UITableViewCell

    原文网址:http://www.kancloud.cn/digest/ios-1/107420 上一节中,我们定义的cell比较单一,只是单调的输入文本和插入图片,但是在实际开发中,有的cell上面有 ...