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.最基础的音频和视频标签的使用 ...
随机推荐
- C#中默认的修饰符
参考自Default visibility for C# classes and members (fields, methods, etc)? Classes and structs that ar ...
- Android 面试题(经典)
1.Actvity的生命周期,生命周期中的onCreate与onResume有什么区别 Activity的生命周期有:onCreate,onStart,onRestart,onResume,onPau ...
- struts2 获取前台表单的值?? 原理??
struts2中,在ACTION中申明一个变量 private string 变量名:然后设置变量名 的get/set方法: 在运行的时候struts2会自动获取. 比如:jsp 页面中有个文本框&l ...
- error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC解决办法
使用qtcreator加androidndk编译项目时报错: error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; r ...
- ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking
#!/bin/sh # # ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking # 说明: # 本文主要对TI的sdk中的s ...
- FFMPEG 库移植到 VC 需要的步骤
在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷贝到工程中就行了,还需要做以下几步.(此方法适用于自己使用MinGW编译的库,也同样适用于从网上下载的编译好的库,例如http: ...
- 转载RabbitMQ入门(6)--远程调用
远程过程调用(RPC) (使用Java客户端) 在指南的第二部分,我们学习了如何使用工作队列将耗时的任务分布到多个工作者中. 但是假如我们需要调用远端计算机的函数,等待结果呢?好吧,这又是另一个故事了 ...
- delphi 注册 dcc70.dll
@echo 开始注册copy dcc70.dll %windir%\system32\regsvr32 %windir%\system32\dcc70.dll /s@echo dcc70.dll注册成 ...
- delphi 转换sql server 中的 bit类型
FieldByName('e').AsBoolean = false 其中e为 sql server 中的bit类型.
- 【转】SDP file
SDP file Introduction The Session Description Protocol (SDP) is a format for describing the initiali ...