Flash基础入门之librtmp推流使用aac编码音频的html5和flash播放问题
小标 2019-01-24 来源 : 阅读 1530 评论 0

摘要:本文主要向大家介绍了Flash基础入门之librtmp推流使用aac编码音频的html5和flash播放问题,通过具体的内容向大家展现,希望对大家学习Flash基础入门有所帮助。

本文主要向大家介绍了Flash基础入门之librtmp推流使用aac编码音频的html5和flash播放问题,通过具体的内容向大家展现,希望对大家学习Flash基础入门有所帮助。

公司项目中使用rtmp推流,音频编码aac、视频编码H264。windows和android平台都没有发现问题。然而在IOS版本的APP中发现几个问题:1. 推流后flash播放异常2. IOS平台微信分享后html5播放异常但是在PC上播放正常,android平台上html5播放正常。
经过两天的钻研,发现问题如下:1. rtmp建立连接的时候先发送音视频相关参数。或者第一帧发送的数据应该如下:

 1 m_pPacketAudio->m_nChannel = 0x04;
 2 m_pPacketAudio->m_headerType = RTMP_PACKET_SIZE_LARGE;
 3 m_pPacketAudio->m_nTimeStamp = 0;
 4 m_pPacketAudio->m_nInfoField2 = m_pRtmp->m_stream_id;
 5 m_pPacketAudio->m_hasAbsTimestamp = 0;
 6 
 7 char * szBodyBufferAudio = m_pPacketAudio->m_body;    
 8 /*
 9 [UB4]:10,soundformat:aac
10 [UB2]:3,sample reate,44k
11 [UB1]:1,bitspersample,16bit
12 [UB1]:1,channel,2
13 */
14 szBodyBufferAudio[ 0] = 0xAF;
15 //AACPacketType,[UI8],0:AAC sequence header
16 szBodyBufferAudio[ 1] = 0x00;
17 //AudioSpecificConfig,2 byte
18 //for AAC LE
19 //44k ,2-ch aac-lc
20 szBodyBufferAudio[ 2] = 0x12;
21 szBodyBufferAudio[ 3] = 0x10;
22 m_pPacketAudio->m_nBodySize = 4;
23 m_pPacketAudio->m_packetType = RTMP_PACKET_TYPE_AUDIO;
24 RTMP_SendPacket(m_pRtmp, m_pPacketAudio, 0);

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

 1 if(dwType == PACKET_VIDEO)
 2 {
 3     // ......
 4     //RTMP_SendPacket(m_pRtmp, m_pPacketVideo, 0);
 5     // ......
 6 }
 7 else if(dwType == PACKET_AUDIO)
 8 {
 9     char  * szBodyBufferAudio = m_pPacketAudio->m_body;
10     /*    [UB4]:10,soundformat:aac
11     [UB2]:3,sample reate,44k
12     [UB1]:1,bitspersample,16bit
13     [UB1]:1,channel,2
14     */
15     
16     // 以下两行是最关键的两行
17     lDataSize -= 7;
18     pFrameData += 7;
19     szBodyBufferAudio[ 0] = 0xAF;
20     //AACPacketType,[UI8],1:Raw AAC frame data
21     szBodyBufferAudio[ 1] = 0x01;
22     m_pPacketAudio->m_nBodySize = lDataSize + 2;
23     m_pPacketAudio->m_nChannel = 0x04;
24     m_pPacketAudio->m_headerType = RTMP_PACKET_SIZE_MEDIUM;
25     m_pPacketAudio->m_nInfoField2 = m_pRtmp->m_stream_id;
26     m_pPacketAudio->m_hasAbsTimestamp = 0;
27     //memcpy(szBodyBufferAudio + 2, pFrameData, lDataSize);
28     //RTMP_SendPacket(m_pRtmp, m_pPacketAudio, 0);
29 
30     CMQueueUnit* pQu = m_pSendBuffer->StartWrite();
31     if(pQu)
32     {
33         MByte* pBuf = pQu->GetBuf();
34         if(pBuf){
35             memcpy(pBuf, m_pPacketAudio, sizeof(RTMPPacket));
36             ((RTMPPacket*)pBuf)->m_body = (char*)(pBuf + sizeof(RTMPPacket) + RTMP_MAX_HEADER_SIZE);
37             memcpy(((RTMPPacket*)pBuf)->m_body,  szBodyBufferAudio, 2);
38             memcpy(((RTMPPacket*)pBuf)->m_body + 2, pFrameData, lDataSize);
39             m_pSendBuffer->EndWrite(pQu, TRUE);
40         }
41         else
42             m_pSendBuffer->EndWrite(pQu, FALSE);
43     }
44 
45 #ifdef WIN32
46     m_dwRemainTimes += (21995464);
47     m_pPacketAudio->m_nTimeStamp += 23;
48 #elif defined __IPHONE__
49     m_dwRemainTimes += (21995464);
50     m_pPacketAudio->m_nTimeStamp += 23;
51 #else
52     m_dwRemainTimes += (21995464/2);
53     m_pPacketAudio->m_nTimeStamp += 11;
54 #endif            
55     if(m_dwRemainTimes>100000000)
56     {
57         m_pPacketAudio->m_nTimeStamp += 1;
58         m_dwRemainTimes -= 100000000;
59     }
60 
61     m_dwOldTimeStamp = CMHelpFunc::GetCurTimeStamp();
62 }

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

 1 if( lOutSize == 0 || lOutSize > m_lVFrameOutBuffSize )
 2 {
 3     LOGE( "Encoding one video frame failed 2 (%d)", res );
 4     res = MV2_ERR_MEDIASTREAM_VIDEOENCODE;
 5     return res;
 6 }
 7 else
 8 {
 9     MByte * pRawData = m_pVFrameOutBuff;
10     
11     // 以下几句一定要注释
12 //    if(bIsSyncFrame)//first frame ,skip sps/pps header,length is 22,NAL header,length:4
13 //    {
14 //        lOutSize -= 26;
15 //        pRawData += 26;
16 //        m_bFirstVF = MFalse;
17 //    }
18 //    else
19 //    {
20 //        /*just skip NAL Header: 4 byte*/
21 //        lOutSize -= 4;
22 //        pRawData += 4;
23 //    }
24     
25     if( m_pRtmp )
26         res = m_pRtmp->SendMediaData( pRawData, lOutSize, PACKET_VIDEO, bIsSyncFrame );
27 }

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

以上就介绍了Flash的相关知识,希望对Flash有兴趣的朋友有所帮助。了解更多内容,请关注职坐标常用软件Flash频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程