librtmp推流使用aac编码音频的html5和flash播放问题
公司项目中使用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播放问题的更多相关文章
- JW Player 6.7(网页视频播放器,可在手机中播放),自定义Logo和右键菜单链接,支持MP3、MP4、FLV等格式,支持通过HTML5、FLash播放
原版下载地址:http://www.jwplayer.com/ JW Player是世界上最流行的网页影音播放器,支持的视频格式主要有:MP4.FLV.F4V等格式,支持的音频格式主要有:MP3.AA ...
- 采集音频和摄像头视频并实时H264编码及AAC编码[转]
0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...
- 采集音频和摄像头视频并实时H264编码及AAC编码
转自:http://www.cnblogs.com/haibindev/archive/2011/11/10/2244442.html 0. 前言 我在前两篇文章中写了DirectShow捕获音视频然 ...
- 音频AAC编码浅析
/* * unsigned long nSampleRate, // 采样率,单位是bps * unsigned long nChannels, // 声道,1为单声道,2为双声道 * unsigne ...
- C++实现RTMP协议发送H.264编码及AAC编码的音视频
http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP ...
- C++实现RTMP协议发送H.264编码及AAC编码的音视频(转)
C++实现RTMP协议发送H.264编码及AAC编码的音视频(转) RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia ...
- 【转】C++实现RTMP协议发送H.264编码及AAC编码的音视频
RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...
- RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播
RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...
- html5页面怎么播放音频和视频
html5页面怎么播放音频和视频 一.总结 一句话总结:html5 音频和视频标签:(audio And video),局限是不同浏览器对音频视频的格式支持很让人头痛 1.最基础的音频和视频标签的使用 ...
随机推荐
- 谷歌上不了?hoststool一键搞定host 支持在线更新
https://hosts.huhamhire.com/ http://serve.netsh.org/pub/ipv4-hosts/
- MATLAB曲线绘制
一. 二维数据曲线图1.1 绘制 单根二维曲线plot 函数的基本调用 格式为:plot(x,y) 其中x和y为长度相同的向量,分别用于存储x坐标 和y坐标数据. 例1-1 在0≤x≤2p区间内,绘制 ...
- JVM学习笔记(三)------内存管理和垃圾回收
JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制.堆被划分为新生代和旧生 ...
- 创建支持复杂脚本Complex Scripts的WINCE6.0系统
如果要创建支持复杂脚本(Complex Scripts)的系统,我们需要完成下面一系列步骤来确保系统包含所有需要支持的具体区域设置 (locale–specific). 1. 选择intern ...
- 网站常见问题及解决方法(div/css)
18.<a> 在IE6,7 下面重新定义宽和高的代码:{ display:block; display:-moz-inline-stack; display:inline-block; ...
- bzoj2794
这题我得到一个经验,bool型的dp一定要想办法把bool去掉来表示更多的东西(1933也是这个道理) 暴力大家都会,这里有两个限制条件 一个限制条件我们可以排序不断加入,另一个呢 我们可以用f[i] ...
- HighChart图片本地导出
Highchart第三方图表控件,导出默认是从官方地址导出,这样在无外网的条件下则导致导出失败,改进如下: 后台导出代码: public partial class HighChart : Syste ...
- Only one instance of a ScriptManager can be added to the page.
一般出现在一个页面用了多个用户控件,而每个用户控件中都用到了ScriptManager,最好的办法是控件中不要加上 <asp:ScriptManager ID="Scr ...
- phonegap archive 报错 Cordova/CDVViewController.h' file not found
在BuildSettings->Header Search Paths 增加如下路径,问题解决 $(OBJROOT)/UninstalledProducts/include "$(O ...
- [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互
[Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...