公司项目中使用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. [转载]浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  2. Oracle Create DBLink

    DROP PUBLIC DATABASE LINK ORA11G_DBLINK; CREATE   PUBLIC   DATABASE LINK ORA11G_DBLINKCONNECT TO SYS ...

  3. Android开发之创建App Widget和更新Widget内容

    App WidgetsApp Widgets are miniature application views that can be embedded in other applications (s ...

  4. iOS开发:在Swift中调用oc库

    先列举这个工程中用到的oc源码库: MBProgressHUD:半透明提示器,Loading动画等 SDWebImage:图片下载和缓存的库 MJRefresh: 下拉刷新,上拉加载 Alamofir ...

  5. ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中

     参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-th ...

  6. ASP.NET缓存OutputCache和Response.Cache之C#后台设置

    一.ASPX页面缓存页面缓存的使用方法非常的简单,只需要在aspx页的顶部加一句声明<%@ OutputCache Duration="60" VaryByParam=&qu ...

  7. C# 编写的串口通信程序

    如果,翻看我之前的博客,会找到一篇用I/O模拟IIC通信的程序文章.好吧,如果找不到可以点击这里,这里就不在赘述了,系统也已经完全调试通过了. 今天的任务是,把测试得到的数据在上位机的界面上显示出来, ...

  8. OK335xS dhcpcd porting

    /********************************************************************** * OK335xS dhcpcd porting * 说 ...

  9. linux下/etc/passwd和/etc/shadow文件

    /etc/passwd文件中保存的是用户的账号信息,而/etc/shadow文件中保存的是用户的口令信息. 一 /etc/passwd 一个用户对应着该文件中一行记录,一行记录由若干个字段组成,字段之 ...

  10. 【Unity3D】枪战游戏—弹孔设置

    以子弹为原点,发射射线,如果射线检测到障碍物,则返回射线与障碍物的碰撞点 在该点处实例化出弹孔贴图 void Update () { transform.Translate (Vector3.forw ...