Android RTMP直播的例子:CameraStreaming

jopen 9年前發布 | 114K 次閱讀 Android開發 移動開發 CameraStreaming

CameraStreaming 是一個Android(4.0以上)攝像頭實時輸出到RTMP服務器的直播演示

在網上找了一圈,關于Android 直播的實現,大都指向RTP/RTSP方式的直播。經過一番摸索,踩了不少坑。

  1. libstreaming 這個庫提供了一個很好的RTP/RTSP直播基礎。然而它在Android 5.0上不能使用,原因是Android5.0對于LocalSocket的使用做了安全限制。解決的辦法是改用ParcelFileDescriptor;
  2. RTMP協議的實現,在網上找的一個開源的實現,基本可以使用。關于RTMP協議的詳細信息可以閱讀一下rtmp_specification_1.0.pdf這里有一個blog介紹這個協議,也可以參考我另外開源的一個C++實現的RTMP客戶端
  3. MediaRecorder得到的MP4格式的視頻流其實并不適合直播的,因為,MP4文件會在文件技術的時候才寫入SPS(序列參數值)和 PPS(圖片參數集),而SPS和PPS是解碼的關鍵信息,我們直播的時候必須先發送SPS和PPS,后續的視頻流才能被服務器正確的接受和處理。參考了 libstreaming的做法:先錄一個小視頻存到sdcard,然后解析這個視頻文件,就能取得SPS和PPS,然后把著兩個參數保存到 Setting里頭,后面再次直播的時候就直接從Setting得到SPS和PPS。后續真正直播就直接使用這個SPS和PPS了(這里有個疑問:SPS 和PPS是固定的嗎?)
  4. 視頻流的封裝格式:4字節的長度(注意是big endian)接NALU數據,NALU的第一個字節是頭信息,它的語法如下:

    +---------------+
    |0|1|2|3|4|5|6|7|
    +-+-+-+-+-+-+-+-+
    |F|NRI|  Type  |
    +---------------+
  5. 音頻流格式:

  6. RTMP的一些限制:目前測試的結果發現(沒有找到相關的規范):
    • 必須使用44.1K的采樣率
    • 必須使用雙通道立體聲格式
    • 必須使用16位的編碼深度。

項目主頁:http://www.baiduhome.net/lib/view/home/1449997851726

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!