1. 程式人生 > >EasyRTMP手機直播推送rtmp流flash無法正常播放問題

EasyRTMP手機直播推送rtmp流flash無法正常播放問題

問題簡介

EasyRTMP是EasyDarwin團隊開發的一套簡單易用的RTMP推送SDK。本文想講述下開發過程中遇到的一個問題。問題的現象是使用EasyRTMP推送音視訊流到自己搭建的nginx-rtmp伺服器,使用ffplay和vlc播放器都能夠正常播放,但是使用網頁flash播放時,總是會卡住,無法正常播放。

問題解決

開始時有些疑惑,因為ffplay在播放時都沒有提示任務警告等異常資訊,嘗試了多個網頁線上播放都是一樣的問題,認為問題肯定是在RTMP推送端。
首先想到的是遮蔽掉音訊,只推送視訊資料,再進行測試。結果讓我慶幸,遮蔽掉音訊後,果然一切正常。問題就出在音訊上,於是開始對AAC相關的部分進行一系列的排查。
網上搜索了一堆資料,分析了一開始的AAC header,以及ADTS頭部資料,都是正常的。具體分析過程可網上搜索,博主參考了

http://niulei20012001.blog.163.com/blog/static/7514721120130694144813/這篇。本文中提到需要去掉ADTS頭部再進行推送,於是又查了些資料,果然在傳送過AAC header之後,後面的AAC資料幀中需求去掉ADTS頭部。

於是加上了個程式碼判斷上層傳下來的資料是否已經包含ADTS,如果包含就去掉。

if (((data[0] & 0xFF) == 0xFF) && ((data[1] & 0xF0) == 0xF0) && (size > 7))
{
    data += 7;
    size -= 7
; }

去掉ADTS頭部後再次同時推送音視訊,果然所有播放器都可以正常播放,聲音也正常。

至此可以確定RTMP推送AAC資料時是需要去掉ADTS頭部的。

Github

獲取更多資訊

Copyright © EasyDarwin.org 2012-2016

EasyDarwin