1. 程式人生 > 其它 >Android直播實現(Android端推流、播放)

Android直播實現(Android端推流、播放)

最近想實現一個Android直播,但是對於這方面的資料都比較零碎,一開始是打算用ffmpeg來實現編碼推流,在蒐集資料期間,找到了幾個強大的開源庫,直接避免了jni的程式碼,整合後只用少量的java程式碼就可實現編碼、推流和取流播放,整理了一下做了一個demo,在這裡記錄一下

效果圖:

編碼和推流,有兩個方案選擇:

一:
使用javacv來實現,最終也是用過ffmpeg來進行編碼和推流,javacv實現到可以直接接收攝像頭的幀資料
需要自己實現的程式碼只是開啟攝像頭,寫一個SurfaceView進行預覽,然後實現PreviewCallback將攝像頭每一幀的資料交給javacv即可
javacv地址:

https://github.com/bytedeco/javacv
demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master

二:
使用Android自帶的編碼工具,可實現硬編碼,這裡有一個國內大神開源的封裝很完善的的庫yasea,第一種方法需要實現的Camera採集部分也一起封裝好了,進行一些簡單配置就可以實現編碼推流,並且yasea目前已經直接支援攝像頭的熱切換,和各種濾鏡效果
yasea地址(內建demo):https://github.com/begeekmyfriend/yasea

伺服器

流媒體伺服器我用的是srs,專案地址:https://github.com/ossrs/srs


關於srs的編譯、配置、部署、在官方wiki中已經寫的很詳細了,並且srs同樣是國內開發人員開源的專案,有全中文的文件,看起來很方便
這裡有最基本的簡單編譯部署過程Android直播實現(二)srs流媒體伺服器部署

播放器

android端的播放使用vitamio,還是國內的開源播放器,是不是感覺國內的前輩們越來越屌了^~^!
vitamio支援幾乎所有常見的的視訊格式和流媒體協議
vitamio地址(內建demo):https://github.com/yixia/VitamioBundle

這裡使用的是yaesa庫,先介紹一下直播實現的流程:
一:使用yaesa進行攝像頭採集、編碼然後向srs伺服器rtmp推流
二:部署srs流媒體伺服器
三:使用vitamio取流播放

編碼和推流已經整合在一起,demo地址:https://github.com/SiKang123/LiveTest


yaesa推流:

首先 clone yesa原始碼,匯入library庫

  1. //佈局檔案中實現
  2. <net.ossrs.yasea.SrsCameraView
  3. android:id="@+id/glsurfaceview_camera"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"/>
  1. //java程式碼 需要實現介面 implements SrsEncodeHandler.SrsEncodeListener, RtmpHandler.RtmpListener, SrsRecordHandler.SrsRecordListener
  2. SrsCameraView cameraView = (SrsCameraView) findViewById(R.id.glsurfaceview_camera)
  3. mPublisher = new SrsPublisher(cameraView);
  4. //編碼狀態回撥
  5. mPublisher.setEncodeHandler(new SrsEncodeHandler(this));
  6. mPublisher.setRecordHandler(new SrsRecordHandler(this));
  7. //rtmp推流狀態回撥
  8. mPublisher.setRtmpHandler(new RtmpHandler(this));
  9. //預覽解析度
  10. mPublisher.setPreviewResolution(1280, 720);
  11. //推流解析度
  12. mPublisher.setOutputResolution(720, 1280);
  13. //傳輸率
  14. mPublisher.setVideoHDMode();
  15. //開啟美顏(其他濾鏡效果在MagicFilterType中檢視)
  16. mPublisher.switchCameraFilter(MagicFilterType.BEAUTY);
  17. //開啟攝像頭,開始預覽(未推流)
  18. mPublisher.startCamera();
  19. //mPublisher.switchToSoftEncoder();//選擇軟編碼
  20. mPublisher.switchToHardEncoder();//選擇硬編碼
  21. //開始推流 rtmpUrl(ip換成伺服器的部署ip):"rtmp://192.168.31.126/android/teststream"
  22. mPublisher.startPublish(rtmpUrl);

關鍵程式碼就這麼幾句(狀態回撥有很多這裡就不貼了,可以看demo),剩下的交給yasea,編碼推流就搞定了,是不是簡單到懷疑人生?


vitamio取流播放

首先還是clone vitamio的原始碼,匯入vitamio庫

  1. /*首先不要忘了在Manifest裡註冊InitActivity*/
  2. <activity
  3. android:name="io.vov.vitamio.activity.InitActivity"
  4. android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
  5. android:launchMode="singleTop"
  6. android:theme="@android:style/Theme.NoTitleBar"
  7. android:windowSoftInputMode="stateAlwaysHidden" />
  8. /*佈局檔案*/
  9. <io.vov.vitamio.widget.VideoView
  10. android:id="@+id/surface_view"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content" />
  1. /*java程式碼*/
  2. /*onCreate中,用於檢查vitamioLibs庫是否準備完成
  3. *如果Manifest中沒有初始化InitActivity,這裡會返回false,並自動初始化InitActivity
  4. */
  5. if (!LibsChecker.checkVitamioLibs(this))
  6. return;
  7. VideoView mVideoView=(VideoView) findViewById(R.id.surface_view);
  8. /*會有幾秒延時*/
  9. mVideoView.setVideoPath(rtmpUrl);

然後就可以開始愉快的播放rtmp流了,是不是簡單到令人髮指?

關鍵程式碼就這麼多,具體程式碼可以看看demo:https://github.com/SiKang123/LiveTest

--------------------- 作者:Si-Kang 來源:CSDN 原文:https://blog.csdn.net/Mr_Sk/article/details/71083366?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!